December 24, 2019
반효경 교수님 <운영체제 수업(2014)>을 듣고 추가 자료를 덧붙여 정리한 내용입니다.
여러 개의 프로그램이 실행될 때 다음과 같은 이슈가 발생한다.
이러한 이슈들을 해결하는 작업이 바로 CPU 스케줄링이다. 즉, 어떤 프로세스에게 얼마 동안 CPU를 할당할지 결정하는 작업이라고 할 수 있다.
하나의 프로세스가 실행될 때 CPU burst와 I/O burst가 교대로 실행된다.
프로그램 실행중에 연속적으로 CPU를 사용하는 단절된 구간이다. (스케줄링의 단위)
프로그램 실행중에 I/O작업이 끝날때까지 block되는 구간이다.
프로세스의 종류에 따라 CPU burst / I/O burst의 빈도와 길이가 다르다. 이러한 특성에 따라 프로세스를 다음의 두 가지로 나눌 수 있다.
I/O bound process
CPU bound process
컴퓨터 안에서 다양한 종류의 process(= job)가 섞여 있기 때문에 CPU 스케줄링이 필요하다.
e.g. CPU 스케줄링으로 I/O bound job에 우선적으로 CPU 할당
(CPU bound job이 CPU를 잡고 놓지 않을 경우 I/O bound job은 하염없이 기다려야 하고 사용자는 답답함을 느끼게 되기 때문)
CPU Scheduler와 Dispatcher는 운영체제 커널 코드의 한 부분으로(별도의 하드웨어X), 각각 다음의 역할을 수행한다.
CPU Scheduler
Dispatcher
wait()
for child)Blocked → Ready (e.g. completion of I/O)
일반적으로 I/O작업이 끝나면 I/O작업을 요청했던 프로세스를 Ready 상태로만 변경할 뿐 즉시 CPU를 할당하지는 않는다. 하지만 I/O를 요청했던 프로세스가 우선순위가 가장 높은 프로세스였을 경우 I/O 작업이 완료되자마자 해당 프로세스에게 CPU를 할당한다. (우선순위 기반 CPU 스케줄링)
nonpreemptive
(비선점형) ─ 자진 반납preemtive
(선점형) ─ 강제로 빼앗음Performance Index 또는 Performance Measure라고도 한다.
시스템 입장에서의 성능 척도
→ 제한된 시간 내에 최대한 많은 프로세스를 처리 (‘작업량’이 관건)
Throughput(처리량)
: 단위 시간당 완료한 프로세스들의 개수
네트워크에서는 단위 시간당 전송한 양을 의미 (e.g. Mbps, Kbps)
프로세스 입장에서의 성능 척도
→ CPU를 최대한 빨리 얻어서 빨리 실행 (‘시간’이 관건)
<Case 1>
Process | Burst Time |
---|---|
P1 | 24 |
P2 | 3 |
P3 | 3 |
<Case 2>
nonpreemtive 방식이기 때문에 먼저 처리하는 프로세스의 burst time에 따라 average waiting time이 달라진다.
burst time이 긴 프로세스가 ready queue에 먼저 들어오게 되면 나중에 들어온 모든 프로세스들은 기다릴 수밖에 없다. (convoy effect
)
이러한 문제점을 해결하려면 burst time이 짧은 프로세스를 먼저 처리하면 된다.
<Case 1 - nonpreemtive>
Process | Arrival Time | Burst Time |
---|---|---|
P1 | 0 | 8 |
P2 | 1 | 4 |
P3 | 2 | 9 |
P4 | 3 | 5 |
가장 먼저 도착한 P1부터 실행한다. P1의 실행이 완료되면 (P2, P3, P4가 모두 도착해있는 상태) burst time이 짧은 P2 → P4 → P3 순으로 실행한다.
<Case 2 - preemtive>
Process | Arrival Time | Burst Time |
---|---|---|
P1 | 0 | 8 |
P2 | 1 | 4 |
P3 | 2 | 9 |
P4 | 3 | 5 |
※ Arrival Time: ready queue에 들어온 시점
preemtive 방식에서 계산된 average waiting time은 최적화된 값이므로, 위와 같은 예제에서는 6.5ms 보다 짧은 average waiting time을 얻을 수 없다.
해결방법: Aging 기법
사람이 나이를 먹는 것처럼 프로세스도 시간이 지나면 priority가 1씩 높아지게 된다. 따라서 아무리 낮은 priority를 가지고 있는 프로세스도 언젠가는 높은 priority를 갖게 되기 때문에 CPU에 의해 실행될 수 있게 된다.
해결방법 : exponential average을 사용, 과거 burst time 패턴을 통해 ‘추정’할 수 있다.
최근 데이터일수록 더 큰 비중으로 반영하고 오래된 데이터 일수록 적은 비중으로 반영하는 특성이 있다.
CPU burst time을 예측할 필요가 없고 모든 프로세스가 CPU를 얻을 수 있다.
어떤 프로세스도
할당 시간 단위(q) x (프로세스 개수(n) - 1)
만큼의 시간 이상 기다릴 필요가 없다. 이 시간 내에 반드시 실행할 기회가 주어진다.
→ 다양한 burst time을 가지는 프로세스들이 뒤섞여 있을 때 효과적 (burst time이 길어도 CPU를 얻을 수 있기 때문에)
Process | Burst Time |
---|---|
P1 | 24 |
P2 | 3 |
P3 | 3 |
일반적으로 SJF보다 Turnaround time, Waiting time은 길지만 Response Time은 더 짧다.
모든 프로세스가 동일한 burst time을 가지는 경우
→ FCFS: 먼저 도착한 프로세스를 먼저 처리하여 종료시킬 수 있지만
→ Round-Robin: 모든 프로세스를 일정 단위로 잘게 쪼개서 번갈아가며 처리하기 때문에 Turnaround time, Waiting time이 길어지고 모든 프로세스가 마지막까지 메모리에 남아있다가 거의 동시다발적으로 종료된다.
Reference