본문 바로가기

CS

CPU 스케줄링 알고리즘

CPU 스케줄링

  • CPU 스케줄링은 어떤 프로세스에 CPU를 할당할지 결정하는 것, 컴퓨터 시스템의 효율에 직결되는 중요한 일
  • 결국, "어떻게 프로세스들이 CPU를 효율적으로 사용하게 할 것인가?" 라는 고민에서 CPU 스케줄링이 출발한다고 할 수 있다.

단계별 처리 스케줄링

컴퓨터는 여러 개의 프로세스가 동시에 존재하므로 각각의 프로세스를 식별하거나 관리하기 위해서 여러 가지 단계들이 필요하다.

  • 장기 스케줄링시스템 과부하를 막기 위해 어떤 작업을 시스템이 받아들일지 또는 거부할지를 결정하므로 시스템 내에서 동작 시에 실행 가능한 프로세스의 총개수가 정해진다.
  • 가장 큰 틀에서 이루어지는 CPU 스케줄링으로 시스템 내의 전체 작업 수를 조절한다.
  • 중기 스케줄링
  • 중지(suspend)와 활성화(active)로 전체 시스템의 활성화된 프로세스 수를 조절한다. 이로 인해 저수준 스케줄링이 원만하게 이루어지도록 완충하는 역할을 한다.
  • 단기 스케줄링
  • 가장 작은 단위의 스케줄링으로 어떤 프로세스에 CPU를 할당할지, 어떤 프로세스를 대기 상태로 보낼지 등을 결정하는 역할이다. 중간 수준의 스케줄링은 프로세스를 보류 상태로 보내고, 저수준 스케줄링은 대기 상태로 보낸다. 스케줄링에 대해 공부하는 대부분의 내용이 단기 스케줄링에 해당한다.

CPU 스케줄링이 일어나는 시기

  • 프로세스가 입/출력을 요구할 때
  • 프로세스가 종료를 요구할 때
_start() {
  r = main(...);
  exit(r);// 종료 시스템 콜
}

이처럼 프로세스가 종료를 요구하면 운영체제는 CPU를 보내줄 새로운 프로세스를 찾기 위해 CPU 스케줄링이 일어난다.

  • 높은 우선순위의 프로세스가 나타났을 때
  • 만약 이 새로운 프로세스의 우선순위가 이전에 떠나왔던 프로세스보다 높다면 CPU 할당 교체
  • 주어진 CPU 실행 시간을 초과했을 때
  • 한 프로세스가 연속해서 사용할 수 있는 최대 시간을 설정하고, 시간이 초과한 경우 CPU를 다른 프로세스에게 할당할 수 있다.

선점 / 비선점 스케줄링

  • 선점

프로세스가 CPU를 할당받아 실행 중이더라도 운영체제가 CPU를 강제로 빼앗을 수 있는 방식

CPU 처리 시간이 매우 긴 프로세스가 CPU 사용 독점을 막을 수 있어 효율적인 운영이 가능하다.

하지만 잦은 문맥 교환으로 오버헤드가 많이 발생한다.

  • 비선점

프로세스가 CPU를 점유하고 있다면 이를 빼앗을 수 없는 방식

필요한 문맥 교환만 일어나기 때문에 오버헤드가 상대적으로 적지만 프로세스의 배치에 따라 효율성 차이가 많이 난다.

스케줄링 알고리즘


<CPU의 입장>

CPU utilization(CPU 사용률)

시스템의 동작 시간 중 CPU가 사용된 시간을 측정하는 방법으로 최대한 CPU를 바쁘게 만드는 것이다. 가장 이상적인 수치는 물론 100%다.

Throughput(처리량)

단위 시간당 작업을 마친 프로세스의 수다. 즉, CPU 버스트를 처리한 수다.

<프로세스의  입장>

Trun-around time(반환 시간)

프로세스가 생성된 후 종료되어 사용하던 자원을 모두 반환하는 데까지 걸리는 시간이다. 프로세스의 대기 시간 + 실행시간이다. 여기서 대기 시간은 없을 수도 있고, 1 번일 수도, 여러 번일수도 있다.

Waiting time(대기 시간)

프로세스가 CPU를 할당받아 실행되기 전 대기 상태일 때의 시간이다. 보통 준비 큐에서 대기를 하는 시간이다.

