[OS] Scheduling에 대하여

CPU가 프로세스를 실행하는 순서를 나타내는 스케쥴링과 알고리즘 종류를 알아보자.
Hi's avatar
Apr 12, 2024
[OS] Scheduling에 대하여
 

✅ 스케쥴링 개요

우리는 프로세스를 실행시키기 위한 문맥 교환, 시스템 콜 등의 저수준 기법에 대해서는 이제 분명하게 이해하고 있을 것이다. 추가적으로 운영체제 스케쥴러의 고수준 정책에 관해서 이해가 필요하다.
스케쥴링은 어떻게 개발하는가? 1. 스케쥴링 정책을 생각하기 위한 기본적인 프레임워크를 어떻게 만들어야 하는가? 2. 핵심 가정은 무엇인가? 3. 어떤 평가 기준이 중요한가? 4. 컴퓨터 시스템 초창기에 사용되었던 기본 접근법은 무엇인가?
 

✅ 가정하기

가장 먼저 프로세스에 대하여 몇 가지 가정을 할 것이다. 일련의 프로세스들이 실행하는 상황을 워크로드라고 부르기로 한다. 우리가 지금 설명에서 사용할 워크로드에 대한 가정은 비현실적이다. 하지만, 당장 논의하는 데는 아무 문제 없다. 앞으로 논의가 진행됨에 따라 가정을 완화시킬 것이고 최종적으로 제대로 동작하는 스케쥴링 정책을 만들게 될 것이다.
  1. 모든 작업은 같은 시간 동안 실행된다.
  1. 모든 작업은 동시에 도착한다.
  1. 각 작업은 시작되면 완료될 때까지 실행된다.
  1. 모든 작업은 CPU만 사용한다. (즉, 입출력을 수행하지 않는다.)
  1. 각 작업의 실행 시간은 사전에 알고 있다.
 

✅ 스케쥴링 평가 항목

워크로드에 대한 가정 이외에 스케쥴링 정책 비교를 위해 스케쥴링 평가 항목을 결정해야 한다. 평가 항목은 다양하다. 여기서는 크게 두 가지로 나뉜다.

1. 반환 시간

→ 작업이 완료된 시각에서 작업이 시스템에 도착한 시각을 뺀 시간
(끝난 시각 - 도착 시각)

2. 응답 시간

→ 작업이 도착할 때부터 처음 스케쥴 될 때까지의 시간
(처음 시작한 시각 - 도착 시각)
 

✅ 스케쥴링 알고리즘

스케쥴링 알고리즘은 크게 4가지로 구성된다.

1. 선입 선출 (FIFO - First In First Out)

notion image
→ 가장 먼저 도착한 작업부터 실행한다.
만약 3가지 작업이 도착했고 처음 도착한 작업이 길면, 반환시간과 응답 시간 측면에서 모두 나쁜 성능을 보인다. 슈퍼에서 계산을 기다릴 때 앞사람이 카트에 물건을 가득 싣고 있는 경우와 비슷하다.

2. 최단 작업 우선 (SJF - Shortest Job First)

notion image
→ 가장 짧은 실행 시간을 가진 작업을 먼저 실행시킨다.
모든 작업이 동시에 도착한다면 SJF가 최적의 스케쥴링 알고리즘이다!! 하지만 모든 작업이 동시에 도착한다는 보장이 없다.
notion image
B와 C가 늦게 도착하면 A의 실행이 끝날 때까지 기다려야 한다.. 이 경우에도 반환 시간에 문제가 발생한다.

3. 최소 잔여시간 우선 (STCF - Shortest Time-to-Completion First)

→ 이 문제를 해결하기 위해 가정 3을 완화해야 한다. (가정 3: 각 작업은 한 번 시작하면 완료될 때까지 실행된다) SJF에 선점 기능을 추가하여 만든 스케쥴러가 바로 STCF이다. 언제든 새로운 작업이 시스템에 들어오면, 이 스케쥴러는 남아 있는 작업과 새로운 작업의 잔여 실행 시간을 계산하고 그 중 가장 적은 잔여 실행 시간을 가진 작업을 스케쥴한다.
notion image
먼저와 같이 작업들이 동시에 도착할 경우 SJF가 최적의 스케쥴러라는 것을 고려하면, 거기에 선점 기능을 추가한 STCF는 가정 3을 완화했을 때 최적의 스케쥴러라는 것이 입증된다.

4. 라운드 로빈 (RR - Round Robin)

notion image
→ 지금까지는 반환 시간만을 고려하였지만, 응답 시간도 고려해야한다. 위 스케쥴러들은 응답 시간 측면에서 그리 좋지 않은 성능을 보인다. 이를 해결하기 위해 라운드 로빈이 존재한다!
라운드 로빈은 작업이 끝날 때까지 기다리지 않는다. 대신 일정 시간 동은 실행한 후 실행 큐의 다음 작업으로 전환한다. 이때 작업이 실행되는 일정 시간을 타임 슬라이스 또는 스케쥴링 퀀텀이라 부른다.
타임 슬라이스의 길이는 타이머 인터럽트 주기의 배수여야 한다. 타이머가 10 msec 마다 인터럽트를 발생시킨다면 타임 슬라이스는 10, 20 등 10 msec의 배수가 될 수 있다.
라운드 로빈은 응답 시간 측면에서는 좋은 성능을 보이지만, 반환 시간 측면에서는 최악의 정책이다. 반환 시간과 응답 시간은 당연하게도, 한 쪽이 좋아지면 안 쪽이 나빠지는 경향이 있다.
 

✅ 입출력 연산의 고려

우선 가정 4를 완화하자. 이제 입출력도 고려해야 한다!
notion image
→ 입출력 연산을 하는 동안 CPU를 사용하지 않으면 자원이 낭비된다.
notion image
→ 프로세스의 입출력이 끝나기를 기다리는 동안 CPU는 다른 프로세스에 의해 사용되어 연산의 중첩이 가능해진다.
 
입출력을 고려한 스케쥴링은 스케쥴러가 각 작업의 실행 시간을 알고 있다는 가정 하에 성립된다. 하지만 이 가정은 우리가 할 수 있는 최악의 가정이다. 실제로 작업의 길이에 대해 알 수 있는 길은 없다.
→ 하지만 가까운 과거를 이용하여 미래를 예측하는 스케쥴러는 구현이 가능하다. 이 스케쥴러는 멀티 레벨 피드백 큐라고 불린다.
 
Share article

soultree