프로세스 스케줄링은 한 문장입니다: "CPU가 하나인데 프로세스가 여러 개면, 누구를 먼저 실행할 것인가?"
같은 프로세스 3개도 순서만 바꾸면 평균 대기 시간이 4.7ms에서 1.3ms로 줄어들 수 있습니다. 아래에서 직접 확인해 보세요.
FCFS, SJF, 라운드 로빈 탭을 눌러보세요. 같은 프로세스인데 간트 차트가 완전히 달라집니다.
왜 중요한가
운영체제는 수십~수천 개의 프로세스를 동시에 관리합니다. CPU는 한 순간에 하나만 실행할 수 있으니, 누구에게 먼저 CPU를 줄지 결정해야 합니다.
이 결정이 다음을 바꿉니다:
- 대기 시간: 프로세스가 실행되기까지 얼마나 기다리나
- 응답 시간: 사용자가 키보드 누르고 반응까지 걸리는 시간
- 공정성: 특정 프로세스가 영원히 기다리지 않는가
- 처리량: 단위 시간에 끝내는 작업 수
선점형 vs 비선점형
비선점형: 실행 시작하면 끝날 때까지 CPU를 뺏지 않음. FCFS, SJF.
선점형: 실행 중에도 더 급한 프로세스가 오면 CPU를 뺏음. 라운드 로빈, 선점형 SJF(SRTF).
현대 OS는 거의 다 선점형입니다. 안 그러면 하나의 프로세스가 CPU를 독점해서 다른 앱이 멈춰 버립니다.
FCFS — 먼저 온 순서대로
First Come, First Served. 가장 단순. 도착 순서대로 실행.
P1(6ms) → P2(2ms) → P3(1ms)
간트: [ P1 ][P2][P3]
시간: 0 6 8 9
대기: P1=0, P2=6, P3=8
평균: (0+6+8)/3 = 4.7ms
문제: Convoy Effect. 앞에 긴 프로세스가 있으면 뒤의 짧은 프로세스들이 전부 오래 기다림. 마트에서 카트 가득 채운 사람 뒤에 음료수 하나 든 사람이 줄 서는 것과 같음.
SJF — 짧은 것 먼저
Shortest Job First. 실행 시간이 짧은 프로세스를 먼저.
P3(1ms) → P2(2ms) → P1(6ms)
간트: [P3][P2][ P1 ]
시간: 0 1 3 9
대기: P3=0, P2=1, P1=3
평균: (0+1+3)/3 = 1.3ms
같은 프로세스인데 평균 대기가 4.7 → 1.3으로. 짧은 것부터 끝내면 전체 대기가 줄어드는 게 수학적으로 증명되어 있습니다 (optimal for average waiting time).
문제: 기아(Starvation). 짧은 프로세스가 계속 오면 긴 프로세스는 영원히 실행 못함. 그리고 실제로는 실행 시간을 미리 알 수 없음 — 추정해야 합니다.
라운드 로빈 — 시간을 나눠 쓰기
Round Robin. 각 프로세스에 quantum(시간 조각)만큼 CPU를 주고, 다 못 끝내면 뒤로 보냄.
quantum = 2ms 예시:
P1(2ms) → P2(2ms) → P3(1ms) → P1(2ms) → P1(2ms)
간트: [P1][P2][P3][P1][P1]
시간: 0 2 4 5 7 9
장점: 공정함. 모든 프로세스가 돌아가며 CPU를 받음. 응답 시간이 좋음 — 사용자가 앱이 "멈춘다"고 느끼지 않음.
quantum 크기가 핵심:
- quantum이 너무 크면 → FCFS와 같아짐
- quantum이 너무 작으면 → 문맥 교환 오버헤드가 커짐
- 보통 10~100ms 사이
우선순위 스케줄링
프로세스마다 우선순위 부여. 높은 우선순위를 먼저 실행.
실시간 시스템(비행기 제어, 의료 장비)에서 중요합니다 — 중요한 작업이 반드시 제때 실행되어야 하니까.
문제: 기아. 낮은 우선순위 프로세스가 영원히 안 돌아갈 수 있음.
해결: Aging. 대기 시간이 길어지면 우선순위를 점진적으로 올려줌.
지표 정리
시험에서는 대기 시간과 반환 시간을 구하라는 문제가 가장 많이 나옵니다.
흔한 실수
"SJF가 항상 최고다" — 평균 대기 시간은 최소지만, 기아 문제가 있고 실행 시간을 미리 알 수 없습니다. 실전에서 순수 SJF를 쓰는 OS는 없습니다.
"대기 시간과 응답 시간을 혼동" — 라운드 로빈에서 프로세스가 중간에 선점되면 대기 시간과 응답 시간이 다릅니다. 응답 시간은 첫 실행까지, 대기 시간은 총 기다린 시간.
"quantum이 작을수록 좋다" — 아닙니다. 문맥 교환(context switch)에도 시간이 듭니다. quantum이 1ms인데 문맥 교환이 0.5ms면, CPU 시간의 33%를 낭비하는 거죠.