Response time(응답 시간)

프로세스가 대기 상태에 들어와 CPU를 최초로 얻기까지 걸리는 시간이다. 대기 시간과의 차이점은 대기 시간은 반환 시간과 마찬가지로 여러 번 있을 수 있다. 그 총합이 대기 시간이고, 응답 시간은 최초의 한 번이다. 이 응답 시간은 프로세스 입장에서 CPU를 한 번도 못 얻은 것과 한 번이라도 얻는 것은 사용자 응답에 있어서 중요한 차이가 있기 때문에 중요하다.

쉽게 설명해보면 매우 배고픈 사람에게 메인 음식이 나오기 전 간단한 단무지나 반찬을 주는 것이 손님의 입장에서는 매우 반가운 것과 같은 느낌이다

알고리즘 종류


FCFS (First Come First Served)

말 그대로 선입선출 방식으로, 준비 큐에 도착한 순서대로 CPU를 할당하는 비선점형 방식이다. 모든 프로세스의 우선순위가 동일하고, 프로세스의 CPU 처리 시간을 따로 고려하지 않기 때문에 매우 단순하고 공평한 방법이다.

하지만 CPU 처리 시간이 긴 프로세스가 앞에 올 경우 뒤의 프로세스가 한없이 기다려야 하기 때문에 비효율적이게 된다. 이를 콘보이 효과라고 한다.

그림에서 보이듯이 CPU 버스트 타임이 2ms인 P4는 잠깐만 CPU를 얻으면 빠르게 처리하고 나갈 수 있지만 4번 째로 도착했기 때문에 30ms나 대기해야 한다.

 

SJF (Shortest Job First)

준비 큐에 있는 프로세스 중 실행 시간이 가장 짧은 작업부터 CPU를 할당하는 비선점형 방식이다. 늦게 도착하더라도 CPU 처리 시간이 앞에 대기중인 프로세스보다 짧으면 먼저 CPU를 할당받을 수 있다. 때문에 콘보이 효과를 완화할 수 있다.

단, 비선점형 방식이기 때문에 CPU를 사용중인 프로세스보다 처리 시간이 짧더라도 빼앗지는 못한다.

위의 그림은 만약 모든 프로세스가 0초에 동시 도착했다는 가정이다. 그럴 경우 P4가 버스트 타임이 가장 짧기 때문에 먼저 실행되고, P1이 가장 나중에 실행된다. 평균 대기 시간을 위의 FCFS와 비교해보면 월등히 짧은 것을 알 수 있다.

하지만 만약 P1이 가장 먼저 도착했다면 어쩔 수 없이 P1이 먼저 CPU를 점유하게 된다.

FCFS보다 효울성이 매우 높지만 그에 따른 단점도 존재한다.

일단 가장 중요한 공평성에 어긋난다. 처리 시간이 긴 프로세스의 경우 처리 시간이 짧은 프로세스가 계속해서 들어온다면 대기 큐에서 영영 CPU를 할당받지 못할 수 있다. 이를 starvation 현상이라고 한다.

그리고 중간에 입출력 버스트가 빈번하게 요구되는 프로세스의 경우 운영체제가 프로세스의 종료 시간을 정확하게 예측하기 어렵다.

 

HRN(Highest Response Ratio Next)

SJF 스케줄링에 Aging 기법을 합친 비선점형 알고리즘이다.

Aging이란 나이를 먹는다는 의미 그대로 starvation을 해결하기 위해 대기 시간이 길어지면 우선순위를 높여주는 방법이다.

SJF와 마찬가지로 실행 시간이 적은 프로세스의 우선 순위가 높지만 대기 시간이 너무 길어지면 실행 시간이 길더라도 CPU를 할당받을 수 있다. 하지만 여전히 공평성이 말끔히 해결되지는 않는다.

 

SRTF (Shortest Remaning Time First)

SJF의 선점형 방식이다. 먼저 온 프로세스가 CPU를 할당받고 있더라도 남은 처리 시간이 뒤에 온 프로세스의 처리 시간보다 길면 CPU를 빼앗긴다.

어떤 알고리즘보다 평균 대기 시간이 가장 짧은 알고리즘이다.

