• os
  • process

프로세스와 PCB, 프로세스의 상태 변화

프로세스와 PCB의 역할, 생성부터 종료까지의 상태 전이와 스와핑, 리눅스의 프로세스 생성과 좀비·고아·데몬 프로세스를 정리한다.

시리즈 · 운영체제4 / 18
  1. 운영체제의 유형
  2. System Call과 Dual Mode
  3. 인터럽트와 폴링
  4. 프로세스와 PCB, 프로세스의 상태 변화
  5. 프로세스 주소 공간과 Stack이 높은 주소부터 할당되는 이유
  6. 스레드: 사용자·커널 수준 스레드와 Thread Pool, Fork-Join
  7. Context Switching
  8. 프로세스 스케줄링: 단계와 알고리즘
  9. Thread Scheduling: 경합 범위 PCS와 SCS
  10. 경쟁 상태와 상호 배제: Thread Safe, 데커·피터슨 알고리즘
  11. 뮤텍스와 세마포, 모니터
  12. 교착 상태: 발생 조건과 해결 방법
  13. 메모리 계층 구조와 캐시 메모리
  14. 메모리 관리: 주소 바인딩과 연속 메모리 할당
  15. 가상 메모리: Paging과 Segmentation, TLB
  16. 요구 페이징과 페이지 교체 알고리즘, Thrashing
  17. File Descriptor와 File System, I-Node
  18. 동기/비동기와 블로킹/논블로킹, I/O Multiplexing

프로세스

프로세스는 실행 중인 프로그램이다. 디스크에 있는 프로그램을 실행하면 메모리가 할당되고, 그 공간에 바이너리 코드가 올라간다. 이 순간부터 프로세스라고 부른다. 운영체제 관점에서는 다음과 같이 볼 수 있다.

  • 각종 자원을 요청하고 할당받을 수 있는 개체
  • PCB(프로세스 제어 블록)를 할당받은 개체, 즉 커널에 등록된 작업

프로세스는 내부에 최소 하나의 스레드를 가지며, 실제 스케줄링은 스레드 단위로 이루어진다. 프로세스가 할당받은 메모리의 구조는 프로세스 주소 공간에서, 스레드는 스레드에서 다룬다.

프로세스 제어 블록 (PCB)

PCB(Process Control Block)는 OS가 프로세스를 제어하는 데 필요한 정보를 저장하는 자료구조다. 프로세스 상태 관리와 Context Switching에 쓰인다.

  • 프로세스가 생성될 때 함께 만들어지며 주기억장치의 커널 영역에 유지된다.
  • 프로세스의 중요한 정보를 담고 있으므로, 일반 사용자가 접근하지 못하는 보호된 메모리 영역에 둔다.

PCB의 구조

PCB가 관리하는 정보는 다음과 같다.

항목 내용
PID 프로세스 고유 식별 번호
프로세스 상태 준비, 실행, 대기 등의 상태
포인터 다음에 실행될 프로세스 등 스케줄링 큐를 위한 포인터
스케줄링 정보 우선순위 등
문맥 저장 영역 프로세스의 레지스터 상태를 저장하는 공간 (register save area)
메모리 관리 정보, 할당된 자원 정보 프로세스가 사용하는 메모리와 자원
입출력 상태 정보 할당된 입출력 장치, 열린 파일 등
계정 정보 CPU 사용 시간, 실제 사용된 시간 등

프로세스의 상태 변화

프로세스 상태 전이도

Created

작업을 커널에 등록한 상태다. PCB가 할당되고 프로세스가 생성되며, 곧 Ready 상태로 들어간다.

Ready

  • 프로세서를 제외한 모든 자원을 할당받고 프로세서 할당만 기다리는, 즉시 실행 가능한 상태다.
  • Dispatch(Schedule): 스케줄러가 준비 상태의 프로세스 중 하나를 골라 프로세서를 점유하게 하는 것 (Ready → Running)

Running

프로세서와 필요한 자원을 모두 할당받은 상태다. 여기서 두 가지 전이가 일어난다.

  • Preemption (Running → Ready): 프로세스가 프로세서를 독점하지 못하도록 인터럽트 클록을 두어 정해진 시간만 점유하게 한다. 타임 슬라이스가 끝나거나(time-out) 우선순위가 더 높은 프로세스가 들어온 경우다.
  • Block/Sleep (Running → Blocked): 할당된 시간이 끝나기 전에 I/O 등 새로운 자원이 필요해져 프로세서를 스스로 양도한다. 그동안 Ready 상태의 다른 프로세스가 실행된다.

Blocked / Asleep

