프로세스 상태
프로세스는 생성부터 종료까지 여러 상태를 전이하며 CPU를 공유한다.
5가지 상태
[생성] → [준비] ⇄ [실행] → [종료]
New Ready Running Terminated
↕
[대기]
Waiting
상태 전이
| 전이 | 설명 | 트리거 |
|---|
| New → Ready | 프로세스 생성 완료 | fork() |
| Ready → Running | CPU 할당 | 스케줄러 dispatch |
| Running → Ready | CPU 빼앗김 | 타임 슬라이스 만료 |
| Running → Waiting | I/O 요청 | read(), sleep() |
| Waiting → Ready | I/O 완료 | 인터럽트 |
| Running → Terminated | 실행 완료 | exit() |
상태 전이 예시
[웹 서버 프로세스]
1. 서버 시작 → New → Ready
2. CPU 할당 → Running (요청 처리)
3. DB 쿼리 → Waiting (I/O 대기)
4. 쿼리 완료 → Ready (대기열)
5. CPU 다시 할당 → Running (응답)
6. 타임아웃 → Ready (선점당함)
Ready Queue와 Wait Queue
CPU: [ Running ]
↑ dispatch
[Ready Queue]
P1 → P3 → P7 → ...
[I/O Wait Queue]
디스크: P2 → P5
네트워크: P4 → P6
좀비/고아 프로세스
| 상태 | 설명 | 문제 |
|---|
| 좀비 | 종료했지만 부모가 wait() 안 함 | PID 낭비 |
| 고아 | 부모가 먼저 종료 | init이 입양 |
좀비 프로세스:
자식: exit() → Terminated (좀비)
부모: wait() 안 호출 → PCB 남아있음
해결: 부모가 wait()/waitpid() 호출
Q.프로세스의 5가지 상태와 전이를 설명해주세요.
| 상태 | 뜻 | 나가는 경로 |
|---|
| 생성 | 만들어지는 중 | 준비로 |
| 준비 | 실행할 수 있고 CPU 를 기다린다 | 스케줄러가 고르면 실행으로 |
| 실행 | CPU 를 쓰고 있다 | 시간이 다하면 준비로, I/O 요청이면 대기로, 끝나면 종료로 |
| 대기 | I/O 나 이벤트를 기다린다 | 완료되면 준비로 |
| 종료 | 끝났고 정리를 기다린다 | 부모가 거두면 사라진다 |
주의할 전이는 대기에서 실행으로 바로 가지 않는다는 점입니다. I/O 가 끝나면 준비 상태로 가서 다시 순번을 기다립니다.
리눅스에서는 대기를 둘로 나눕니다. 신호로 깨울 수 있는 것과, 끊을 수 없는 입출력 대기입니다. 후자는 kill 로도 종료되지 않아 디스크나 네트워크 저장소 문제를 진단하는 신호가 됩니다.
흔한 실수: 준비와 대기를 같은 것으로 보는 것. 준비는 CPU 만 있으면 바로 돌 수 있고, 대기는 CPU 를 줘도 할 일이 없습니다.
Q.Running에서 Ready로 돌아가는 경우는?
CPU 를 뺏길 때입니다. 스스로 내려놓는 것이 아닙니다.
| 경우 | 내용 |
|---|
| 시간 할당량 소진 | 배정된 시간이 끝나 스케줄러가 회수한다 |
| 더 높은 우선순위 등장 | 선점형 스케줄러가 자리를 넘긴다 |
| 인터럽트 처리 후 | 다른 프로세스가 준비 상태가 되어 재선택된다 |
| 자발적 양보 | yield 로 스스로 내려놓는다 |
I/O 를 요청할 때는 준비가 아니라 대기로 갑니다. 할 일이 없어 CPU 를 줘도 못 쓰기 때문입니다. 이 구분이 이 질문의 요지입니다.
비선점형 스케줄러에서는 첫 두 경우가 없습니다. 한 번 실행되면 끝나거나 I/O 를 요청할 때까지 CPU 를 놓지 않아, 짧은 작업이 긴 작업 뒤에서 오래 기다립니다.
흔한 실수: I/O 요청 시 준비로 간다고 답하는 것. 대기로 갔다가 완료 후 준비로 돌아옵니다.
Q.I/O 바운드와 CPU 바운드 프로세스의 차이는?
시간을 어디서 쓰는지가 다릅니다.
| 항목 | I/O 바운드 | CPU 바운드 |
|---|
| 대부분의 시간 | 디스크와 네트워크 대기 | 계산 |
| 예 | 웹 서버, 파일 처리, DB 조회 | 영상 인코딩, 암호화, 정렬 |
| 실행 구간 | 짧게 자주 | 길게 이어서 |
| 늘려야 할 것 | 동시 실행 수 | 코어 수 |
스케줄러도 이 둘을 다르게 다룹니다. I/O 바운드는 짧게 쓰고 금방 대기로 가므로 우선순위를 높여도 다른 프로세스를 오래 막지 않습니다. 그래서 다단계 큐 스케줄러는 짧게 쓰고 내려가는 프로세스의 우선순위를 유지합니다.
실무에서는 스레드풀 크기를 정할 때 이 구분을 씁니다. CPU 중심이면 코어 수 안팎, I/O 대기가 길면 그 비율만큼 크게 잡습니다.
흔한 실수: 하나의 프로그램을 둘 중 하나로 단정하는 것. 구간마다 다릅니다. 파일을 읽어(I/O) 압축하는(CPU) 작업처럼 섞여 있으면 측정으로 비율을 봐야 합니다.
먼저 스스로 답해보고 아래 답변과 견줘보세요. 막히는 부분은 문제로 확인할 수 있어요.
읽었으면 문제로 확인해보세요
운영체제 문제를 풀면 틀린 문제가 자동으로 노트에 쌓입니다. 가입 없이 5문제를 먼저 풀어볼 수도 있어요.