4 분 소요

프로세스 (Process) : 실제 메인 메모리에 할당되어 실행 중인 프로그램

프로그램은 보조 기억 장치에서 아무런 동작을 하지 않은 상태로 존재한다. 어떤 요청에 의해 메인 메모리에 할당되어 CPU를 사용하면서 실행된다. 프로세스는 실제 메인 메모리에 할당되어 실행 중인 프로그램으로, 각 프로세스는 CPU에 의해 실행된 후 메인 메모리를 효율적으로 사용해야 한다. 이를 위해 프로세스 테이블 엔트리, 즉 프로세스 컨트롤 블록 (Process Control Block)이 생성된다. 프로세스는 주소 공간을 가지며, 이는 코드 세그먼트, 데이터 세그먼트, 스택 세그먼트로 나뉜다. 코드 세그먼트에는 프로그램 소스 코드가 저장되고, 데이터 세그먼트에는 전역 변수가 저장되며, 스택 세그먼트에는 지역변수와 매개변수가 저장된다.

프로세스의 생성과 종료

최초의 프로세스인 Init의 생성은 부팅된 운영체제가 처음 수행하는 작업 중 하나이다. 생성된 프로세스는 다른 프로세스를 생성하는 과정을 반복한다. 프로세스를 생성하기 위한 시스템 호출은 fork()이며, 종료를 위한 시스템 호출은 exit()이다. 생성된 모든 프로세스는 고유의 정수값인 PID를 가지며, 자신을 생성한 사용자 고유의 UID 값 또한 가진다. 부모 프로세스와 자식 프로세스는 동일한 UID 값을 갖는다. 프로세스 트리는 부모 프로세스인 A에서 자식 프로세스인 B, C, D가 파생되어 생성된다. 부모 프로세스는 프로세스를 생성한 프로세스이고, 자식 프로세스는 프로세스로부터 생성된 프로세스이다. 형제 프로세스는 같은 부모 프로세스에서 파생된 자식 프로세스들이다.

프로세스 컨트롤 블록 (Process Control Block)

프로세스 컨트롤 블록은 프로세스에 대한 모든 정보를 저장하는 곳이다. CPU는 여러 프로세스를 빈번히 전환하면서 수행하기 때문에 각 프로세스의 데이터를 저장해야 작업을 이어서 수행할 수 있다. 운영체제 내에서 프로세스를 관리하는 코드 부분에 저장되며, 프로세스 컨트롤 블록에 데이터를 저장 및 복원하는 시간 역시 다중 작업을 위해 프로세스에 할당되는 시간에 포함된다. 프로세스 상태, 프로그램 카운터, 스택 포인터, 파일 디스크립터 등의 정보를 포함한다.

Process Control Block

프로세스 상태 (Process Status)

각 단계들에서 상태 전이가 일어나 다음 단계로 넘어간다. New는 프로그램이 메인 메모리에 할당된 상태를 의미한다. Ready는 프로세스가 언제든 실행 가능한 상태로, 할당된 프로그램이 실행되기 위한 모든 준비를 마친 상태로 대기 중인 상태이다. n개의 작업이 있을 때, CPU의 프로세서는 스케줄러의 0~(n-1)번, 즉 n개의 작업을 번갈아 처리한다. Running은 CPU가 해당 프로세스를 실제로 실행 중인 상태이다. Waiting 또는 Blocked는 Running이 불가능한 상태를 의미하며, I/O 정보가 없어 작업할 수 없는 상태이다. Waiting이 끝나면 다시 CPU에 실행되기 위해 Ready로 돌아가야 한다. Terminated는 프로세스가 완전히 종료된 상태를 의미한다.

Process States

  • I/O 작업으로 인한 상태 변화: Running -> Waiting -> Ready -> Running
  • 시간 초과로 인한 인터럽트에 의한 상태 변화: Running -> Ready -> Running

프로세스 큐 (Process Queue)

프로세스 큐는 커널이 프로세스 스케줄링을 위해 데이터 영역에서 관리하는 큐이다. Ready Queue는 프로세스 상태가 Ready인 프로세스들이 CPU 제어를 기다리는 큐이다. 어떤 CPU 스케줄링 알고리즘을 선택하는지에 따라 CPU 제어 순서가 달라진다. Job Queue는 보조 기억 장치의 프로그램이 실행되기 위해 메인 메모리의 할당 순서를 기다리는 큐이다. 시스템 내의 모든 프로세스를 관리하며, Ready Queue와 Device Queue에 속한 모든 프로세스를 포함한다. Device Queue는 프로세스 상태가 Waiting인 프로세스들이 CPU 외의 자원을 기다리는 큐이다. 기다리는 자원들마다 큐가 할당되며, 해당 자원이 사용되면 인터럽트를 발생시키고 Ready Queue로 이동한다.

Process Queue

각 큐는 프로세스의 프로세스 컨트롤 블록을 가리키는 포인터 방식으로 연결 리스트를 구현한다.

