프로세스 스케줄링은 한 문장입니다: "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로 바꿔보세요. 평균 대기 시간이 얼마나 줄어드나요? 왜 줄어드는지 설명하세요.
Hint
짧은 프로세스가 앞으로 가면 뒤에서 기다리는 프로세스 수가 줄어듭니다.
#2보통
라운드 로빈(quantum=2)에서 P1(burst=6)은 몇 번에 걸쳐 실행되나요? 총 문맥 교환 횟수는?
Hint
burst ÷ quantum = 실행 횟수. 문맥 교환은 프로세스가 바뀔 때마다.
#3어려움
P1(burst=5, 도착=0), P2(burst=3, 도착=1), P3(burst=2, 도착=2)가 주어졌을 때, FCFS와 비선점 SJF의 평균 반환 시간을 각각 구하시오.
Hint
반환 시간 = 완료 시각 − 도착 시각. 도착 시각이 다르면 SJF에서 선택 가능한 프로세스가 달라집니다.

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

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

GPAI Solver 열기 →