시스템에 따라 스케줄러를 최적화 해야 하는 목표가 다르다.
1. 배치 시스템
- 비선점형 알고리즘 또는 각 프로세스에게 긴 주기를 제공하는 선점형 알고리즘이 적절하다.
-> 프로세스간 문맥교환을 줄여서 성능을 향상시킨다.
2. 대화식 시스템
- 한 프로세스가 CPU를 독점하여 다른 사용자의 서비스를 방해하는 것을 막기 위해서 선점이 필수적이다.
3. 실시간 시스템
- 때때로 선점이 필요하다. 프로세스들이 자신들이 실행을 오랫동안 할 수 없다는 점을 알고 있어서 보통 자신이 해야 할 일을 바로 수행하고 대기하기 때문.
# 스케줄링 알고리즘의 목표
모든 시스템
공평함 : 각 프로세스에게 공평한 몫의 CPU를 할당함.
정책 집행 : 정책이 집행되는지 관찰한다.
균형 : 시스템의 모든 부분이 활동하도록 해야 한다.
배치 시스템
성능 : 시간당 처리되는 작업의 수를 최대화 해야 한다. (처리율, throughput)
반환시간(turnaround time) : 작업의 제출부터 종료까지 걸리는 시간을 최소화해야 한다.
CPU 이용률 : CPU가 항상 활용되도록 해야 한다.
+) 처리량을 극대화하는 스케줄링 알고리즘이 반드시 반환 시간을 최소화 하지는 않는다.
대화식 시스템
응답시간 : 요청에 빠르게 응답해야 한다.
비례(proportionality) : 사용자의 기대를 만족시켜야한다.
실시간 시스템
마감시간 만족(deadline) : 마감시간 내에 처리를 끝내서 데이터 손실을 방지해야한다
예측 가능 : 멀티미디어 시스템에서 품질 저하를 방지.
# 배치 시스템의 스케줄링
선입선출 (FCFS: First Come First Served)
: 요청 순서대로 cpu를 할당받음
최단 작업 우선 (SJF: Shortest Job First)
: 실행 시간이 가장 짧은 작업을 선택
작업의 실행 시간을 미리 알고 있어야 한다.
최단 잔여 시간 우선 (SRTN: Shortest Remaining Time Next)
: 프로세스의 남은 실행 시간이 가장 짧은 작업 선택
작업의 실행 시간을 미리 알고 있어야 한다.
새로 도착한 짧은 작업이 좋은 서비스를 받을 수 있도록 해준다.
# 대화식 시스템의 스케줄링
라운드 로빈 스케줄링 (Round-Robin Scheduling)
: 각 프로세스에게 '시간 할당량(time quantum)'이라 불리는 시간 주기가 할당됨. 한번에 이 시간 동안만 실행된다. 프로세스가 할당 시간 동안 실행하면 CPU는 다른 프로세스에게 주어진다. 프로세스가 할당 시간이 끝나기 전에 대기하거나 종료하면 CPU는 다른 프로세스로 전환한다.
한 프로세스에서 다른 프로세스로 문맥교환이 자주 일어나면(시간 할당량이 짧음) 문맥교환에 걸리는 시간의 비율이 너무 커져서 CPU의 효율이 떨어짐.
시간 할당량이 너무 크면 짧은 대화식 요청의 응답의 질이 떨어진다.
우선순위 스케줄링
: 각 프로세스에게 우선순위가 할당되며 가장 높은 우선순위를 가진 실행 가능한 프로세스가 다음에 수행됨.
높은 우선순위의 프로세스가 무한히 실행되는 것을 막기 위해 스케줄러는 클록 인터럽트마다 현재 실행중인 프로세스의 우선순위를 낮출 수 있다.(기아 문제 방지, starvation)
각 프로세스는 최대로 실행할 수 있는 시간 할당량을 가진다.
시스템의 특정 목표를 달성하기 위해 우선순위는 시스템에 의해 동적으로 할당될 수 있다.
프로세스들을 그룹으로 묶어 우선순위 클래스를 형성하고, 우선순위 클래스마다 우선순위를 할당하며 각 클래스 내에서는 라운드 로빈을 사용하면 편리하다.
다단계 큐 (Multiple Queues)
: 우선순위 클래스들을 설정. 우선순위가 높은 클래스일수록 프로세스마다 할당된 시간이 짧다. 프로세스가 할당된 시간을 모두 소비하면 한 단계 낮은 클래스로 이동한다.
최단 프로세스 순번 (SPN: Shortest Process Next)
: 과거의 행동을 기반으로 추정하여 예상 실행 시간이 가장 짧은 프로세스를 실행한다.
현재 측정된 값과 이전 예상치를 가중 평균하여 연속적으로 다음 값을 예상하는 '에이징(aging)'기법을 사용한다.
보장 스케줄링 (Guaranteed Scheduling)
: 사용자에게 성능에 대한 현실적인 약속을 하고 이를 보장하는 방법. '단일 사용자 시스템에서 n개의 프로세스가 실행하면 동일하게 각 프로세스는 1/n만큼의 CPU시간을 받아야 한다.'
어느 프로세스가 받아야 할 CPU시간에 대한 실제 받은 CPU시간 비율이 작은 프로세스를 가장 가까운 경쟁자의 비율을 초과할 때까지 수행시킨다.
복권 스케줄링 (lottery Scheduling)
: 스케줄링 결정을 내릴 때마다 무작위로 복권 티켓을 선택하고 이 티켓을 가진 프로세스가 자원을 할당 받는다.
더 중요한 프로세스는 여분의 티켓을 더 받아서 자원 할당 확률을 높일 수도 있고, 협동하는 프로세스들이 티켓을 교환할 수도 있다.
공평-몫 스케줄링 (Fair-Share Scheduling)
: 스케줄링 하기 전에 프로세스의 소유자를 고려한다. 각 사용자는 CPU시간의 일정 비율을 할당받는다. 스케줄러는 이 비율이 지켜지도록 프로세스를 선택한다.
# 실시간 시스템에서 스케줄링
경성 실시간 (hard real-time) : 마감 시간이 절대적으로 만족되어야 한다.
연성 실시간 (soft real-time) : 때때로 마감시간을 지키지는 않아도 된다.