하지만 이 방식은 기본적으로 선점형 방식이기 때문에 잦은 문맥교환이 일어나고 그에 따른 오버헤드가 커진다. 그리고 starvation 현상이 더 심각하게 발생할 수 있다.

또한 CPU의 예상 시간을 예측하기가 너무 힘들기 때문에 실제로 사용되기가 매우 어렵다. (exponential averaging을 통해 예측을 할 수는 있다)

 

Priority Scheduling

프로세스의 중요도에 따라 매긴 우선순위를 반영한 알고리즘으로 위에서 알아본 SJF, HRN, SRTF도 우선순위 스케줄링 알고리즘의 일종이다.

위의 알고리즘들의 문제점과 마찬가지로 starvation 문제와 공평성 문제가 있다.

 

RR(Round Robin)

프로세스에게 각각 동일한 CPU 할당 시간(타임 슬라이스, quantum)을 부여해서 이 시간 동안만 CPU를 이용하게 한다. 만약 할당 시간동안 처리를 다 하지 못하면 CPU를 빼앗고 다음 프로세스에게 넘긴다. 빼앗긴 프로세스는 준비 큐의 맨 뒤로 간다. 따라서 선점형 방식이다.

따로 CPU 처리 시간을 계산하지 않아도 돼서 선점형 방식의 가장 단순하고 대표적인 방법이다. 우선 순위도 없기 때문에 매우 공평하다.

라운드 로빈 알고리즘의 경우, 이는 곧 모든 프로세스가 최초 응답 시간을 빠르게 보장받을 수 있다는 큰 장점을 가지게 된다.

위의 경우 time quantum = 5인 경우다. 타임 퀀텀(타임 슬라이스)동안 처리를 다 하지 못한 P1은 CPU를 빼앗기고 대기 큐의 맨 뒤로 간 다음 P2에게 넘겨준다. P2는 3ms만에 처리를 완료하고 바로 P3에게 CPU를 넘겨준다.

라운드 로빈 방식에서 가장 중요한 부분은 타임 슬라이스의 크기 결정이다.

보통 10-100 ms로 설정한다.

 

Multilevel  Queue

다단계 큐 스케줄링은 우선순위에 따라 준비 큐를 여러 개 사용하는 방식이다.

당연히 우선순위가 높은 큐에 먼저 CPU가 할당되어 큐에 속한 모든 프로세스가 처리되야 다음 우선순위 큐가 실행될 수 있다. 그리고 한 번 우선순위가 매겨저 준비 큐에 들어가면 이 우선순위는 바뀌지 않는다.

각 큐는 독립적인 스케줄링 알고리즘을 가질 수 있는데, 보통 전면 프로세스들이 속해있는 큐는 우선순위고 높고 라운드 로빈 스케줄링을 사용해 타임 슬라이스를 작게한다.

후면 프로세스에는 사용자와의 상호작용이 없으므로 가장 간단한 FCFS 방식으로 처리한다. 보통 총 CPU 시간이 전면 프로세스의 처리에 80%, 후면 프로세스 처리에 20%가 할당된다.

이 다단계 큐 알고리즘 역시 문제는 starvation 현상과 공평성 문제다.

 

Multilevel Feedback Queue

다단계 큐의 공평성 문제를 완화하기 위해 신분 하락이 가능한 알고리즘이다. 이 알고리즘에서는 우선순위가 변동되기 때문에 큐 사이의 이동이 가능하다.

한 번 CPU를 할당받은 프로세스는 우선순위가 조금 낮아진다. 따라서 더 낮은 큐로 이동하게 된다. (우선순위가 높아져 상위 큐로 이동할 수도 있다)

그리고 더 보완하기 위해 우선순위가 높은 큐보다 우선순위가 낮은 큐에 타임 슬라이스 크기를 크게 준다. 어렵게 얻은 CPU를 좀 더 오랫동안 사용하게 해주기 위함이다.

 

'CS' 카테고리의 다른 글

4.2 ERD와 정규화 과정  (0) 2022.09.13
4.1 데이터베이스의 기본  (0) 2022.09.10
프로세스와 스레드(2)  (0) 2022.09.05
3.3 프로세스와 스레드  (0) 2022.09.04
3.2 메모리  (0) 2022.09.02