프로세스 스케줄링은 한 문장입니다: "CPU가 하나인데 프로세스가 여러 개면, 누구를 먼저 실행할 것인가?"

같은 프로세스 3개도 순서만 바꾸면 평균 대기 시간이 4.7ms에서 1.3ms로 줄어들 수 있습니다. 아래에서 직접 확인해 보세요.

스케줄링 알고리즘 — 간트 차트 비교

같은 프로세스 3개, 다른 정책 — 대기 시간이 어떻게 달라지는지 보세요.

P1실행 시간: 6ms
P2실행 시간: 2ms
P3실행 시간: 1ms
P1
P2
P3
0
6
8
9
P1 대기: 0msP2 대기: 6msP3 대기: 8ms
평균 대기: 4.7ms

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. 대기 시간이 길어지면 우선순위를 점진적으로 올려줌.

지표 정리

대기 시간=완료 시각도착 시각실행 시간\text{대기 시간} = \text{완료 시각} - \text{도착 시각} - \text{실행 시간} 반환 시간=완료 시각도착 시각\text{반환 시간} = \text{완료 시각} - \text{도착 시각} 응답 시간=첫 실행 시각도착 시각\text{응답 시간} = \text{첫 실행 시각} - \text{도착 시각}

시험에서는 대기 시간과 반환 시간을 구하라는 문제가 가장 많이 나옵니다.

흔한 실수

"SJF가 항상 최고다" — 평균 대기 시간은 최소지만, 기아 문제가 있고 실행 시간을 미리 알 수 없습니다. 실전에서 순수 SJF를 쓰는 OS는 없습니다.

"대기 시간과 응답 시간을 혼동" — 라운드 로빈에서 프로세스가 중간에 선점되면 대기 시간과 응답 시간이 다릅니다. 응답 시간은 실행까지, 대기 시간은 기다린 시간.

"quantum이 작을수록 좋다" — 아닙니다. 문맥 교환(context switch)에도 시간이 듭니다. quantum이 1ms인데 문맥 교환이 0.5ms면, CPU 시간의 33%를 낭비하는 거죠.

연습 문제
#1쉬움
위 간트 차트에서 FCFS → SJF로 바꿔보세요. 평균 대기 시간이 얼마나 줄어드나요?
힌트
짧은 프로세스가 앞으로 가면 뒤에서 기다리는 프로세스 수가 줄어듭니다.
#2보통
라운드 로빈(quantum=2)에서 P1(burst=6)은 몇 번에 걸쳐 실행되나요? 총 문맥 교환 횟수는?
힌트
burst ÷ quantum = 실행 횟수.
#3어려움
P1(burst=5, 도착=0), P2(burst=3, 도착=1), P3(burst=2, 도착=2)일 때 FCFS와 비선점 SJF의 평균 반환 시간을 구하시오.

자주 묻는 질문

프로세스 스케줄링을 쉽게 말하면 무엇인가요?
프로세스 스케줄링은 준비 상태의 프로세스 중 다음에 어떤 프로세스가 CPU를 받을지 운영체제가 결정하는 것입니다. 스케줄링 규칙에 따라 공정성, 빠른 응답, 높은 처리량 등에서 유리한 점이 달라집니다.
가장 좋은 스케줄링 알고리즘은 하나로 정해져 있나요?
아니요. 짧고 상호작용이 많은 작업에 잘 맞는 정책이 긴 CPU 중심 작업이나 실시간 마감이 있는 작업에는 잘 맞지 않을 수 있으므로, 최선의 선택은 작업 부하와 목표에 따라 달라집니다.

문제 풀이가 필요하신가요?

문제를 올리면 검증된 단계별 풀이를 몇 초 만에 받을 수 있습니다.

GPAI Solver 열기 →