프로세스란?
프로세스는 실행 중에 있는 프로그램을 의미합니다. 프로그램은 디스크나 다른 저장소에 저장되어 있는 코드로 된 실행 가능판 것을 의미하고 프로세스는 프로그램을 실행시켜 메모리에 올려진 상태를 말합니다. 같은 프로그램을 여러 번 실행시키면 프로그램은 하나지만 프로세스는 여러 개가 생깁니다.
프로그램이 동작하러면 운영체제가 프로세스들을 관리하기 위하여 각 프로세스마다 정보를 매깁니다. 이 정보에는 PC, 레지스터, 메모리, 프로세스 IP, 부모 프로세스, 프로세스의 현재 상태 등이 있습니다.
프로세스의 메모리 형태
프로세스는 자기만의 고유 메모리를 가지고 있습니다. 이 고유 메모리는 논리적으로 형성되어 있으며 각 영역에 해당되는 정보들이 실제 물리적 메모리 공간에 할당이 됩니다.
- Stack 영역(Stack segment) : 정적 메모리 영역이며 함수가 실행되는 동안 아랫방향으로 자라며 위에서 아래로 내용이 기록됩니다.
- Heap 영역 : 동적 메모리 영역이며 아래에서 위로 자라납니다.
- Data segment : 전역변수가 저장되는 공간입니다.
- Text Segment : 2진수 기계어로 번역된 코드가 이 공간에 저장되어 있습니다.
프로세스의 상태
프로세스는 총 5가지의 상태를 가집니다. 보통 순차적으로 진행되며 종료 전까지는 ready, running, waiting 단계를 반복합니다. 멀티 태스킹 등을 위해 운영체제는 각 프로세스별로 이러한 상태를 정의하고 상태 전이를 통해 다음 단계로 넘어갈 수 있도록 관리합니다.
- New : 프로세스가 새로 생성됩니다. 보통 fork 함수로 새로운 프로세스가 만들어집니다.
- Ready : 프로세스가 실행되기 전 기다리는 단계에 있는 상태입니다. 스케쥴링에서 사용되는 Ready Queue 라는 곳에 있습니다. Waiting 상태에서 Ready로 넘어가는 상태 전이를 Wakeup이라 부르며 입출력 등 이벤트가 종료되어 다음 명령을 실행할 수 있게 되면 Ready Queue로 들어가게 됩니다. Runnging 상태에서 Ready로 상태 전이를 하는 경우는 운영체제가 한 프로세스가 CPU를 지속해서 점유하지 못하도록 일정 시간을 두고 이 시간을 넘게 되면 Preempted 되어 Ready Queue로 들어가게 됩니다.
- Running : 프로세스의 명령어들이 실행되고 있는 단계입니다. CPU내의 코어(=프로세서)에는 단 하나만의 프로세스가 실행됩니다. Ready에서 Running으로 넘어가는 상태 전이를 Dispatch 혹은 Scheduled라고 부르며 Ready Queue의 맨 앞에 있던 프로세스가 CPU를 점하게 됩니다. Dispatcher가 이 상태 전이를 수행합니다.
- Waiting : 프로세스가 어떤 이벤트를 기다리는 상태입니다. Blocked 상태라고도 부릅니다. 다른 프로세스의 응답을 기다리거나 느린 입출력을 기다리는 시간동안 다른 프로세스가 실행될 수 있도록 Waiting queue에서 이벤트를 기다립니다. Running 단계에서 Waiting 단계로 넘어가는 상태 전이를 Block으로 부르며 프로세스가 허가된 시간을 다 쓰기 전에 입출력 등 이벤트 동작을 필요로 하는 경우 프로세스는 CPU를 스스로 반납하고 Waiting 단계로 넘어갑니다.
- Terminated : 프로세스가 실행을 마치고 정상적으로 종료되거나 zombie state가 된 상태입니다.
각 단계에서 다음 단계로 넘어갈 시 현재 프로세스의 상태를 기록해둬야 다음 시간에 실행이 가능합니다. 다음 수행할 명령어 PC, 레지스터, 쓰레드 등 정보를 담아두어야 합니다. 이러한 프로세스 상태는 각각 프로세스가 가지고 있는 Process control block PCB에 기록되어 있습니다.
Process control block
커널에서 프로세스를 나타내기 위한 하나의 자료구조입니다. 프로세스를 관리할 수 있도록 각 프로세스 고유의 정보들을 담고 있습니다. 보통 1KB 정도의 크기를 가집니다.
위에서 설명한 프로세스 상태, 다음 수행할 명령어 위치를 나타내는 Program Counter(PC), 레지스터 정보, 스케쥴링 정보, 메모리 정보, CPU 시간 사용과 프로세스 고유의 번호 PID, 입출력이 행해지는 파일 리스트 등을 담고 있습니다.
- Process ID(PID) : 운영체제 커널이 프로세스를 관리하기 위해 개별적으로 매겨둔 번호로 우선순위를 조정하거나 종료 등의 명령에 사용됩니다.
- 프로세스 상태 : 위에서 설명한 상태중 현재 프로세스의 상태를 나타냅니다.
- 프로그램 카운터(PC) : 현재 프로세스가 다음에 수행할 명령어의 위치를 나타냅니다. 보통 다음 상태로 넘어가는 경우 현재 수행중인 명령어를 마친 후 상태 전이가 일어나므로 이를 위해 다음 수행할 명령어를 가리키고 있습니다.
- 메모리 정보 : 해당 프로세스가 사용하는 메모리의 주소를 가지고 있습니다.
- 레지스터 정보 : 메모리는 프로세스마다 고유의 위치를 가지지만 레지스터는 CPU당 존재하며 속도를 위해 작은 공간을 사용하기 때문에 이를 기록 해 두어야 다시 실행될 수 있습니다.
- 스케줄링 정보 : 해당 프로세스의 우선순위, 최종 실행 시각, CPU 점유시간 등 멀티 프로세싱과 한 프로세스가 긴 시간을 점유하지 못하도록 관리하기 위해 사용됩니다.
- 프로세스 계정 : 뒤에 배울 페이지 테이블, 스케줄링에 사용되는 큐의 주소, 소유자, 주소 등 프로세스 자체의 정보입니다.
- I/O 정보 : 프로세스가 사용하는 입출력 장치, 파일 등의 목록입니다.
'스터디 > 운영체제' 카테고리의 다른 글
[운영체제] Scheduling (0) | 2021.01.22 |
---|---|
[운영체제] Context Switch (0) | 2021.01.16 |
[운영체제] OS 디자인과 구현 (0) | 2021.01.05 |
[운영체제] 시스템 콜과 인터럽트 (5) | 2021.01.04 |
[운영체제] Intro (0) | 2021.01.02 |