http://bowbowbow.tistory.com/16
프로세스와 프로그램의 차이는 정말 명확하다.
프로그램 자체는 생명이 없다.
프로그램은 보조기억장치(하드디스크, SSD)에 존재하며 실행되기를 기다리는 명령어(코드)와 정적인 데이터의 묶음이다.
이 프로그램의 명령어와 정적 데이터가 메모리에 적재되면 생명이 있는 프로세스가 된다.
.
즉, 프로세스란 실행중인 프로그램이다.
컴퓨터의 세상에서 여러개의 프로세스가 동시에 실행되는건 놀라운 일이다.
하나의 CPU 즉, 프로세서는 한 순간에 하나의 프로세스만 실행할 수 있다.
프로세스가 동시에 여러개가 실행될 수 있는 이유는 운영체제가 엄청나게 빠르게 CPU가
실행할 프로세스를 교체하고 있기 때문이다.
운영체제는 사용자에게 이렇게 동시에 여러개의 프로세스가 실행되고 있다는 환상을 제공한다.
또 개발자는 이런 운영체제 덕분에 프로세스의 교체와 사용할 수 있는 CPU 자원에 대해
신경쓰지 않고 프로그램 개발에 온전히 집중할 수 있다.
그럼 어떻게 운영체제는 프로세스를 교체하고 있을까?
중간에 실행 흐름을 끊고 교체되고 있는데도
프로세스는 마치 계속해서 실행되는 것처럼 작동될까?
프로세스의 구성
프로세스에 대한 정보는 프로세스 제어블록(PCB, Process Control Block)또는 프로세스 기술자(process descriptor)라고
부른는 자료구조에 저장이 된다. 대부분 PCB라고 부른다.
이 자료구조는 다음과 같은 정보가 담긴다.
-PID: 운영체제가 각 프로세스를 식별하기 위해 부여된 프로세스 식별번호 Process Identificatino
-프로세스 상태: CPU는 프로세스를 빠르게 교체하면서 실행하기 때문에 실행중인 프로세스도 있고 대기중인 프로세스도 있다.
그런 프로세스의 상태를 저장한다.
-프로그램 카운터: CPU가 다음으로 실행할 명령어를 가리키는 값이다. CPU는 기계어를 한 단위씩 읽어서 처리하는데 프로세스를 실행하기 위해 다음으로 실행할 기계어가 저장된 메모리 주소를 가리키는 값이다.
-스케줄링 우선순위: 운영체제는 여러개의 프로세스를 동시에 실행하는 환상을 제공한다. 운영체제가 여러 개의 프로세스가 CPU에서 실행되는 순서를 결정하는 것을 스케줄링이라고 한다. 이 스케줄링에서 우선순위가 높으면 먼저 실행될 수 있는데 이를 스케줄링 우선순위라고 한다.
-권한: 프로세스가 접근할 수 있는 자원을 결정하는 정보이다.
-프로세스의 부모와 자식 프로세스: 최초로 생성되는 init프로세스를 제외하고 모든 프로세스는 부모 프로세스를 복제해서 생성되고 이 계층관계는 트리를 형성한다. 그래서 각 프로세스는 자식 프로세스와 부모 프로세스에 대한 정보를 가지고 있다
-프로세스의 데이터와 명령어가 있는 메모리 위치를 가리키는 포인터-프로세스는 실행중인 프로그램이다. 따라서 프로그램에 대한 정보를 가지고 있어야 한다. 프로그램에 대한 정보는 프로세스가 메모리에 가지는 자신만의 주소 공간에 저장된다. 이 공간에 대한 포인터값을 가진다.
-프로세스에 할당된 자원들을 가리키는 포인터-프로세스가 실행상태에서 마지막으로 실행한 프로세서의 레지스터 내용을 담고 있다.CPU에 의해 실행되는 프로세스는 운영체제에 의해 계속 교체되는데 교체되었다가 다시 자신의 차례가 되어서 실행될때 중단된적없고 마치 연속적으로 실행된 것처럼 하기 위해 이 레지스터 정보를 가지고 있다.
프로세스가 접근 할 수 있는 메모리 공간
PCB의 구성 요소중 프로세스의 데이터와 명령어가 있는 메모리 위치를 가리키는 포인터를 자세히 설명하겠습니다. 프로세스의 데이터와 명령어가 있는 메모리
는 구체적으로 어떻게 구성되어 있을까요?
이 주소 공간은 Text, Data, BSS, Heap, Stack 영역으로 구성됩니다. 아래 그림에서 각 영역에 프로그램의 어떤 정보를 저장하는지 나타냈습니다.
프로세스의 메모리 공간
스택영역과 힙영역 사이에 빈 공간이 보이나요? 컴파일 타임에 지역변수를 얼마나 사용할지 미리 계산할 수 없기 때문에 런타임에 지역변수 선언 순서에 따라 스택영역은 위쪽으로 주소 값을 매기고 동적 할당될때 힙영역은 아래쪽으로 주소값을 매깁니다.
'잡다한 INFORMATION' 카테고리의 다른 글
아스키코드 (0) | 2016.09.25 |
---|---|
GUI와 CLI (0) | 2016.09.06 |
터미널, 쉘, 콘솔 (0) | 2016.09.06 |
임베디드 (0) | 2016.09.06 |
x86 x64 (0) | 2016.09.05 |