스케줄러 (CPU Scheduler)

스케줄러는 프로세스 순서를 정해 프로세스 큐에 올릴 것을 결정하는 커널의 코드이다. 장기 스케줄러는 생성된 프로세스 중 Job Queue에서 Ready Queue로 이동시킬 것을 선택한다. 장기 스케줄러는 현재 메모리에 할당된 프로세스의 개수(Degree of multiprogramming)를 제어한다. 장기 스케줄러는 I/O bound Process와 CPU bound Process를 메인 메모리에 적절히 할당해야 한다. I/O bound Process는 I/O 작업 비중이 높은 프로세스이고, CPU bound Process는 CPU 작업 비중이 높은 프로세스이다.

중기 스케줄러는 실행 중인 프로세스 중 보조 저장 장치로 옮길 것을 주기적으로 검사한다. Swapping(Swap-out ↔ Swap-in)은 Swap-in할 때 이전 공간으로 재할당되는 것을 보장하지 않는다. Swap-out은 메인 메모리에서 우선 순위가 낮은 프로세스를 통째로 보조 기억 장치로 저장하는 것을 의미하고, Swap-in은 나중에 해당 프로세스가 다시 사용되려 할 때 보조 기억 장치에서 메인 메모리에 다시 할당하는 것을 의미한다. 중기 스케줄러 또한 현재 메모리에 할당된 프로세스의 개수(Degree of multiprogramming)를 제어한다.

단기 스케줄러는 Ready Queue 내에서 프로세스들 중 어떤 것을 다음에 실행시킬지 선택한다. 이는 CPU 스케줄러라고도 부르며, 시분할 시스템에서 Time Out이 발생하면 호출된다. 단기 스케줄러는 높은 빈도로 호출되며, 실행 시간이 짧은 프로세스를 선택해 빠르게 처리하는 역할을 한다. 이러한 특성으로 인해 프로세스 간의 빠른 전환이 가능하고, 시스템의 응답 시간을 개선할 수 있다.

문맥 전환 (Context Switching)

문맥 전환은 CPU가 실행 중인 프로세스를 멈추고 다른 프로세스를 실행하는 작업을 의미한다. 이 과정에서 문맥(Context)은 각 프로세스 컨트롤 블록(Process Control Block, PCB) 내에 저장된다. 문맥은 하드웨어 문맥과 소프트웨어 문맥으로 나뉜다. 하드웨어 문맥에는 프로그램 카운터 정보와 레지스터 정보가 포함되며, 이는 프로세스의 현재 상태를 나타낸다. 소프트웨어 문맥에는 프로세스 주소 공간, 파일 디스크립터, 입출력 상태 등 프로세스의 실행에 필요한 다양한 정보가 포함된다.

CPU 스케줄러는 CPU가 어느 프로세스를 다음에 실행할지 지정한다. 디스패쳐(Dispatcher)는 문맥 전환이 발생하면 프로세스의 상태를 Ready에서 Running으로 전이시킨다. 문맥 전환 오버헤드(Context Switching Overhead)는 문맥 전환이 발생할 때마다 디스패쳐를 매번 실행시키는 데 소요되는 시간과 자원을 의미한다. 이는 시스템 성능에 영향을 미칠 수 있으므로 최소화하는 것이 중요하다.

문맥 전환 과정은 다음과 같은 단계로 이루어진다:

  1. 현재 실행 중인 프로세스의 상태 저장: CPU는 현재 실행 중인 프로세스의 레지스터 값, 프로그램 카운터, 그리고 기타 하드웨어 문맥 정보를 해당 프로세스의 PCB에 저장한다. 이는 프로세스가 다시 실행될 때 이전 상태로 복원될 수 있도록 하기 위함이다.
  2. 새로 시작될 프로세스의 상태 복원: CPU는 다음에 실행될 프로세스의 PCB에서 저장된 문맥 정보를 읽어들여 CPU 레지스터와 프로그램 카운터를 복원한다. 이를 통해 새 프로세스는 중단된 지점부터 실행을 재개할 수 있다.
  3. 캐시 및 TLB(Translation Lookaside Buffer) 재설정: 문맥 전환 시 캐시와 TLB는 이전 프로세스의 데이터를 포함하고 있을 수 있다. 따라서 새로운 프로세스의 올바른 데이터와 주소 변환을 위해 캐시와 TLB를 재설정해야 한다.

시스템 호출로 인한 인터럽트 발생 시에는 실행 중인 프로세스의 문맥을 PCB에 갱신하지만, 문맥 전환이 반드시 이루어지지는 않는다. 시스템 호출은 프로세스가 커널 모드로 전환되어 특정 작업을 수행하는 경우가 많으며, 이 과정에서 프로세스의 상태를 PCB에 저장하고 필요한 커널 작업을 수행한 후 다시 사용자 모드로 복귀한다.

태그:

업데이트: