CS/OS

[OS] 프로세스란?(1)

jhkimmm 2021. 12. 29. 09:11

프로세스란?

프로세스는 실행 중인 프로그램(text segment)이며 작업의 단위입니다. 이뿐만 아니라 다양한 방식으로 표현할 수 있는데 Program Counter가 가리키고 있는 현재의 인스트럭션, 메모리안에 있는 컨텐츠(stack, heap, global variables) 또한 프로세스라고 할 수 있습니다.즉 프로그램은 passive한 개념이고 프로세스는 active한 개념이며 하나의 프로그램으로부터 여러개의 프로세스가 존재할 수 있습니다.

쓰레드와의 차이점

쓰레드는 프로세스 내부에 있는 일련의 Execution이며 하나의 프로세스는 하나 이상의 쓰레드를 가질 수 있습니다. 그리고 각 쓰레드는 프로세스 내부에서 code, data, files는 공유하지만 각자의 Program Counter, Stack, Register를 가집니다. 리눅스에서 실제로 스케줄링하는 단위는 쓰레드입니다.

Process Memory Layout

Process Memory Layout

각 프로세스는 자신의 Memory Layout을 가지고 있는데, 이는 프로세스가 어떻게 메모리 공간을 차지하는지에 대한 Layout입니다. 실제로 전체 메모리 공간을 다 가지는 것은 아니고 프로세스 자신이 가지고 있다고 생각합니다. 이를 프로세스의 가상메모리(Virtual Memory)라고 하는데 이는 아래에서 자세히 설명하겠습니다.

32비트 CPU라는 것은 모든 프로세스가 2^32(4GB)의 가상 메모리를 가지고 있다는 의미입니다.

 

Layout의 각 영역에 저장되는 데이터는 다음과 같습니다.

이름 설명
Stack area 함수 호출시 생성되는 Stack frame이 저장되는 공간입니다.
함수가 호출될 때 아래로 추가됩니다.(아래 방향으로 영역이 확장됩니다.)
함수를 실행하면서 Stack에 계속 읽고 쓰기를 합니다.
Heap area 동적으로 할당된 값이 저장되는 공간입니다.
동적 메모리가 요청되면 위로 추가 됩니다.
예를 들어 C의 malloc()을 사용하여 동적으로 공간을 할당받으면 heap area에 저장됩니다.
Data segment Global variable들을 초기화하고 해제합니다.
Text segment Binary program(.exe)이 복사되어 저장되는 공간입니다.
인스트럭션들이 이 영역에 저장되어 있으며 Program Counter는 text segment의 한 부분(인스트럭션)을 가리키고 있습니다.
Kernel area 커널의 코드가 들어있는 영역입니다.
Text segment에서 인스트럭션들이 쭉 실행되다가 시스템콜이 호출되면 이 공간으로 와서 실행됩니다.

Kernel area의 Kernel Stack은 시스템콜의 동작을 위한 공간입니다. 시스템콜도 다른 세분화된 함수들을 호출하기 때문에 이 함수들을 위한 Stack 공간입니다.

프로세스의 Virtual Memory(가상메모리)

Process Virtual Memory

메모리 전체의 물리적인 크기가 4GB일 때, 각 프로세스는 자신이 4GB만큼의 메모리 전체를 가지고 있다고 생각하고 동작하지만 실제로는 일부의 메모리만 프로세스에게 주어집니다. 프로세스가 메모리에 값을 저장하려고 할 때 OS가 실제 메모리에 공간을 할당해줍니다.

 

각 프로세스는 실제 메모리에서 자신만의 공간을 가지지만 Kernel memory area만큼은 모두 공유합니다.

Kernel stack은 각 쓰레드(프로세스)마다 하나씩 Kernel memory area에 생성됩니다. 즉 100개의 프로세스가 있다면 100개의 Kernel stack이 Kernel memory area에 존재합니다.

프로세스의 상태(State)

Process State

프로세스의 각 상태가 의미하는바는 다음표와 같습니다.

State Description
New 새로운 프로세스가 생성된 상태입니다.
단, 생성되었다고 바로 실행(running)되는 것은 아닙니다.
Ready CPU 할당되기위해 기다리는 상태입니다.
Ready 상태인 프로세스들은 모두 Ready queue에 들어있습니다.
Running 실행되고 있는 인스트럭션들입니다.
CPU가 1코어라면, 많은 프로세스가 있더라도 한 순간에 오직 하나의 프로세스만 실행합니다.
Waiting 프로세스가 어떤 Event를 기다리고 있는 상태이며, Waiting 상태의 프로세스는 Waiting queue에 들어있습니다.
예를 들어, 화면출력이나 프린트와 같은 I/O작업을 하는 중인 프로세스는 그동안 아무 일도 하지 않아서 CPU를 점유하고 있을 필요가 없기 때문에 Waiting 상태가 됩니다.
Terminated 실행을 마치고 종료된 상태입니다.

주의할 점은 Ready queue와 Waiting queue는 스케줄링을 위해 필요하지만, 나머지 상태는 스케줄링이 필요하지 않기 때문에 New queue, Terminated queue, Running queue는 존재하지 않습니다.