프로세스 관리와 상태 전이 (Process Management)
한눈에 보기
프로세스의 생성부터 종료까지 생명주기를 추적하는 프로세스 관리를 다룬다. 5상태 전이 모델과 상태 큐, 장기 중기 단기 스케줄러, 좀비와 고아 프로세스, 리눅스의 실제 상태 이름까지 정리한다.
최종 업데이트 2026.09.17
프로세스 관리(Process Management)는 운영체제가 프로세스의 생성부터 종료까지 전 생애를 추적하고 통제하는 활동이며, 그 중심에는 프로세스가 생명주기 동안 오가는 상태 전이 모델이 있다. 프로세스는 생성, 준비, 실행, 대기, 종료라는 상태를 오가며, 운영체제는 상태별 큐와 프로세스 제어 블록(PCB, Process Control Block)을 이용해 수많은 프로세스를 질서 있게 관리한다. 상태 전이도를 정확히 그릴 수 있는지가 이 주제의 핵심이다.
프로세스 5상태 모델
프로세스의 생명주기는 다섯 상태로 정리된다.
- 생성(New): 프로세스가 만들어지는 중으로, PCB가 할당되고 자원이 준비된다.
- 준비(Ready): 실행에 필요한 것을 다 갖추고 CPU 배정만 기다린다.
- 실행(Running): CPU를 잡고 명령을 실행 중이다. 코어 하나당 한 프로세스만 이 상태다.
- 대기(Waiting, Blocked): 입출력 완료나 이벤트를 기다리며 CPU를 받아도 할 일이 없는 상태다.
- 종료(Terminated): 실행을 마쳤고 자원 회수를 기다린다.
상태 사이의 화살표가 더 중요하다. 준비에서 실행으로는 스케줄러의 디스패치(dispatch)로 넘어가고, 실행에서 준비로는 타임 퀀텀 만료나 선점으로 돌아온다. 실행에서 대기로는 입출력 요청 같은 사건으로 넘어가며, 대기에서 준비로는 기다리던 사건의 완료로 돌아온다. 주의할 점은 대기에서 곧바로 실행으로 갈 수 없다는 것이다. 사건이 끝나도 반드시 준비 상태를 거쳐 스케줄러의 선택을 다시 받아야 한다. 또한 준비에서 대기로 가는 전이도 없다. 기다릴 일은 실행 중에만 생기기 때문이다.
상태 큐와 PCB의 역할
운영체제는 상태별로 프로세스를 큐에 매달아 관리한다. 준비 큐(ready queue)에는 준비 상태의 PCB들이, 각 장치의 대기 큐(device queue)에는 그 장치를 기다리는 PCB들이 연결된다. 프로세스의 상태 전이는 곧 PCB를 한 큐에서 다른 큐로 옮기는 일이다. 예를 들어 실행 중이던 프로세스가 디스크 읽기를 요청하면, 커널은 그 PCB의 상태 필드를 대기로 바꾸고 디스크 대기 큐에 매단 뒤 준비 큐에서 다음 프로세스를 꺼내 디스패치한다. 디스크 인터럽트가 오면 해당 PCB를 대기 큐에서 떼어 준비 큐로 옮긴다. 이렇게 PCB는 프로세스 관리의 실질적인 단위이며, 커널이 보는 프로세스란 사실상 PCB 그 자체다.
세 종류의 스케줄러와 중지 상태
| 스케줄러 | 하는 일 | 실행 빈도 |
|---|---|---|
| 장기 스케줄러(Long-term) | 디스크의 작업 중 어떤 것을 메모리에 올려 프로세스로 만들지 결정 | 드물게 |
| 중기 스케줄러(Medium-term) | 메모리가 부족하면 프로세스를 통째로 스왑 아웃하고 나중에 다시 들임 | 필요할 때 |
| 단기 스케줄러(Short-term, CPU 스케줄러) | 준비 큐에서 다음에 실행할 프로세스 선택 | 수십 밀리초 단위로 매우 자주 |
중기 스케줄러가 개입하면 5상태 모델에 중지 준비(suspended ready)와 중지 대기(suspended blocked) 상태가 추가된 7상태 모델이 된다. 메모리 밖으로 밀려난 프로세스는 다시 들어올 때까지 스케줄링 대상에서 제외된다. 시분할이 일반화된 현대 범용 운영체제에서는 별도의 장기 스케줄러 없이 프로세스가 생기는 즉시 준비 큐에 들어가고, 메모리 압박은 페이지 단위 회수로 대응하는 것이 보통이다.
프로세스의 생성과 종료 관리
유닉스(Unix) 계열에서 프로세스는 fork 시스템 콜로 기존 프로세스를 복제해 만들어지므로, 모든 프로세스는 부모 자식 관계로 엮인 트리(tree)를 이룬다. 트리의 뿌리는 부팅 때 커널이 직접 만든 최초 프로세스(리눅스의 init 또는 systemd)다. 종료는 두 방향이 있다. 프로세스가 스스로 exit를 호출하는 정상 종료와, 시그널이나 부모의 요청으로 강제 종료되는 경우다. 종료된 프로세스의 자원은 대부분 즉시 회수되지만, 종료 코드와 통계는 부모가 wait로 읽어 갈 때까지 PCB에 남는다. 이 잔여 상태가 좀비(zombie) 프로세스다. 부모가 먼저 죽으면 자식은 고아(orphan)가 되어 init 계열 프로세스에 입양되고, 입양한 쪽이 wait를 대신 수행해 좀비를 정리한다. 일부 시스템은 부모가 죽을 때 자식들을 연쇄 종료하는 계단식 종료(cascading termination)를 쓰기도 한다.
프로세스가 종료되면 커널은 열린 파일 디스크립터를 닫고, 주소 공간과 페이지 테이블을 해제하며, 소유했던 락과 IPC 자원을 정리한다. 서버 환경에서 흔한 데몬(daemon) 프로세스는 이 생명주기 관리를 응용한 형태로, 터미널과의 연결을 끊고 백그라운드에서 상주하도록 fork를 거쳐 세션을 분리해 만들어진다. 현대 리눅스에서는 systemd가 서비스 프로세스의 시작, 감시, 재시작, 종료를 대신 관리해 주므로, 프로세스 생명주기 관리가 커널과 초기화 시스템의 협업으로 이루어진다고 볼 수 있다.
리눅스에서의 실제 상태 이름
교과서 모델은 실제 커널에서 조금 다른 이름으로 나타난다. 리눅스의 ps 명령에서 R은 실행 중이거나 준비 상태(TASK_RUNNING)로 둘을 구분하지 않고, S는 깨울 수 있는 대기(interruptible sleep), D는 시그널로도 깨울 수 없는 대기(uninterruptible sleep, 주로 디스크 입출력), T는 정지(stopped), Z는 좀비다. 교과서의 준비와 실행이 하나의 R로 합쳐져 있다는 점, 대기가 두 종류로 나뉜다는 점을 알아 두면 실무 도구와 이론을 연결해 답할 수 있다.
면접에서 이렇게 물어본다
- 프로세스 5상태 전이도를 그리고 각 화살표가 언제 일어나는지 설명해 보라.
- 대기 상태에서 바로 실행 상태로 갈 수 없는 이유는 무엇인가.
- 장기, 중기, 단기 스케줄러의 역할 차이와 7상태 모델의 중지 상태를 설명해 보라.
- 좀비 프로세스와 고아 프로세스가 생기는 과정과 운영체제의 처리 방식을 말해 보라.
- 프로세스가 입출력을 요청했을 때 커널 내부에서 PCB와 큐에 일어나는 일을 설명해 보라.
운영체제에서 같이 읽기
- CPU 스케줄링 (CPU Scheduling)운영체제가 준비 상태의 여러 프로세스 중 다음에 CPU를 쓸 프로세스를 고르는 CPU 스케줄링을 다룬다. 선점과 비선점, FCFS부터 라운드 로빈과 MLFQ까지 알고리즘 비교, 리눅스 CFS와 EEVDF까지 정리한다.
- 교착 상태 (Deadlock)둘 이상의 프로세스가 서로가 점유한 자원을 기다리며 영원히 멈추는 교착 상태를 다룬다. 네 가지 필요조건, 예방과 회피와 탐지 회복 전략, 기아와 라이브락의 구분, 데이터베이스 데드락 실무 사례까지 정리한다.
- 파일 시스템 (File System)저장 장치 위에 파일과 디렉터리라는 추상화를 만드는 파일 시스템을 다룬다. 슈퍼블록과 아이노드 구조, 연속과 연결과 색인 할당 비교, 저널링과 쓰기 시 복사, VFS 계층까지 정리한다.
- 인터럽트 (Interrupt)CPU가 하던 일을 멈추고 긴급한 사건을 먼저 처리하게 하는 인터럽트를 다룬다. 폴링과의 비교, 하드웨어 인터럽트와 예외와 트랩의 구분, 처리 절차와 상반부 하반부, 타이머 인터럽트와 멀티태스킹의 관계를 정리한다.
이 개념, 내 코드에서는 어떻게 물어볼까요
데브핏(DevFit)에 채용공고 URL을 붙여 넣고 레포지토리를 연결하면, 내가 쓴 커밋에서 예상 질문과 어필 포인트를 만듭니다. 하루 10회까지 무료입니다. 합불 판정이나 지원자 랭킹은 만들지 않고, 최종 판단은 사람이 합니다.
공고 넣고 시작하기