본문 바로가기

System Programming/CSAPP Book

Ch 8-2. Process, Private Address Space, Context Switch

Process: Illusion of Exclusive Use of the Program

Operating system kernel에 있어 중요한 개념 중 하나는 process이다. Process의 개념을 통해 application programmer의 입장에서 프로그램을 돌릴 때, 현재 돌아가고 있는 프로그램이 컴퓨터 시스템과 각종 컴퓨팅 자원을 독점적으로(exclusively) 사용하는 듯한 착각(illusion)을 제공할 수 있다.

 

예를 들어, c 프로그램을 작성하고, 이를 gcc 컴파일러를 이용해 컴파일하여 executable object file을 얻은 상황을 가정하자. 이제, shell에 executable file의 이름을 입력함으로써 프로그램의 실행을 명령할 수 있다. 이 때, shell은 새로운 process를 만들어낸다. 그렇기 때문에, 어떤 프로그램은 항상 어떤 process의 context에서 실제로 실행된다고 말할 수 있다. 물론, application program level에서도 새로운 process를 만들어내는 것이 가능하다. 실제로는 OS가 process의 개념을 구현하지만, 시스템 프로그래밍을 공부하는 입장에서는 이 부분에 대해서는 '아무튼 OS가 process라는 개념을 제공한다' 정도로 이해하고 넘어가기로 한다.

 

컴퓨터 시스템을 독점적으로 사용하는 듯한 착각에 대해서 조금 더 들여다보기로 한다. Process의 개념은 하나의 프로그램이 컴퓨터 시스템의 메모리 address space를 독점적으로 사용하도록 한다. 이러한 개념을 private address space라고 하는데, 각 프로그램마다 private address space를 갖도록 보장함으로써 이 영역은 다른 process에 의해 read/write 될 수 없다. 같은 OS 하에서, 각 process마다 제공되는 private address space의 organization은 동일한데, 예를 들어 어느 주소부터 runtime user stack인지, runtime heap인지, code인지 등에 대한 약속은 동일하다는 것이다.

 

Concurrent Flows

Concurrent flow여러 개의 process가 동시에 겹치면서 실행되는 것을 말한다. 각 process가 차례로 번갈아가며 일정 부분 만큼 실행된다는 점에서 multitasking이라고도 하고, 시간 면에서 보면 time slice마다 서로 다른 process의 일부분이 실행되기 때문에 time slicing이라고도 한다.

 

여기서 concurrent flow의 개념은 processor core의 수와는 무관한 개념이다. 예를 들어, processor가 하나 있는 경우라도, time slicing을 해서 서로 다른 process를 번갈아가며 실행시킬 수 있다.

 

User/Kernel Mode

각 프로세서는 control register 중 mode bit을 가진다. Mode bit에 따라 kernel(또는 supervisor) mode가 될 수도 있고, user mode가 될 수도 있다. Process가 kernel mode일 때, 이 process는 모든 instruction을 실행할 수 있고, 시스템의 어느 메모리 영역에도 접근 가능하다. 반면, user mode에서 process가 돌아갈 때는, 프로세서를 멈춘다든지 등의 privileged instruction은 실행할 수 없으며, kernel 영역의 메모리에는 접근할 수 없다. 이 경우 fatal protection fault를 발생시키도록 되어 있다. 대신, user mode에서는 system call interface를 통해서만 간접적으로 kernel code를 실행하도록 되어 있다.

 

일반적인 application program이 돌아갈 때는 user mode이며, kernel mode로 전환되는 경우는 exception handling이다. 이 때 일어나는 일은 우선 프로세서에 의해 exception 상황이 detect되고, kernel code로 control이 넘어간다. 이 때, mode bit이 user->kernel로 바뀐 뒤, kernel code가 실행된다. 모두 실행이 된 뒤에는 다시 mode bit이 kernel->user로 바뀐 뒤, application program이 이어서 실행되도록 되어 있다.

 

Context Swtich

OS는 context switch를 통해 multitasking을 구현한다. 우선 context란 kernel이 어떤 process를 다시 실행 시작하기 위해 필요한 모든 정보들, 예를 들어 general-purpose registers, PC, user stack, status registers, kernel stack, page table 등이 포함된다. Scheduler라는 kernel code에 의해 언제 어떤 process를 시작시킬지 등의 판단이 이루어지는데, kernel이 어떤 process를 실행시키기로 결정한 것을 process가 schedule 되었다고 한다. 이 때, context switch가 일어나는데, 우선 현재 실행 중이었던 process의 context를 저장하고, 기존에 멈춰있었던 process의 context를 복구하고, 이 process로 control을 넘겨주는 일련의 메커니즘을 context switch라고 한다.

 

Context switch가 일어나는 하나의 예시는, 어떤 event가 일어나기를 기다리는 system call이 일어났을 때이다. 예를 들어, sleep이라는 system call은 process가 말 그대로 멈춰있도록 하는 것인데, 그 동안 context switch를 통해 다른 process를 돌리고 있는 것이다. 파일을 읽어오는 read의 경우도 disk로부터 데이터를 가져오는 데 시간이 많이 걸리기 때문에, 그 동안 다른 process를 돌릴 수 있다. System call 외에도 timer interrupt가 일어났을 때에도 kernel이 현재 실행 중인 process가 충분히 실행되었다고 판단하여 context switch를 하고 다른 process를 실행시킬 수 있다.