CPU 스케쥴링이란
- 운영체제가 CPU 자원을 어떤 프로세스에게 할당해줄지 그 일정을 짜는 것
- 하나의 프로세스가 끝나고 다음으로 수행할 프로세스를 선택할 때 그 기준이 되는 알고리즘
스케쥴링의 목표
-
Batch System : 가능하면 많은 일을 수행, 시간 보다는 처리량이 중요
-
Interactive System : 빠른 응답 시간, 작은 대기 시간
-
Real-Time System : 기한 (deadline) 맞추기
스케쥴링 상황
-
프로세스가 종료(terminates) 될 때
-
프로세스가 실행 상태(running) 에서 대기 상태(waiting)으로 전환될 때
- 입출력 요청이나 자식 프로세스가 종료되기를 기다리기 위해 wait 호출 시
- 프로세스가 실행 상태(running) 에서 준비 완료(ready) 상태로 전환 될 때
- 인터럽트의 발생 혹은 time-slice 의 만료, 더 큰 우선순위의 프로세스가 들어올 경우
- 프로세스가 대기 상태(waiting) 에서 준비 완료 상태 (ready) 로 전환 될 때
프로세스의 상태 변화
Admitted, 승인
Scheduler Dispatch
- 준비 상태에 있는 프로세스 중 하나를 선택하여 실행시키는 것
Interrupt
- 예외, 입출력, 이벤트 등이 발생해 현재 실행중인 프로세스를 준비 상태로 바꾸고 해당 작업을 먼저 처리 하는 것
입출력 / 이벤트 대기 상태
- 실행중인 프로세스가 입출력이나 이벤트를 처리해야 하는 경우, 입출력 / 이벤트가 모두 끝날 때 까지 대기 상태로 만드는 것
입출력 / 이벤트 완료
- 입출력 / 이벤트가 끝난 프로세스를 준비 상태로 전환해 스케쥴러에 의해 선택될 수 있도록 만드는 것
스케쥴링 알고리즘 성능 지표
사용자 관점
- 반환 시간, turnaround time
- 프로세스 처음 시작부터 종료까지 걸린 시간
- CPU 사용시간, waiting, 입출력 등 모든 시간을 포함
- 대기 시간, waiting time
- CPU를 점유하기 위해 대기열 (ready queue) 에서 기다린 시간
- 다른 큐에서 기다린 시간 제외
- 응답 시간, response time
- 일반적으로 대화형 시스템에서 입력에 대한 반응 시간
시스템 관점
- CPU 이용률
- 총 경과 시간 대비 프로세스에 CPU 가 이용되는 시간 비율
- 처리율, throughout
비선점(nonpreemptive) 알고리즘
- 프로세스 종료 or I/O 등의 이벤트가 있을 때까지 실행 보장 (처리시간 예측 용이함)
1. FCFS, First Come First Served
- 큐에 도착한 순서대로 CPU 시간 할당
- 일괄 처리 시스템에 적합함
- 대화형 시스템에는 부적합
- 실행 시간이 긴 프로세스가 앞에 있다면 평균 대기 시간이 길어짐
Convey Effect
CPU 처리 시간이 길지만 덜 중요한 작업이 CPU 처리 시간이 짧고 중요한 작업을 기다리게 하는 상태
2. SJF, Shortest Job First
- 수행 시간이 짧다고 판단되는 순서대로, 동일하다면 FCFS 로
- 평균 대기 시간이 짧음
- 다수의 프로세스에 빠른 응답
- 무한 대기가 발생할 수 있음
- 실제로 수행되기 전에는 CPU 점유 시간을 알 수 없기 때문에 비현실적
3. HRN, Highest Response Ratio Next
- SJF 방식의 기아 현상을 해결하기 위해 고안
- CPU 처리 시간과 ready queue 에서의 대기 시간을 함께 고려
- 우선순위 = (대기시간 + CPU 처리 시간) / CPU 처리 시간
- 선점이라면 대기시간이 계속해서 변경되어 반영되기 때문에 context switching 이 너무 자주 발생
- 역시 실제로 수행되기 전에는 CPU 점유 시간을 알 수 없기 때문에 비현실적
선점(preemptive) 알고리즘
- OS가 CPU의 사용권을 선점할 수 있는 경우, 강제 회수하는 경우 (처리시간 예측 어려움)
1. SRT, Shortest Remaining Time
- SJF 의 선점 버전
- 현재 CPU를 점유 중인 프로세스보다 남은 CPU 처리 시간이 짧은 프로세스가 ready queue 에 들어올 경우 CPU 점유 가져감
2. 우선 순위, Priority
- 정적/동적으로 우선순위를 부여하여 우선순위가 높은 순서대로 처리
- 동적 부여 : 구현이 복잡, 오버헤드가 커짐, 시스템 응답 속도는 빠름
- 정적 부여 : 구현이 쉬움, 오버헤드 작음, 시스템 응답 속도 느림
- 우선 순위가 낮은 프로세스가 무한정 기다리는 Starvation 이 생길 수 있음
- Aging 방법으로 Starvation 문제 해결 가능
- 동일한 우선순위라면 FCFS
3. Round Robin
- FCFS + 선점 + time slice
- 모든 프로세스가 돌아가며 CPU 시간 할당 받음
- time slice 시간이 경과하면 다음 프로세스로 CPU 할당 넘어감
- 시분할 시스템에서 사용
- 응답시간이 짧음, 대화형 시스템에서 사용됨
- 알고리즘 성능이 time slice에 의존적이다.
- time slice 가 크면 FCFS 와 유사해짐
- time slice 가 작으면 context switching 이 잦아져 오버헤드가 커짐
4. 다단계 큐, Multi-Level Queue
- 프로세스를 성격에 따라 여러 그룹으로 나누고 각 그룹마다 ready queue 가 존재
- 각 queue 마다 다른 스케쥴링 방식을 적용할 수 있음
Foreground Queue & Background Queue
운영체제는 프로세스를 분류할 때 사용자와 직접 상호작용하는 프로세스와 백그라운드에서 돌아가는 프로세스의 중요도를 다르게 분류한다. 사용자와 상호작용하는 프로세스는 빠르게 처리되어야 하고 백그라운드에서 돌아가는 프로세스는 조금 느리게 처리되어도 괜찮기 때문이다.
ex) Forground Queue 엔 Round Robin / Background Queue 엔 FCFS 적용
큐간의 스케쥴링
프로세스 스케쥴링이 아닌, 어떤 큐에 CPU를 할당할건지에 대한 스케쥴링
- 고정 우선순위 스케쥴링, Fixed Priority Scheduling
- 큐마다 우선순위 지정
- 우선순위가 높은 큐에 프로세스가 남아있다면 무조건 다 처리하고 다음 큐로 넘어감
- 우선순위가 낮은 큐에 기아상태 발생 가능
- Aging 으로 극복 가능
- 시분할 스케쥴링, time slice
- 시간의 비율에 따라 운영체제가 queue를 서비스
- 각 큐마다 사용할 수 있는 cpu 시간을 분배하는 방법
- ex) CPU 시간의 75% 는 Foreground Queue에, 25%는 Background Queue 에
5. 다단계 피드백 큐, Multi-Level Feedback Queue
- 프로세스들이 큐간 이동을 할 수 있는 다단계 큐 방식
- 프로세스 생성 시 가장 높은 우선순위 ready queue 에 등록되며 등록된 프로세스는 FCFS 순서로 CPU 할당받아 실행됨
- 해당 큐의 time quantum이 끝나면 한 단계 아래 큐에 들어가게 됨
- 내려갈수록 time quantum이 증가
- CPU burst는 낮은 우선순위 큐, I/O burst 는 높은 우선순위 큐에 배치
- 가장 하위 큐는 FCFS
- 가장 하위 큐에서 너무 오래 기다린 프로세스는 다시 상위 큐로 이동하는 Aging 으로 기아상태를 예방
- 예
Burst
- 다중 프로그래밍의 목적은 CPU 이용률을 최대화하기 위함
- 어느 한 순간에 메모리 내에 다수의 프로세스들이 유지되면 어떤 프로세스가 waiting 할 경우운영체제는 그 프로세스로부터 CPU를 회수해 다른 프로세스에 할당한다.
burst는 특정 기준에 따라 한 단위로서 취급되는 연속된 신호나 데이터의 모임이다. 즉, 입출력 요청을 위해 CPU 사용을 사용했다가 쉬었다가를 반복한다. 프로세스가 CPU를 사용할때를 CPU버스트, 입/출력을 기다릴때를 입/출력 버스트라고 한다.
프로세스의 실행은 CPU 버스트를 시작으로 뒤이어 입출력 버스트가 발생하는 식으로 두 버스트의 사이클로 구성된다. 마지막 CPU버스트는 또 다른 입출력 버스트가 뒤따르는 대신에 실행을 종료하기 위한 시스템 요청과 함께 끝난다.
- 입출력 중심의 프로세스는 CPU 버스트 시간이 짧을 것
- CPU 지향 프로그램은 CPU 버스트 시간이 길 것
- 이러한 분포는 CPU 스케쥴링 알고리즘 선택에 매우 중요하다.