프로세서가 아닌 다른 자원을 기다리는 상태다. 메모리에는 그대로 올라와 있다. 자원 할당은 시스템 콜로 이루어지며, I/O 완료 인터럽트 등으로 자원을 얻으면 Wake-up(Blocked → Ready)된다.

Suspended

  • 메모리를 할당받지 못한(빼앗긴) 상태다.
  • 메모리 이미지는 swap device(프로그램 정보 저장을 위한 특별한 파일 시스템)에 보관한다.
  • 커널 또는 사용자에 의해 발생하며, Swap-out(suspend)과 Swap-in(resume)으로 전이한다.

중지 상태는 다시 둘로 나뉜다.

  • Suspended Ready(중지 준비): Ready 상태였던 프로세스가 스왑 아웃되어 디스크에 있는 상태
  • Suspended Blocked(봉쇄 중지): Blocked 상태였던 프로세스가 스왑 아웃된 상태

Suspended 상태를 포함한 프로세스 상태 전이도

Terminated / Zombie

프로세스 수행이 끝나 모든 자원을 반납한 상태다. 커널 안에는 일부 PCB 정보만 남는다.

상태 변화와 큐

프로세스는 상태에 따라 Ready Queue, I/O Queue, Device Queue 사이를 이동한다.

Ready Queue와 I/O Queue 사이의 프로세스 이동

상태가 바뀌어 다른 프로세스가 프로세서를 차지할 때는 Context Switching이 일어나고, 이때 실행 정보가 PCB에 저장된다.

메모리가 부족할 때: 스와핑

메모리에 너무 많은 프로세스가 올라가 프로세스당 메모리가 극도로 적어지면, 디스크 I/O가 수시로 발생해 시스템 성능이 떨어진다. 이때 중기 스케줄러가 일부 프로세스의 메모리를 통째로 빼앗아 그 내용을 디스크의 스왑 영역에 저장한다. 이것이 스왑 아웃(Swap Out) 이다.

  • 스왑 아웃 대상은 Blocked 상태의 프로세스가 1순위다.
  • 그래도 해결되지 않으면, 타이머 인터럽트로 준비 큐에 돌아가는 프로세스를 추가로 스왑 아웃한다.
  • 메모리에 여유가 생기면 다시 적재(Swap In)한다.
  • 리눅스에서는 스왑 공간이 없거나 스왑까지 모두 사용하면 OOM Killer가 동작한다.

선점·비선점 스케줄링과 상태 전이

비선점형 스케줄링에서는 어떤 전이가 존재할 수 없을까?

  • 선점형: 프로세서를 빼앗을 수 있으므로 모든 전이가 가능하다.
  • 비선점형: 실행 중인 프로세스가 스스로 프로세서를 내놓을 때까지 기다려야 하므로, time-out이나 우선순위에 의한 Running → Ready(선점) 전이가 없다.

리눅스에서 프로세스가 생성되는 과정

  • 프로세스는 fork() 시스템 콜로 자식 프로세스를 만든다. 자식은 부모의 복제본으로, 생성되면 준비 큐에서 실행을 기다린다.
  • 부모가 wait()를 호출하면 자식이 종료될 때까지 기다렸다가 종료 상태를 회수한다. 셸이 명령을 실행하는 방식이 이것이다.
  • 부팅 시 최상위 프로세스인 systemd(PID 1)가 생성되고, 모든 프로세스는 그 자손이 된다. 각 프로세스는 부모의 PID를 PPID로 가진다.
  • 스레드를 생성할 때는 프로세스의 코드와 전역 변수 등을 공유하고, 고유의 스택만 새로 만든다.

좀비 프로세스와 고아 프로세스

자식이 종료 상태를 알리지 못하고 죽거나, 부모가 먼저 죽으면 어떻게 될까?

  • 자식 프로세스가 종료되어도 커널은 종료 상태 등 최소한의 정보를 남겨 둔다. 부모가 아직 회수하지 않은 이 상태가 좀비 프로세스이며, 부모가 종료 상태를 회수하면 제거된다.
  • 부모가 자식보다 먼저 종료되면 자식은 고아 프로세스가 된다. 이때 PID 1인 init 프로세스가 새 부모가 된다.
  • 부모가 죽을 때 자식도 함께 종료시키려면, 자식을 생성할 때 PID를 부모가 기록해 두었다가 종료 직전에 자식을 kill한다.

데몬 프로세스

  • 항상 백그라운드로 실행되는 프로세스이며, 대부분 부팅 시 자동으로 시작된다.
  • 평소에는 대기 상태로 요청을 기다리다가 요청이 들어오면 서비스를 제공한다.
  • 프로세스 이름 끝에 보통 d가 붙는다.

참고

  • 운영체제: 그림으로 배우는 구조와 원리 (한빛아카데미)