Process
개요
Process(프로세스)란 실행하고 있는 프로그램의 객체를 의미한다. 프로세스를 실행하는 프로세서(CPU)나 프로세스가 실행하는 대상인 프로그램과는 구별되는 개념이다. 프로그램을 실행할 경우 프로세스에는 메모리와 CPU를 할당하며 이를 통해 프로세스가 탄생한다. 우리의 관점에서는 프로세스를 실행하면 두가지 마법같은 일이 일어난다.
- 해당 프로세스가 모든 메모리를 독점적으로 사용하는 것처럼 보임
- 해당 프로세스가 중단되는 일 없이 하나씩 연속적으로 명령어를 실행하는 것 처럼 보임
컴퓨터의 메모리는 다음과 같이 구성된다.
Multiprocessing
시스템의 각 프로그램은 어떤 프로세스 내의 Context(맥락)[1][2] 내에서 실행된다. 사용자가 프로그램을 실행할 때마다 새로운 프로세스를 생성하고 해당 프로세스의 Context에서 실행 파일 객체를 생성한다. 이때 각각의 프로세스는 모든 메모리를 독점적으로 사용하는 것 처럼 보이며, 해당 프로세스가 중단되는 일 없이 하나씩 연속적으로 명령어를 실행하는 것 처럼 보인다. 이는 프로세스 개념에 의해서 다음과 같이 구현된다.
- An independent logical control flow: 각 프로그램이 CPU를 독점적으로 사용하는 것처럼 보이게 함
- context switching이라는 커널의 메커니즘에 의해서 구현됨
- A private address space: 각 프로그램이 메모리를 독점적으로 사용하는 것처럼 보이게 함
- virtual memory라는 커널의 메커니즘에 의해서 구현됨
The (Traditional) Reality
하나의 프로세서(CPU)가 concurrently하게 다수의 프로세스를 처리한다.
- 현재의 register들을 메모리에 저장함
- 실행에 대한 다음 프로세스를 스케쥴링함
- 저장된 register를 로드하고 address space를 전환함 (context switch)
The (Modern) reality
- 하나의 칩에 여러 CPU가 존재함
- CPU들은 메인 Memory와 몇몇 cashes들을 공유함
- 각각의 CPU들은 커널에 의해서 스케쥴링 되어 병렬적으로 각각의 프로세스들을 실행함
Logical Control Flow

프로세스는 여러 프로그램이 동시에 실행되고 있음에도 각 프로그램이 CPU를 독점적으로 사용하고 있는 것처럼 보이도록 한다. 이런 프로그램의 진행을 디버거를 이용하여 추적할 경우에 program counter를 관찰할 수 있는데 이러한 PC의 흐름을 logical control flow(Logical flow)라고 한다. 이때 Logical flow는 예외 처리기, 프로세스, 쓰레드 등의 여러가지 형태로 존재한다. 오른쪽 그림에서처럼 세개의 프로세스가 실행될 경우 세개의 Logical flow로 진행되며, 이는 프로세스들이 번갈아 가면서 CPU를 이용한다는 것을 의미한다. 이때 각 프로세스들은 자신의 흐름의 일부를 실행한 후에 타 프로세스의 차례가 되면 해당 실행을 중지한다.
Concurrent Flow
Concurrent Flow란 한 Logical flow의 실행이 다른 flow와 시간적으로 겹치는 경우를 의미한다. 흐름 X가 흐름 Y가 시작된 이후, 종료되기 이전에 시작되거나, Y가 X가 시작된 이후, 종료되기 이전에 시작되면, X와 Y는 서로에 대해 동시적(concurrent)이다. 예를 들어서 A,B 그리고 A, C는 Concurrently하게 실햄됨. 하지만 B와 C는 그렇지 않다.
- A의 프로세스가 종료되기 전에 B(C)의 프로세스가 시작되었기 때문
프로세스가 다른 프로세스들과 번갈아서 실행하는 것을(concurrently하게) multitasking이라고 한다. time slice란 자신의 flow 일부를 실행하는 단위를 의미한다.[3]
Private Address Space / User and Kernel Modes
프로세스는 각 프로그램이 시스템의 주소 공간을 독점적으로 사용하는 것처럼 보이도록 한다. 주소가 n개의 비트로 나타내지면 2^n개의 주소값이 존재한다. 이때 프로세스는 각 프로그램에 다른 프로세스가 접근할 수 없는 고유한 주소 공간을 제공한다.
또한 각 주소 공간에 저장된 내용은 다를지라도 공간 자체는 공통 구조를 가진다. 주소 공간은 Code, Data, Heap, Stack으로 구분된다. 하단은 Code공간으로 0x000000~0x400000에 해당하며 프로그램의 코드를 저장하는 부분이다. 상단은 커널을 위해서 예약되며 프로세스를 대신해 커널이 명령어를 실행할 때 사용된다.