[Operating Systems] Process (1)
프로세스의 개념
프로세스
프로세스의 문맥(context)
- CPU 수행 상태를 나타내는 하드웨어 문맥
- Program Counter : 다음 실행될 명령을 가리키는 register. (instruction pointer, IP라고도 함.)
- 각종 register
- 프로세스의 주소 공간
- 프로세스 관련 커널 자료 구조
- PCB (Process Control Block)
- Kernel stack
- kernel stack에는 프로세스 별로 stack이 따로 존재한다. 관리의 수월함(?)을 위해서.
프로세스의 상태
- Running
- CPU를 잡고 instruction을 수행중인 상태
- Ready
- CPU를 기다리는 상태. (프로그램이 메모리에 올라가 있고, 준비가 되어 있어서 CPU만 받으면 바로 동작할 수 있다.)
- Blocked(wait, sleep)
- CPU를 주어도 당장 instruction을 실행할 수 없다.
- Process 자신이 요청한 event(I/O 등)가 즉시 만족되지 않아서 이를 기다리는 상태
- ex) 디스크에서 파일을 읽어오는 경우
- New : 프로세스가 생성중인 상태 (메모리에 올라가는 중, 등등)
- Terminated : 수행(execution)이 끝난 상태 (메모리에서 내려가는 상태), 애초에 프로세스는 프로그램이 실행중인 상태에 해당하므로 프로세스가 종료되고 난 상태는 애초에 프로세스가 아니므로 종료되는 도중의 상태를 의미하게 된다.
- 프로세스는 CPU를 점유하고 있거나, I/O device나 공유데이터를 사용하고 있거나, 그 이외에는 Queue에 대기중인 상태이다. 즉, 항상 무언가를 하고 있는 상태 (혹은 대기중)이다.
Process Control Block (PCB)
- PCB
- 운영체제가 각 프로세스를 관리하기 위해 프로세스당 유지하는 정보.
- 구조체로 이루어져 있고, 다음과 같은 정보가 담겨 있다.
- OS가 관리상 사용하는 정보
- Process state, Process ID
- Scheduling information, priority
- CPU 수행 관련 하드웨어 값
- Program counter, registers
- 메모리 관련
- 파일 관련
- 기타
- <include/linux/sched.h>에 있는 task_struct로 이루어져 있고, 각 프로세스는 doubly linked list로 연결되어 있다. kernel은 현재 실행중인 프로세스를 current pointer로 가리키게 된다.
- 프로세스의 종류
- I/O-bound process : 계산하는 시간보다 I/O를 하는 시간이 더 긴 프로세스
- CPU-bound process : 계산하는 시간이 I/O를 하는 시간보다 더 긴 프로세스
문맥 교환 (Context Switch)
- CPU를 한 프로세스에서 다른 프로세스로 넘겨주는 과정.
- CPU가 다른 프로세스에게 넘어갈 때 운영체제는 다음을 수행한다.
- CPU를 내어주는 프로세스의 상태를 PCB에 저장.
- CPU를 새롭게 얻는 프로세스의 상태를 PCB에서 읽어온다.
- 여기서 궁금한 점
- Program Counter가 옮겨져야 운영체제의 코드가 실행될 수 있을 텐데, 그러면 이전의 Program Counter는 어떤 방식으로 저장이 되는 것인가? 운영체제의 코드가 실행되기 전에는 user mode 이므로 PCB에 직접 접근해서 값을 변경시킬 수는 없을거고, 그러면 다른 특수한 메모리 영역이나 레지스터에 그 값을 저장시키는 것인가??
- CPU가 운영체제로 넘어갔을 때 운영체제의 instruction을 실행하기 위해서 레지스터가 쓰이게 될 텐데, 이 때에 기존에 존재하던 레지스터들의 정보는 어떤 방식으로 기록되는가?
- Memory map이 정확히 무엇인지?
- System call이나 interrupt 발생 시 반드시 Context Switch가 일어나는 것은 아니다.
- (1)번과 (2)번이 좀 다른데, (1)의 경우 시간이 오래 걸리지 않는 system call이나 interrupt의 경우 User mode -> kernel mode -> User mode(기존 동일한 프로세스)의 순서로 CPU를 소유하게 된다. (2)의 경우 User mode -> kernel mode -> User mode는 동일하지만 timer interrupt나 I/O와 같은 시간이 오래 걸리는 system call의 경우 이후에 다른 프로세스에게 CPU를 넘겨주어야 한다. 그러므로 A의 문맥이 저장되고, 그 문맥이 B의 문맥으로 넘어가게 되는 Context Switch가 일어나게 된다.
- 하지만 (1)의 경우 kernel mode로 갔다가 다시 user mode로 돌아오는 과정에서 CPU의 상태, 메모리 위치 등을 기록하는 정도의 동작은 일어나지만, 그 동작이 (2)에서 일어나는 Context Switch의 경우보다 오버헤드가 훨씬 적기 때문에 (1)의 경우를 Context Switch라고 보지는 않는다.(ex : cache memory flush같은 경우 굉장히 오버헤드가 큼)
- 아래는 그냥 context switch 관련 그림. 근데 개인적인 생각으로는 이 그림에서 오해해서는 안 되는 것이, P0를 실행하다가 P1을 실행하다가 다시 P0를 실행하게 되는 것은 맞는데, CPU scheduling에 의해서 순서가 결정되는 것이지 바로 P0로 다시 돌아가는 것은 아니다. 이 과정을 그림에서는 ... 으로 표현해 놓았다.
- context switch 시간동안은 시스템이 의미있는 일을 하지 못하기 때문에 pure overhead가 발생한다.
프로세스를 스케줄링하기 위한 큐
- Job Queue
- Ready Queue
- 현재 메모리 내에 있으면서 CPU를 잡아서 실행되기를 기다리는 프로세스의 집합
- Device queues
- I/O device의 처리를 기다리는 프로세스의 집합
- 프로세스들은 각 큐들을 오가면서 수행된다.
스케줄러 (Scheduler)
- Long-term scheduler (장기 스케줄러 또는 job scheduler)
- 시작 프로세스 중 어떤 것들을 ready queue로 보낼지 결정
- 프로세스에 memory(각종 자원)를 주는 문제
- degree of Multiprogramming(메모리에 동시에 올라가 있는 프로세스의 수)을 제어
- time sharing system에는 보통 장기 스케줄러가 없음 (무조건 ready 상태임)
- Short-term scheduler(단기 스케줄러 또는 CPU scheduler)
- 어떤 프로세스를 다음번에 running시킬지 결정
- 프로세스에 CPU를 주는 문제
- 충분히 빨라야 함 (milisecond 단위)
- Medium-term scheduler(중기 스케줄러 또는 Swapper)
- 여유 공간 마련을 위해 프로세스를 통째로 메모리에서 디스크로 쫓아냄
- 프로세스에게서 memory를 뺏는 문제
- degree of Multiprogramming을 제어함.
- 현대 운영체제에서 Long-term의 역할이 필요없는 이유이다.
- 너무 프로세스가 적게 메모리에 올라와 있으면 CPU가 놀게 되므로 성능 저하, 너무 많이 올라와 있으면 각각의 프로세스가 메모리에 올라와 있는 부분이 너무 적어지므로 제대로 실행이 안됨. 그래서 이 때 Swapper가 동작해서 특정 프로세스들의 memory를 뺏게 된다. -> 이 때 기존의 프로세스 상태만으로는 뺏긴 메모리를 기술 불가능함. ready 상태라서 CPU를 받자마자 동작할 수 있는 것도 아니고, 당연히 running 상태도 아니며, 특정한 I/O나 event를 기다리고 있는 상태도 아니기 때문이다. 그래서 이러한 배경 때문에 Suspended(Stopped)상태가 추가로 필요하다.
프로세스의 상태 (2)
- Suspended(stopped)
- "외부적인 이유"로 프로세스의 수행이 정지된 상태
- 프로세스는 통째로 디스크에 swap out된다.
- ex) 사용자가 프로그램을 일시 정지시킨 경우(break key, Ctrl + Z)
메모리에 너무 많은 프로세스가 올라와 있는 경우 시스템에서 프로세스를 잠시 중단시킴.
- Blocked : 프로세스 자신이 요청한 event가 만족되면 Ready상태가 된다.
- Suspended : "외부"에서 resume 해 주어야 Active가 된다.
확장된 프로세스 상태도
- 애초에 커널 관점에서 프로세스를 어떻게 바라볼 것인가? 에 대한 내용이므로 프로세스가 커널 모드로 들어갔을 때에 프로세스는 멈추거나 그런 상태로 보지 않고 똑같이 running이지만 kernel 모드로 동작중인 것으로 생각한다.
- 상태도를 보면 더 잘 이해할 수 있을듯.
CPU Scheduling
- CPU scheduler : ready queue에 있는 process 중에서 하나를 선택해서 CPU core를 할당해 준다.
- I/O-bound process의 경우 I/O 요청 전에 아주 잠깐동안만 CPU를 사용하게 된다.
- CPU-bound process의 경우 CPU사용시간이 더 오래 필요하기 때문에 한 번에 더 오랜시간동안 CPU를 사용할 것 같지만, 그렇지는 않다. timer interrupt때문에 그런듯.
- swapping : memory가 너무 많이 사용되고 있는 경우 등의 이유로 memory에서 process를 지우는 과정. memory -> swap disk로 process의 정보들을 이동시킨다.
참고자료
- 출처 :
- ABRAHAM SILBERSCHATZ ET AL., OPERATING SYSTEM CONCEPTS, NINTH EDITION, WILEY, 2013
- 반효경, 운영체제와 정보기술의 원리, 이화여자대학교 출판부, 2008
- 반효경, 운영체제, 2014-1