본문 바로가기

Operating System

[Ch 3-1] Process: Concepts, Process Control Block, Context Switch

3.1 Process Concepts

3.1.1 The Process

Process의 정의는 a program in execution 이다. 프로그램은 디스크에 저장되어 있는 코드(=list of instruction)로서 passive entity이며, process는 PC 레지스터가 다음 명령어를 가리키고 있고 여러 자원을 할당받는 active entity이다. 프로그램의 아이콘을 더블 클릭하거나 (file_name).out 명령어를 command 창에 입력하면, 프로그램이 메모리에 load 되면서 비로소 process가 된다.

 

Process가 현재 수행하고 있는 activity를 나타내는 status로는 우선 program counter와 CPU의 각종 register들이 있다. 다음으로는 메모리인데, 메모리의 영역은 아래 그림과 같이 여러 영역으로 나누어져 있다.

출처: 교재 Figure 3.1

Executable code가 저장되어 있는 text 영역, global variable들이 저장되어 있는 data 영역, 프로그램 수행 중에 동적 할당되는 heap 영역, 함수 호출 시 임시로 활용되는 저장소인 stack 영역이다. 이 때 text, data 영역의 크기는 고정되어 있고, stack과 heap 영역의 크기는 프로그램 실행에 따라 dynamic하게 커지거나 작아진다. 이것은 각 영역에 무엇이 저장되는지를 생각해보면 그러하다. Stack 영역은 함수의 호출이 일어날 때 각종 정보들이 push되었다가 return 시 pop된다. Heap 역시 dynamic alloc/deallcoc 에 의해 커지고 작아진다. 메모리 공간 상으로 늘어나는 방향을 보면 heap과 stack이 서로를 향해 늘어나는데, OS는 이 두 영역이 서로 overlap되지 않도록 해야 한다.

 

3.1.2 Process State

실행 중인 프로세스는 state가 변하게 되는데, 그 state diagram은 아래 그림과 같다.

출처: 교재 Figure 3.2

New는 프로세스가 처음 만들어졌을 때의 상태이다. Ready는 프로세스가 실행을 실제로 하게 되는 HW인 프로세서 할당을 기다리는 상태이다. Running은 명령어가 프로세서에서 돌아가고 있는 상태이다. Waiting은 프로세서가 I/O operation 등의 event가 일어나기를 기다리고 있는 상태이다. 마지막으로 Terminated는 실행이 끝난 상태이다.

 

이 교재에서 프로세서에 대한 특별한 전제가 없다면 single core system을 가정하므로, running 상태에 놓인 프로세스는 항상 최대 1개이다. (0개인 경우는 CPU가 idle 상태이다)

 

3.1.3 Process Control Block

OS는 프로세스를 scheduling하기 위해서 각 프로세스에 정보를 keep tracking 해야 한다. 각 프로세스의 정보는 process control block(이하 PCB)에 담아 저장한다.

출처: 교재 Figure 3.3

프로세스의 상태를 나타내는 모든 정보들이 기록되어야 하는데, 우선 위 Ch 3.2에서 언급한 state(5개 중 하나), program counter, CPU register, scheduling 정보(예를 들어 프로세스의 priority), memory-management 정보(base register, page table), accounting 정보(CPU cycle이나 시간 이용량), I/O 정보 등이 포함된다.

 

요약하면, PCB는 어떤 프로세스가 start/restart 하기 위한 모든 정보를 담아두는 저장소이다.

 

3.2 Process Scheduling

Multiprogramming에서는 scheduler가 하나의 프로세스를 선택해 일정 시간 동안 실행시킨 뒤 또 다른 프로세스로 switch 하여 실행시키고 이러한 동작을 반복함으로써 CPU utilization을 최대화시킨다.

 

3.2.1 Scheduling Queues

처음 프로세스가 system에 등록되면 ready queue에 들어간다. 일반적으로 queue는 연결 리스트 형태로 구현되어서, header는 첫 번째 PCB를 가리키는 포인터이고, 각 PCB는 다음 PCB를 가리키는 포인터를 가지고 있는 식이다.

 

프로세스가 ready queue에 있다가 프로세서를 할당받아서 실행이 되는데, 만약 중간에 I/O request를 한다면 interrupt를 발생시키고 wait queue에 들어간다. 만약 timer interrupt에 의해 중단되었다면, 이 때는 다시 ready queue에 들어간다. Wait queue에 들어간 경우도, 기다리던 요청이 처리된 후에는 다시 ready queue로 들어가서 프로세서 할당을 기다리게 된다.

출처: 교재 Figure 3.5

 

3.2.2 CPU Scheduling

CPU scheduler의 역할은 ready queue에 있는 프로세스들 중 하나를 선택해서 core를 할당하는 것이다. 하나의 프로세스가 프로세서를 너무 오랜 기간 점유하고 있는 것을 막기 위해 일정 시간이 되면 CPU에서 해당 프로세스를 제거해야 한다. 그러기 위해 CPU scheduler 코드는 일정 시간 간격으로 반복적으로 수행된다.

 

3.2.3 Context Switch

Interrupt가 발생하게 되면 OS가 CPU core를 현재 task에서 kernel routine으로 switch하여 실행시키게 된다. 이 때, 현재 중단된 task가 나중에 이어서 실행될 수 있도록 하려면, 시스템은 현재의 context를 저장해두어야 한다. 이렇듯 하나의 core에서 실행되는 task가 바뀔 때, 실행되던 프로세스의 context를 저장하고 실행시킬 프로세스의 context를 복구하는 것을 context switch라고 한다.

출처: 교재 Figure 3.6

프로세스의 context는 PCB에 기록되기 때문에, 위 그림과 같은 일이 일어난다. State(=context)를 저장할 때도 PCB에 저장하고, 다시 불러올 때도 PCB로부터 load 하게 된다.

 

여기서, context switch는 pure overhead인데, 왜냐하면 context switch가 일어나는 동안에는 core가 어느 프로세스도 실행하지 않고 있기 때문이다. 일반적으로 context switch는 HW에 많이 의존하며, 예를 들어 register set을 여러 개 둘 수 있다. 그러면 레지스터들을 옮겨 담을 필요 없이 register set을 가리키는 포인터만 바꿔주면 된다.

 

Reference

A. Silberschatz, Operating System Concepts 10th ed, WILEY (2019) Ch 3