이 글은 포스텍 박찬익 교수님의 운영체제(CSED312) 강의를 기반으로 재구성한 것입니다.
이 글은 process에 대해 살펴본다.
Process
process는 program의 instance이다.
Program
program은 disk에 있는 instruction들의 집합이다.
소스코드 .c 파일은 컴파일을 거쳐 .s 파일이 되고, 어셈블러를 거쳐 .o 파일이 되고, linker가 이들을 모아 executable file인 .out 파일이 된다. 이 .out 파일이 program이다.
Instance
program을 실행하면 해당 파일 내에 있는 instruction과 data를 메모리에 올리며, 이렇게 메모리에 올라가 실행 중인 프로그램이 하나의 instance, 즉 process이다. 메모리에 올리는 과정에서 instruction과 data를 메모리에 복사하기 때문에 한 program으로 여러 개의 process을 만들 수 있다.
Memory Segments
메모리에 올라간 process는 위처럼 크게 4가지 영역을 가지며, 버그 또는 악의적 공격을 대비해 항상 제한된 privilege로 실행된다.
- stack - local variable, argument, return address 등이 올라간다.
- heap - 동적할당한 것들이 올라간다.
- global data/code - 초기화된 global variable이 올라간다.
- code - instruction들이 올라간다.
code와 data를 분리하는 이유는 code는 공격을 대비해 read-only여야 하고, stack과 heap이 반대 방향으로 늘어나는 이유는 두 영역이 최대한 겹치지 않고 많이 늘어날 수 있게 하기 위함이다.
Process의 구조
OS는 program을 실행하던 중에 발생하는 모든 interrupt와 exception은 해당 program의 결과이기 때문에 이것들을 처리해야 한다. 즉, exception이나 interrupt handler는 program과 같은 context 내에서 실행되지만 stack은 kernel stack의 것을 사용한다. 참고 : Operating System Overview
Process의 구성요소
execution thread와 address space가 있다.
- execution thread : thread들의 실행 순서.
- address space : 실행 환경. CPU, register, main memory, I/O device 등등에 대한 접근 권한이 필요하다.
OS Orchestration
OS는 모든 동작을 관리하며, 이 모든 것들이 특정 process context에서 수행된다. 관리하는 것들은 다음과 같다.
- 프로그램 로드 및 실행
- interrupt 및 exception handling
- 무한루프 방지를 위한 CPU 관리 (timer 이용)
- memory address space나 access control 등의 정보 접근 제한 및 protection
- CPU scheduling, memory allocation 등 자원 관리
Process Control Block
Process Control Block, PCB는 process context를 저장하기 위한 data structure이다. 포함하고 있는 정보는 아래와 같다.
- process management info
- process state (ready / running / blocked)
- register, program counter
- stack, code, data segment
- parent, child process 등
- memory management info
- segment, page table 등
- I/O와 file management info
- port, working directory, file descriptor 등
Process Operation
제일 기본적인 것은 다음과 같다.
- create / termination : exec(), fork(), wait(), kill,
- signal : action(), return(), handler()
- operation : block(), yield()
Process Creation
모든 process는 parent-child 관계에 있기 때문에 tree를 만든다. 또한, 각 process는 identical한 process id, PID를 가지고 있다. process 생성 시 parent가 child에게 모든 resource와 privilege를 공유한다.
제일 중요한 점은, 각 process는 concurrently하게 실행되며, parent process는 child process가 terminated될 때까지 기다린다는 것이다.
만드는 방법에는 creation과 clone 2가지 방법이 있다.
- creation : 비어있는 새로운 process를 만드는 방법. code, data, stack 영역 등 모든 것을 초기화한 상태로 만든다.
- clone : 현 process를 멈추고 state를 저장하고, 현재 code, data, stack, OS state를 복사한다. 이후 OS의 ready-list queue에 push한다.
- 이 때 최적화로 read only인 code segment는 공유하고, data의 경우 copy on write policy를 적용한다. 참고 : copy-on-write
fork()
unix에서 일반적으로 fork() 함수를 사용해 process를 생성한다. fork() 함수는 특이하게 1번 호출되면 2번 return한다. 1번은 생성된 child process에서 0을 리턴하고, 한 번은 parent process에서 child process의 PID를 리턴한다. 참고
Process Termination
exit() sytem call을 호출해 해당 process를 종료한다. 이 때 PCB에 해당 process의 exit status code가 있기 때문에 PCB를 제외하고 모두 다 release시킨다. 따라서 PCB는 계속 메모리에 올라가 있는 상태다.
Zombie Process
parent process가 wait()를 호출했을 때, child process가 exit()되어 PCB만 남은 상태라면 PCB로부터 exit status code를 가져오고 PCB를 release한다. 만약 child process가 terminate가 아니라면 parent process를 block시킨다.
이 때 parent process가 wait()를 호출하기 전까지 child process PCB가 계속 남아있기 때문에 child process가 orphan process, zombie process가 된다. 이러한 상황을 막기 위해 parent process는 wait()를 호출하거나, 명시적으로 kill()을 호출해야 한다.
Unix 예제
- process가 fork()를 call한다. 해당 process는 parent process가 되고, clone된 child process가 생긴다.
- parent process는 wait()를 call해서 child process가 exit()할 때까지 block으로 변한다.
- child process가 exec()를 call한다.
- exec() 내부에는 exit()이 있어 child process가 PCB만 남기고 정리된다.
- 2. 에서 불러진 wait()의 나머지 작업, child process PCB를 정리한다.
만약 parent process가 wait()를 call하기 전에 종료된다면 child process는 orphan이 되어 zombie process가 될 것이다.
Process State
process state는 크게 ready, running, block 3가지가 있으며 이들의 상태 변환은 위 그림과 같다.
- running : 현재 실행 중인 process
- ready : CPU의 실행을 기다리고 있는 상태
- block : I/O나 resource 대기 등의 이유로 event를 기다리고 있는 상태
Block / Yield
현재 process를 실행했을 때 file open과 같이 오래 기다려야 한다고 예상되는 경우 해당 process를 더 이상 실행하지 못한다고 본다. 이 경우 yield를 통해 해당 process를 block state로 넘긴다.
Process Context Switch
process는 동시에 여러 개가 존재할 수 있는 반면 CPU의 개수는 한정적이다. 이러한 상황에서 concurrency를 만족시키고, 여러 process를 실행하기 위해 CPU는 process를 돌아가면서 번갈아 실행한다.
이 때 각 process의 모든 내용(register, process state 등등)이 변하지 않은 상태로 process 전환이 이루어져야 하며, 이 과정을 process context switch라고 한다. 참고 : Process Control
위 그림은 process context switch의 흐름을 나타낸다. P0에서 P1으로 이동할 때, P0의 모든 state, register 등등을 PCB0에 저장하고, PCB1에서 P1의 모든 state를 꺼내온다.
Context Switch Cost
context switch cost는 direct cost와 opportunity cost가 있다.
- direct cost : save/register하는 데 걸리는 시간
- opportunity cost : cache 변경으로 인한 cost이다.
Process Scheduling
process state는 크게 running, ready, block 3가지가 있다고 했다. 이러한 process state 전환 관리를 process scheduling이라고 한다.
Process Queue
OS는 process queue에 process들을 넣어서 process state를 관리하며, process queue는 다음과 같은 queue들로 구성되어 있다.
- job queue : 모든 process가 들어간다.
- ready queue : ready state인 process가 들어간다.
- wait queue : block state인 process가 들어간다. I/O wait, signal wait, sleep wait 등 여러 이유로 들어간다.
Process Scheduler
종류는 아래 3가지가 있다.
- long term scheduler : disk에 있는 process를 메모리에 load한다. (process creation와 유사하다.)
- 추가적으로 degree of multiprogramming(메모리에 올라가 있는 process 개수, 즉 동시에 실행하는 process 개수)를 관리한다. 최적의 degree of multiprogramming을 유지하기 위해 [I/O를 더 많이 사용하는 process]와 [CPU를 더 많이 사용하는 process]의 균형을 잘 맞춰야 한다.
- mid term scheduler : swapping을 관리한다.
- short term scheduler : ready queue에서 다음에 실행할 process를 선정해 CPU에 할당하고, context switching을 관리한다. 매우 자주 불리며, 따라서 빨라야 한다.
잘못된 내용이나 지적, 오탈자 등은 언제나 환영합니다.
'CS > OS' 카테고리의 다른 글
[OS] Synchronization - Lock, Condition Variable, Semaphore (0) | 2023.07.01 |
---|---|
[OS] Concurrency & Thread (0) | 2023.06.29 |
[OS] Operating System Overview (0) | 2023.06.25 |
[컴퓨터 SW] Dynamic Memory Allocation (0) | 2023.06.24 |
[컴퓨터 SW] Virtual Memory (0) | 2023.06.21 |