스케줄링: 다중 프로그래밍을 가능하게 하는 운영체제의 동작 기법.
핵심질문: 스케줄링 정책은 어떻게 개발하는가?
- 스케줄링 정책의 핵심 가정은?
- 어떠한 평가 기준이 중요한지?
- 컴퓨터 시스템에 사용된 기본 접근법은?
아래의 내용을 통해 스케줄링 정책이 어떻게 개발되는지 알아볼 것
워크로드(workload): 일련의 프로세스들이 실행하는 상황
워크로드에 대한 가정
- 모든 작업은 같은 시간동안 실행됨 (실행시간 일정함)
- 모든 작업은 동시에 도착
- 각 작업은 시작되면 완료될 때까지 실행됨
- 모든 작업은 CPU만 사용(입출력 x)
- 각 작업의 실행시간은 사전에 알려져 있음
이 가정은 매우 이상적이고 비현실적임
고로 논의가 진행됨에 따라 가정을 완화시킬 것이고,
최종적으로 "제대로 동작하는 스케줄링 정책"을 만들 것임
스케줄링의 정책 비교를 위해 스케줄링 평가 항목(scheduling metric)을 결정해야함
스케줄링 평가 항목
반환 시간
= 작업 완료 시각
- 작업 도착 시간
작업 도착 시간 = 0
이라고 볼 수 있다반환 시간
= 작업 완료 시각
(가정 완화할 것임)반환시간
은 성능 측면에서의 평가기준 (성능 ↔️ 공정성)(원래는 평가 기준 다양한데, 문제를 간단히 하기 위해 "반환시간"이라는 하나의 평가기준만을 사용)
선입선출의 스케줄링 방법은
그러나 FIFO 스케줄링은 1번 가정을 완화하면 성능이 안 좋아짐
convoy effect: 짧은 프로세스들이 오래걸리는 프로세스의 종료를 기다리는 현상
그렇다면 작업 실행 시간이 다른 경우 더 좋은 알고리즘은?
최단 작업 우선(Shortest Job First, SJF): 실행시간 가장 짧은 작업 먼저 처리
참고로 옛날에는 비선점(non-preemptive) 스케줄러가 개발되었었음. 비선점 스케줄러는 각 작업이 종료될 때까지 계속 실행 (위의 예와 비슷).
현대 스케줄러는 모두 선점형 스케줄러 (문맥교환 가능)
위의 문제를 해결하기 위해서는 가정 3 (작업은 끝날 때까지 계속 실행)을 완화해야한다.
즉, 프로세스 A가 아직 안 끝났어도 A를 중지하고 B나 C를 실행하기로 결정하는 것이다. (물론 이후 A는 다시 실행됨)
최소 잔여시간 우선(STCF): 잔여시간이 적은 작업부터 처리
현재까지의 가정 (바뀐것 포함)
1.모든 작업 실행시간 일정-> 실행시간 일정하지 않음
2.모든 작업은 동시에 도착-> 작업 도착 시간 다를 수 있음
3. 각 작업은 시작되면 완료될 때까지 실행됨
4. 모든 작업은 CPU만 사용(입출력 x)
5. 각 작업의 실행시간은 사전에 알려져 있음평가 기준: 반환 시간
앞선 문제들에서는 문제를 간단히 하기 위해 평가기준을 오로지 "반환시간" 하나만 설정하였다.
과거에는 반환시간만 가지고도 유의미한 스케줄링을 할 수 있었지만, 시분할 컴퓨터의 등장으로 사용자는 시스템에게 상호작용을 원활이 하게 되었다.
따라서 이제는 원활한 상호작용을 위한 "응답시간"이라는 새로운 평가기준이 필요
응답시간에 민감한 스케줄러는 어떻게 만들 수 있을까?
라운드 로빈(Round-Robin, RR) 스케줄링: 작업을 처음부터 끝까지 실행시키지 않고, 일정 시간(타임 슬라이스)동안 실행한 후 실행 큐의 다음 작업으로 전환하는 방식
RR과 같은 공정한 정책은 작업들이 균등하게 수행되는 것이 목표.
응답과 상호작용 측면에선 좋지만, 반환 시간의 측면에선 안 좋음
SJF, STCF과 같은 불공정한 정책은 반환 시간을 최적화하는 것이 목표.
하나의 작업을 끝까지 실행할 수 있지만, 나머지 작업들이 대기해야 될 수 있음 (응답 시간의 측면에서 안 좋음)
결국 응답시간과 반환시간 중 하나를 최적화하면 나머지 하나는 안 좋아지고, 절충이 필요함
현재까지의 가정 (바뀐것 포함)
1.모든 작업 실행시간 일정-> 실행시간 일정하지 않음
2.모든 작업은 동시에 도착-> 작업 도착 시간 다를 수 있음
3.각 작업은 시작되면 완료될 때까지 실행됨-> 작업 완료 전에 다른 작업으로 전환 가능
4. 모든 작업은 CPU만 사용(입출력 x)
5. 각 작업의 실행시간은 사전에 알려져 있음평가 기준: 반환 시간, 응답 시간
이번에는 가정 4를 완화하여 입출력 작업도 수행한다고 하자.
입출력 작업을 요청한 경우 스케줄러는 다음에 어떤 작업을 실행시킬지 결정해야함.
또한 입출력 완료 시에도 의사결정 필요
두 프로세스 A,B가 있고, 각 작업은 50초 소요
프로세스 A는 10초동안 실행된 후 입출력 요청을 함 (입출력 시간은 10초)
현재까지의 가정 (바뀐것 포함)
1.모든 작업 실행시간 일정-> 실행시간 일정하지 않음
2.모든 작업은 동시에 도착-> 작업 도착 시간 다를 수 있음
3.각 작업은 시작되면 완료될 때까지 실행됨-> 작업 완료 전에 다른 작업으로 전환 가능
4.모든 작업은 CPU만 사용(입출력 x)-> 입출력을 사용하는 작업 존재
5. 각 작업의 실행시간은 사전에 알려져 있음평가 기준: 반환 시간, 응답 시간
그러나 마지막 가정(5. 각 작업의 실행시간은 사전에 알려져 있음)이 있었기에 위의 스케줄러들이 힘을 쓸 수 있었던 것.
즉, 미래를 예측할 수 없는 운영체제의 근본적인 문제는 해결할 수 없음
다만, 가까운 과거를 이용하여 미래를 예측하는 스케줄러는 구현 가능!
(다음 장의 주제인 "멀티 레벨 피드백 큐")
https://github.com/remzi-arpacidusseau/ostep-homework/tree/master/cpu-sched
에 있는 scheduler.py를 실행시켜보며 문제를 해결해보자
길이가 200인 세 개의 작업을 SJF와 FIFO 스케줄링 방식으로 실행할 경우 응답시간과 반환 시간을 계산하시오.
./scheduler.py -p SJF -l 200,200,200 -c
./scheduler.py -p FIFO -l 200,200,200 -c
같은 조건이지만 작업의 길이가 각각 100, 200 및 300일 경우에 대해 계산하시오.
./scheduler.py -p SJF -l 100,200,300 -c
./scheduler.py -p FIFO -l 100,200,300 -c
2번과 같은 조건으로 타임 슬라이스가 1인 RR스케줄러에 대해서도 계산하시오.
./scheduler.py -p RR -q 1 -l 100,200,300 -c
SJF와 FIFO가 같은 반환 시간을 보이는 워크로드의 유형은 무엇인가?
SJF가 RR과 같은 응답 시간을 보이기 위한 워크로드와 타임 퀀텀의 길이는 무엇인가?
작업의 길이 순으로 오름차순으로 시스템에 도착하고, 타인 퀀텀의 길이가 제일 긴 작업보다 큰 경우
사실 처음에는 타인 퀀텀의 길이가 제일 긴 작업보다 크면 된다고 생각했으나, 아니였음
./scheduler.py -p SJF -l 100,200,300 -c
./scheduler.py -p RR -q 300 -l 300,200,100 -c
작업의 길이가 증가하면 SJF의 응답 시간은 어떻게 되는가?
변화의 추이를 보이기위해서 시뮬레이터를 사용할 수 있는가?
./scheduler.py -p SJF -l 100,200,300 -c
./scheduler.py -p SJF -l 200,300,400 -c
./scheduler.py -p SJF -l 300,400,500 -c
타임 퀀텀의 길이가 증가하면 RR의 응답 시간은 어떻게 되는가?
(작업: 100,200,300)
N개의 작업이 주어졌을 때, 최악의 응답 시간을 계산하는 식을 만들 수 있는가?
(N-1)*q
(N-1)q / N