다양한 스케줄링 평가 척도가 있음
모든 척도를 동시에 최적화하는 것은 불가능
response time은 빠른것을 의미하는게 아니다.
특정 deadline을 넘기지 않는 시스템이다.
프로세스가 실행이 되면, 해당 프로세스는 자발적으로 CPU 권한을 포기할때까지 cpu 권한을 유지
CPU는 실행 중인 프로세스의 의도와는 무관하게 다른 프로세스를 실행시킬 수 있다.
OS가 프로세스를 멈출 수 있다.
time sharing 시스템, real time 시스템에 사용
OS 커널 설계에 영향을 줌
장점
단점
S/W 오버헤드가 H/W 구동시간보다 훨씬 크다
CPU burst, I/o burst 시간의 분배는 적절한 스케줄링 알고리즘 선택하는데에 중요하다
CPU burst 시간 분배는 보통 지수로 표현됨
프로세스가 동작하는 일련의 행위를 워크로드라고 한다.
적절한 워크로드는 스케줄링 개발에 매우 중요하다.
작업 == 프로세스 라고 치겠다
일단 스케줄링 조건을 쉽게 만들기 위해 가정을 하자
모두 비현실적인 조건들
TAT = 완료된 시각 - 도착한 시각
FCFS(first come first served)라고도 불림
짧은 프로세스보다 긴 프로세스의 대한 성능이 훨씬 우수
I/O-bound 프로세스보다 cpu-bound 프로세스를 선호
-> 낮은 CPU, device 이용 시스템에서 사용됨
Ex
A,B,C,가 거의 동시에 도착 (도착시간 = 0)
간발의 차이로 A,B,C 순서로 도착
각 작업은 10초간 진행 그렇다면 이 작업들의 평균 TAT시간은??
실행 순서
A->B->C
A TAT = 10 - 0 = 10sec
B TAT = 20 - 0 = 20sec
C TAT = 30 - 0 = 30sed
ave = (10+20+30)/3 = 20 sec
가정 1번을 풀자, => 작업시간이 모두 같지 않다(CPU burst time이 다르다)
그럼 FIFO는 좋은가..
Ex
A,B,C,가 거의 동시에 도착 (도착시간 = 0)
간발의 차이로 A,B,C 순서로 도착
A 실행시간 = 100sec
B,C 실행시간 = 10sec
평균 TAT?
실행 순서
A->B->C
A TAT = 100 - 0 = 100sec
B TAT = 110 - 0 = 110sec
C TAT = 120 - 0 = 120sec
ave = (100+110+120)/3 = 110sec
엥 TAT 급 증가!! B C가 짧은데 A때매 기다리네!!
CPU를 많이 필요하지 않는 프로세스들이 CPU를 오래 사용하는 프로세스가 끝나기를 기다리는 현상
B,C가 A보다 먼저 끝나면 TAT는 줄텐데...
어떠캐 해결??
아까의 Ex에 SJF를 적용해보자
실행 순서
B->C->A
A TAT = 120 - 0 = 120sec
B TAT = 10 - 0 = 10sec
C TAT = 20 - 0 = 20sec
ave = (10+20+120)/3 = 50sec
=> SJF는 TAT를 110sec에서 50sec로 향상시켰다.
모든 작업이 동시에 도착한다면 SJF가 최적의 스케줄링 기법일 것이다.
그럼 가정 2번을 풀자
작업은 모두 동시에 오지 않고 임의의 시간에 도착할 수 있다
이렇게 되면, 실행시간이 100초인 A가 실행 중 일때 실행시간이 10초 걸리는 B,C가 도착한다면..?
SJF는 Non-preemptive하기때문에 A가 다 끝나고 B,C가 실행된다.
=> 또다시 convoy effect가 발생!!
위의 문제를 해결하기 위해 가정 3을 풀자, 작업은 실행 도중 멈출 수 있다.
여기에 타이머 인터럽트와 context switch가 가능하다면!!
그렇다면 B,C가 도착했을 떄 실행 중이던 A를 멈추고 B나 C를 실행할 수 있다.
그리고 A는 나중에 다시 실행될 것이다.
EX
A는 0초에 도착 100초의 실행시간
B,C는 10초에 도착, 10초의 실행시간
실행 순서
A->B->C->A
A TAT = 120 - 0 = 120sec
B TAT = 20 - 10 = 10sec
C TAT = 30 - 10 = 20sec
ave = (10+20+120)/3 = 50sec
작업의 길이를 미리 알고, 작업(프로세스)가 CPU만 사용하고 평가기준이 TAT 뿐이라면 STCF는 훌륭함.
그러나 time slice 기법이 나오고 나서 그렇지 않게됨
response time 이라는 척도가 생겼다
Response time
response time = 처음 프로세스가 시작한 시간 - 도착한 시간
이제 어떻게 response time을 줄일까??
작업이 끝날때까지 기다리지 않는다.
대신 일정시간(time slice, scheduling quantum) 동안 실행 후 Run 큐의 다음 작업으로 전환한다.
타임 슬라이싱이라고도 볼림
Ex response time, TAT
A,B,C가 같은 시간에 도착
5초씩 실행시간(CPU burst)
SJF에선
실행 순서
A->B->C
response
A = 0 sec
B = 5 sec
C = 10 sec
ave response = (0 + 5 + 10)/3 = 5sec
TAT
A TAT = 5 - 0 = 5sec
B TAT = 10 - 0 = 10sec
C TAT = 15 - 0 = 15sec
ave TAT = (5+10+15)/3 = 10 sec
RR (time-slice 1sec)에선
실행순서
(A->B->C) 1sec씩 실행
A = 0 sec
B = 1 sec
C = 2 sec
ave response = (0 + 1 + 2)/3 = 1sec
TAT
A TAT = 13 - 0 = 13sec
B TAT = 14 - 0 = 14sec
C TAT = 15 - 0 = 15sec
ave TAT = (13+14+15)/3 = 14sec
response 시간에서 좋다
RR은 공정하다, 그러나 TAT와 같은 기준에는 좋지 않다
RR은 가능한 작업을 늘리는 것이 목표 TAT는 작업 완료 시간만 고려하기때문에 좋지 않음
RR과 같은 공정한 기법들은 response time과 같은 평가 기준에서 나쁨
공정성이 좋으면, response time 좋음, TAT 나쁨
공정상 낮음, response time 낮음, TAT 좋음
time slice가 짧을수록 여러 프로세스를 더 빠르게 접근 가능하니 response time 기준 성능이 더 좋아진다.
하지만.. 과연 time slice를 무턱대고 짧게 하는 것이 좋을까??
짧은 Time slice는 문제를 일으킨다!
너무 짧으면 context switch가 전체 성능에 큰 영향을 끼친다
레지스터에 저장/ 복원과 함께 CPU 캐시 ,TLB 등 하드웨어에도 프로세스와 관련된 다양한 정보들이 있다.
이 갱신 작업이 큰 비용을 유발한다..
그래서 너무 context switch 비용을 상쇄할 수 있을 만큼 길어야 하지만 너무 길면 좀...
response time과 context switching으로 인한 성능 하락등의 trade off를 잘 계산해야한다
이제 가정 3도 풀어보자. 모든 프로그램은 입출력 작업을 수행할 것이다. 당연하다.
현재 실행중인 프로세스가 입출력 작업을 요청하면
스케줄러는 다음에 어떤 프로세스를 실행해야할지 고려해야한다.
왜냐면 입출력 요청을 한 프로세스는 입출력이 완료될때까지
CPU를 사용하지 않을 것이기 때문이다.
입출력 요청을 한 프로세스는 입출력 완료를 기다리며 wait status로 가고,
입출력이 하드디스크로 간 뒤 프로세스는
현재 입출력 워크로드에 따라 좀 더 block될 것이다.
그럼 이 시간동안 CPU를 이용할 다른 프로세스를 스케줄러가 골라야한다.
스케줄러는 입출력이 끝나면 또 결정을 해야한다.
입출력이 완료되면, 인터럽트가 발생되고
OS가 입출력을 요청한 프로세스를 wait status에서 ready state로 옮긴다.
이제 어떤 프로세스를 실행할지 스케줄러가 골라야한다.
EX
A와 B는 50msec의 CPU 시간(CPU burst)을 필요로 한다.
A는 10msec 실행 후 입출력을 요청하고 입출력은 10msec이 걸린다.
B는 입출력을 하지 않는다.
스케줄러는 A를 먼저 실행한다.
STCF 방식
A->B
A가 끝나기전에 B를 실행하지 않는다. 그래서 A 입출력 시간에 CPU가 놀게 된다 비효율적이다
RR 방식
A->B(A입출력)
하지만 RR방식은 A가 입출력 중일 때 B가 CPU를 사용할 수 있다. CPU가 더 효율적으로 동작한다