여러 개의 프로세스가 있는데 어느 프로세스를 실행해야 할까?
-> 스케줄러가 누구를 선택해야 할까?
First In First Out(선입 선출)
가장 먼저 들어온 놈이 가장 빨리 나간다.
장점 : 매우 간단하고 구현하기 쉽다.
단점 : 호위 효과(Convoy effect)
작업마다 실행 시간이 다를 경우
다음 그림과 같이 A는 100초, B는 10초, C는 10초간 실행하였을 때, A가 매우 긴 시간동안 점유하고 있기 때문에 B와 C의 완료 시간도 늦어지고 따라서 반환 시간이 매우 커진다.
Shortest Job First
가장 짧은 작업 먼저, 다음으로 짧은 작업,,,
늦게 들어왔으면 그에 맞게 뒤에 줄을 서는 비선점 스케줄러이다.
평균 반환 시간을 줄이는 가장 좋은 방법이다.
단점 : 위 그림과 같이 A 실행 중 B, C가 도착해서 10초간 실행해야 하지만 비선점이기 때문에 그대로 밀려난다. SJF의 효과를 못본다.
Shortest Time-to-Complition First
잔여 시간이 제일 작은 작업을 우선 실행 -> 실행 하는데 가장 빨리 완료할 작업을 우선으로 실행
SJF에서 선점을 추가한 것이다.
따라서 강제 작업 전환이 필요하다.
새로운 작업이 시작되면 새 작업과 기존의 작업들의 잔여시간을 조사하고 잔여시간이 가장 작은 작업을 스케쥴한다.
단점 : 응답 시간이 좋지 않음
새로운 평가 기준인 응답 시간이 추가 되었다.
HWP나 PPT와 같이 대화형 프로그램은 실행시간이 없고 키보드를 눌렀을 때 얼마나 빨리 반응하는지가 중요하다.
작업이 도착한 시간부터 처음 스케줄 될 때까지의 시간이다.
응답시간 = 최초 실행 - 도착 시간
STCF관련 기법은 먼저 들어오더라도 잔여 작업시간이 적게 남은 프로세스를 먼저 스케줄링하기 때문에 응답시간이 좋지 않다.
Round Robin
타임 슬라이스 스케줄링으로 작업을 실행하고 정해진 시간 주기인 타임 슬라이스에 따라 시간이 지나면 준비 큐에 있는 다음 작업으로 문맥이 교환된다. 위의 과정을 작업이 종료될 때 까지 반복하며 타임슬라이스의 크기는 타이머 인터럽트 간격의 정수배이다.
다음 그림과 같이 SJF는 반환시간은 좋지만 응답시간은 좋지 않다. 그러나 RR은 반환시간은 좋지 않지만 응답시간은 매우 좋다.
이렇게 인터렉티브한 작업에 우위를 둔다.
모든 프로그램은 I/O를 수행한다.
다음과 같이 A와 B는 CPU를 둘 다 50ms 사용한다.
A는 10ms 실행할 때 마다 I/O요청을 한다 (모든 I/O는 10ms 동안 실행)
B는 I/O없이 50ms 계속 실행한다.
MLFQ는 여러 개의 서로 다른 큐(작업 리스트)를 갖는다. 각 큐는 서로 다른 우선순위를 갖는다.
MLFQ는 관찰된 행동에 따라 작업이 속할 우선순위 큐가 정해진다.
ex) 자주 IO요청을 해서 CPU를 놓아주는 작업 : 높은 우선순위, 긴 시간동안 CPU를 사용하는 작업 -> 낮은 우선순위
이 MLPQ에서 가장 높은 우선순위를 가진 A와 B가 아주 오래 걸리는 작업이라면 C와 D는 매우 성능이 안좋아진다.
따라서 상황에 따라 우선순위를 변경해줘야 한다.
다음 그림과 같이 큐가 3개일 때, 하나의 작업이 수행되는 과정을 보여준다. 우선 타임 슬라이스가 10일때, 처음으로 Rule 3에 의해 우선순위가 가장 높은 Q2에 위치한다. 그리고 타임 슬라이스를 모두 사용하였기 때문에 다음 우선순위 Q1으로 이동한다. 10초 후 다시 Q0으로 이동하게 된다.
다음 그림과 같이 A는 CPU를 오래 사용하는 작업이고 B는 짧게 실행되는 작업이다.
A가 실행 중 B가 들어오게 되면 마치 STCF처럼 작동한다.
다음 그림과 같이 A는 CPU 중심의 작업이지만 B는 I/O 요청 전 1ms 정도만 실행되는 대화형 작업이기 때문에 Rule 4b처럼 우선순위가 제일 높고 반드시 A보다 먼저 수행할 수 있게 스케줄링 되었다.
이처럼 MLFQ는 매우 빨리 수행할 수 있을 거 같아 좋아 보이지만 이러한 규칙을 교묘하게 피해갈 수 있다.
이러한 문제점을 해결하기 위해 나온 것이 우선순위 상향 조정이다.
오래동안 실행되지 않은 작업의 우선순위를 올려주는 것이다.
-> 이를 알아내기 힘드니 그냥 모든 작업의 우선순위를 주기적으로 가장 높게 만들어 주는 것이다.
아까 앞에서 봤듯이 타임 슬라이스의 99.9퍼센트만 사용하는 악질 사용자가 있다.
이러한 놈들을 솜방망이를 내리칠 수 있는 대처가 존재한다.
바로 Rule 4a와 Rule 4b를 통합하여 정의한 새로운 규칙 Rule 4이다.
다음과 같이 왼쪽은 적용하지 않고, 오른쪽은 Rule 4를 적용한 것이다.
빗선이 그어진 B가 얌체같이 조금만 쓰고 포기하지만 일정한 타임 슬라이스가 누적되기 때문에 타임 슬라이스가 끝나고 다음 우선순위로 내려간다. 결국 마지막 Q0에 도착하여 A와 B는 같은 우선순위에서 RR을 하게 된다.
모든 문제는 해결하였지만 최적화와 구현의 문제는 남아있다. 우선순위, 큐의 개수, 타임슬라이스 등을 어떻게 설정해야 하는지다.
실제 사용되는 MLFQ의 방식이다.
위와 같이 Q0, Q1, Q2가 서로 다른 타임슬라이스를 갖고 있다.
우선순위가 낮다는 것은 CPU를 주로 사용한다는 것이며 실행시간이 긴 작업들이 속한다.
따라서 타임 슬라이스가 큰 것이 더 작동이 잘 될 수 있다. -> context switch에서 비용 발생을 절약할 수 있다.
실제 운영체제들도 비슷한 스케줄링 알고리즘으로 동작한다.