CPU 스케줄링
준비 상태의 프로세스 중 어떤 것에 CPU를 할당할지 결정하는 정책
스케줄링 기준
| 지표 | 설명 | 목표 |
|---|
| CPU 이용률 | CPU 사용 비율 | 최대화 |
| 처리량 | 단위 시간당 완료 수 | 최대화 |
| 대기 시간 | Ready Queue 대기 | 최소화 |
| 응답 시간 | 첫 응답까지 시간 | 최소화 |
| 반환 시간 | 제출~완료 시간 | 최소화 |
비선점 vs 선점
[비선점] CPU 자발적 반환
프로세스가 끝나거나 I/O 할 때만 전환
예: FCFS, SJF
[선점] 강제로 빼앗을 수 있음
타임 슬라이스 만료, 높은 우선순위 도착
예: Round Robin, SRTF, 멀티레벨
주요 알고리즘
[FCFS] 선착순
P1(24ms) P2(3ms) P3(3ms)
|---P1---24---|P2-27|P3-30|
평균 대기: (0+24+27)/3 = 17ms
→ Convoy Effect (긴 작업 뒤에 줄서기)
[SJF] 짧은 작업 우선
P2(3ms) P3(3ms) P1(24ms)
|P2-3|P3-6|---P1---30---|
평균 대기: (6+0+3)/3 = 3ms
→ 최적! 하지만 실행시간 예측 어려움
[RR] 라운드 로빈 (quantum=4ms)
|P1|P2|P3|P1|P1|P1|P1|P1|
→ 공정, 응답 시간 좋음
→ quantum 크면 FCFS, 작으면 오버헤드
| 알고리즘 | 선점 | 장점 | 단점 |
|---|
| FCFS | 비선점 | 단순 | Convoy |
| SJF | 비선점 | 최적 대기시간 | 예측 어려움 |
| SRTF | 선점 | SJF 선점형 | 기아 가능 |
| RR | 선점 | 공정, 응답 좋음 | quantum 선택 |
| Priority | 둘다 | 중요도 반영 | 기아 |
| MLFQ | 선점 | 적응형 | 복잡 |
실무: MLFQ (멀티레벨 피드백 큐)
Queue 0 (높은 우선순위, quantum=8ms)
↓ 시간 초과 시 강등
Queue 1 (중간, quantum=16ms)
↓ 시간 초과 시 강등
Queue 2 (낮은, FCFS)
I/O 완료 → 최상위 큐로 승격
→ I/O 바운드 우대, CPU 바운드 점진적 강등
→ Linux CFS: 모든 프로세스에 공정한 CPU 시간 분배
Q.선점형과 비선점형 스케줄링의 차이는?
실행 중인 프로세스에게서 CPU 를 뺏을 수 있는지가 다릅니다.
| 항목 | 선점형 | 비선점형 |
|---|
| CPU 회수 | 강제로 뺏는다 | 스스로 놓을 때까지 기다린다 |
| 응답성 | 좋다 | 나쁘다. 긴 작업 뒤에서 오래 기다린다 |
| 문맥 교환 | 잦다 | 적다 |
| 공유 자원 | 중간에 뺏겨 일관성 문제가 생길 수 있다 | 상대적으로 단순 |
| 예 | 라운드 로빈, 다단계 큐 | FCFS, 비선점 SJF |
현대 범용 운영체제는 모두 선점형입니다. 비선점이면 무한 루프에 빠진 프로그램 하나가 시스템 전체를 멈추기 때문입니다.
비선점이 나은 곳도 있습니다. 처리량만 중요한 배치 시스템은 교환 비용이 없는 쪽이 유리합니다.
흔한 실수: 선점을 "우선순위가 높으면 뺏는다"로만 설명하는 것. 시간 할당량이 끝나도 뺏습니다. 우선순위와 무관하게 공평하게 나누는 것도 선점입니다.
Q.Round Robin의 타임 퀀텀이 성능에 미치는 영향은?
너무 크면 순서대로 처리하는 것과 같아지고, 너무 작으면 교환 비용이 실제 일을 잡아먹습니다.
| 퀀텀 | 결과 |
|---|
| 매우 크다 | 사실상 FCFS. 응답 시간이 나빠진다 |
| 적당하다 | 응답성과 처리량이 균형을 이룬다 |
| 매우 작다 | 문맥 교환이 폭증해 실제 작업 시간이 줄어든다 |
기준은 문맥 교환 비용과의 비율입니다. 교환에 10마이크로초가 든다면 퀀텀이 100마이크로초일 때 10%를 교환에 쓰는 셈입니다. 보통 대부분의 작업이 한 퀀텀 안에 끝나도록 잡습니다.
리눅스는 고정 퀀텀 대신 목표 지연 시간을 두고 실행 가능한 프로세스 수로 나누는 방식을 씁니다. 프로세스가 많아지면 각자의 몫이 자동으로 줄어듭니다.
흔한 실수: 퀀텀을 작게 할수록 공평하다고 답하는 것. 공평해지지만 전체 처리량이 떨어져 모두가 느려집니다.
Q.SJF가 최적인 이유와 실무에서 못 쓰는 이유는?
평균 대기 시간을 최소로 만드는 것이 증명돼 있습니다. 짧은 작업을 먼저 끝내면 뒤에서 기다리는 총 시간이 줄어듭니다.
A(10초), B(1초), C(1초) 세 작업으로 비교하면 이렇습니다.
| 실행 순서 | 각자의 대기 시간 | 합계 |
|---|
| A, B, C | 0초, 10초, 11초 | 21초 |
| B, C, A | 0초, 1초, 2초 | 3초 |
실무에서 못 쓰는 이유는 두 가지입니다.
| 이유 | 내용 |
|---|
| 실행 시간을 미리 모른다 | 각 요청이 얼마나 걸릴지 사전에 알 수 없다 |
| 기아 | 짧은 작업이 계속 들어오면 긴 작업이 영원히 밀린다 |
첫 번째는 과거 실행 시간으로 추정해 완화할 수 있고, 두 번째는 기다린 시간만큼 우선순위를 올려주는 방식으로 막습니다.
흔한 실수: 기아만 말하고 실행 시간을 모른다는 점을 빼는 것. 후자가 더 근본적인 제약입니다.
Q.MLFQ 스케줄링을 설명해주세요.
우선순위가 다른 여러 큐를 두고, 관측된 행동에 따라 프로세스를 옮기는 방식입니다.
| 규칙 | 내용 |
|---|
| 시작 | 가장 높은 큐에서 시작한다 |
| 할당량을 다 쓰면 | 한 단계 낮은 큐로 내린다 |
| 다 쓰기 전에 I/O 로 내려가면 | 우선순위를 유지한다 |
| 주기적으로 | 모두 최상위로 올린다 |
이 규칙이 만드는 효과는 실행 시간을 미리 몰라도 짧은 작업 우선과 비슷하게 동작한다는 것입니다. 짧은 작업은 끝나기 전에 큐를 내려갈 일이 없어 빨리 처리되고, 긴 작업은 자연히 아래로 내려갑니다.
네 번째 규칙이 기아를 막습니다. 아래에서 오래 기다린 프로세스도 주기적으로 위로 올라와 실행 기회를 얻습니다.
흔한 실수: 마지막 규칙을 빼고 답하는 것. 그것이 없으면 긴 작업이 최하위에 갇혀 영원히 밀립니다. 그리고 짧게 쓰고 내려가는 작업의 우선순위를 유지하는 것이 대화형 응답성을 지키는 핵심입니다.
먼저 스스로 답해보고 아래 답변과 견줘보세요. 막히는 부분은 문제로 확인할 수 있어요.
읽었으면 문제로 확인해보세요
운영체제 문제를 풀면 틀린 문제가 자동으로 노트에 쌓입니다. 가입 없이 5문제를 먼저 풀어볼 수도 있어요.