본문 바로가기
computer science/운영체제

[운영체제] CPU 스케줄링

by 박연호의 개발 블로그 2020. 2. 15.

이번 시간에는 CPU스케줄링에 대해 공부해 보겠습니다. 단순히 CPU 스케줄링 알고리즘에 뭐가 있는지 보다는 왜 CPU가 필요하며 CPU의 스케줄링의 정의, 그리고 스케줄링 알고리즘과 I/O바운드 프로세스, CPU바운드 프로세스에 대해 알아보겠습니다.

 

프로세스의 CPU사용

CPU는 프로그램의 기계어 명렁을 실제로 수행하는 컴퓨터 내의 중앙 처리장치 입니다. 프로그램이 시작되어 메모리에 올라가면, 프로그램 카운터(Program Counter)라는 이름의 레지스터가 현재 CPU에서 수행할 코드의 메모리 주소값을 가지고 CPU는 프로그램 카운터가 가리키는 주소의 기계어 명렁을 하나씩 수행하게 됩니다. CPU는 일반적인 시스템내에 하나밖에 없으므로 여러 프로그램이 동시에 수행되는 시분할 환경에서 CPU를 매우 효율적으로 관리되어야 합니다.


I/O 바운드 프로세스 / CPU 바운드 프로세스

사용자 프로그램이 수행되는 과정을 보면 CPU 작업과 I/O 작업의 반복됩니다.

 

- CPU 작업(CPU Burst)

레지스터 간의 연산(Add, Load, Store)등은 사용자 프로그램이 직접 CPU를 가지고 수행하는 비교적 빠른 명령입니다.

 

I/O 작업(I/O Burst)

수행 도중 I/O 요청을 하게되면 CPU의 제어권이 운영 체제 커널로 넘어갈 뿐만 아니라 상대적으로 매우 느린 입출력 장치의 접근을 필요로 합니다. 

 

각 프로그램마다 CPU 버스트와 I/O 버스트가 차지하는 비율이 균일하지는 않습니다. 어떤 프로세스는 I/O 버스트가 빈번하고 어떤 프로세스는 CPU 버스트가 매우 길게 나타납니다. 이와 같은 기준에서 프로세스를 크게 I/O 바운드 프로세스, CPU 바운드 프로세스로 나누어 볼 수 있습니다.

 

- I/O 바운드 프로세스

I/O 요청이 빈번해 CPU 버스트가 짧게 나타나는 프로세스

주로 사용자로부터 인터액션을 계속 받아가며 프로그램을 수행하는 대화형 프로그램

 

- CPU 바운드 프로세스

I/O 작업을 거의 수행하지 않아 CPU 버스트가 길게 나타나는 프로세스 

프로세스 수행의 상당 시간을 입출력 작업 없이 CPU 작업에 소모하는 계산 위주의 프로그램


CPU 스케줄링의 필요성

CPU 스케줄링은 이와 같이 CPU를 사용하는 패턴이 상이한 여러 프로그램이 동일한 시스템 내부에서 함께 실행되기 때문에 필요한 것입니다.  만약 프로세스의 CPU 버스트가 모두 균일한 경우에는 CPU 스케줄링이 큰 의미가 없지만, 우리가 사용하는 시분할 시스템에서는 이와 같이 CPU 버스트가 균일하지 않은 다양한 프로그램이 공존하므로 효율적인 CPU 스케줄링 기법이 반드시 필요합니다.

 

대부분의 프로세스들의 CPU 버스트를 분석해 보면 대부분 짧은 CPU 버스트를 가지며 극히 일부분만 긴 CPU 버스트를 가집니다. 이는 다시 말해 CPU를 한 번에 오래 사용하기 보다는 잠깐 사용하고 I/O 작업을 수행하는 프로세스들이 많다는 뜻입니다.

 따라서 CPU 스케줄링을 할 때는 CPU 버스트가 짧은 프로세스들에게 우선적으로 CPU를 사용할 수 있도록 하는 스케줄링이 필요합니다. 이는  바꾸어 말하면 스케줄링 시 I/O 바운드 프로세스에게 우선순위를 높여주는 것이 바람직하다는 의미가 됩니다.

 


디스패처(dispatcher)

CPU 스케줄링 알고리즘에 의해 어떤 프로세스에게 CPU를 할당해야 할지를 결정하고 나면 선택된 프로세스에게 실제로 CPU를 이양하는 작업이 필요한데, 이와 같이 새롭게 선택된 프로세스가 CPU를 할당받고 작업을 수행할 수 있도록 환경을 설정하는 커널 모듈을 디스패처(dispatcher)라고 합니다.

 

디스패처는 현재 수행중이던 프로세스의 문맥(Context)를 그 프로세스의 PCB에 저장하고 새롭게 선택된 프로세스의 문맥을 PCB로부터 복원한 후 그 프로세스에게 CPU를 넘기는 과정을 수행합니다.

 

디스패처가 하나의 프로세스를 정지시키고 다른 프로세스에게 CPU를 전달하기 까지 걸리는 시간을 우리는 디스패치 지연시간(dispatcher latency)이라고 부릅니다. 디스패치 지연시간의 대부분은 문맥교환 오버헤드에 해당합니다.


스케줄링의 성능 평가

스케줄링 기법의 성능을 평가하기 위해 여러 지표들이 사용되는데, 이들 지표들은 크게 시스템 관점과 사용자 관점으로 나누어볼 수 있다.

 

- 시스템 관점 : CPU활용도와 처리량

- 사용자 관점 : 소요시간, 대기시간, 응답 시간 등 기다리는 시간

 

1. CPU 활용도

전체 시간 중에서 CPU가 일을 한 시간의 비율을 나타냅니다. CPU는 대부분의 시스템에서 하나만 존재하기 때문에 CPU가 일을 하지 않고 휴면상태에 머무르는 시간을 최대한 줄이는 것이 스케줄링의 중요한 목표 입니다. 

 

2. 처리량

주어진 시간 동안 준비 큐에서 기다리고 있는 프로세스 중에서 몇 개를 끝마쳤는지를 나타냅니다. 즉 CPU의 서비스를 원하는 프로세스 중 몇개가 원하는 만큼의 CPU를 사용하고 이번 CPU 버스트를 끝내어 준비큐를 떠났는지를 측정하는 것이 처리량의 개념입니다. 처리량을 높이기 위해서는 CPU 버스트가 짧은 프로세스에게 우선적으로 CPU를 할당 하는것이 유리합니다.

 

3. 소요시간

프로세스가 CPU를 요청한 시점부터 자신이 원하는 만큼 CPU를 다 쓰고 CPU 버스트가 끝날 때까지 걸린 시간을 뜻합니다. 이는 준비 큐에서 기다린 시간과 실제로 CPU를 사용한 시간의 합을 의미합니다. 

 

예를 들어 CPU를 사용하다 I/O 연산을 위해 CPU를 자진 반납했다면 CPU를 사용하기 위해 준비 큐에 들어왔을 때 부터 CPU를 자진 반납하기 전까지 걸린 시간이 됩니다.

 

4. 대기 시간

프로세스가 준비 큐에서 CPU를 얻기 위해 기다린 시간의 합을 의미합니다. 하나의 프로세스는 CPU를 할당받아 일을 하다 준비 큐에 대기하고, 다시 CPU를 할당받고 위의 과정을 작업을 마무리 할때까지 반복하는데 이때 준비큐에서 CPU를 받기 위해 대기한 시간의 합을 의미합니다.

 

5. 응답 시간

준비 큐에 들어온 후 첫번째 CPU를 획득하기 까지 기다린 시간을 의미합니다.

 

중국집을 예로 설명을 하자면,

 

활용도 : 전체 시간 중 주방장이 일한 시간의 비율

처리량 : 주방장이 주어진 시간 동안 몇 명의 손님에게 요리를 만들어 주었는지

소요시간 : 손님이 중국집에 들어와서 주문한 음식을 다 먹고 나가기 까지의 소요된 총 시간

대기 시간 : 음식을 먹은 시간을 제외한 순수 음식을 기다린 시간, 여기서 음식이 조금씩 여러번 나온다면 음식을 먹은 시간은                            제외하고  순수하게 음식만을 기다린 시간

응답 시간 : 최초의 음식이 나오기 까지 기다린 시간


CPU 스케줄링 알고리즘

단기스케줄러에서 사용하며 준비 상태의 프로세스(Ready Queue)중에서 어떤 프로세스에게 CPU를 할당할지를 결정합니다.

 

CPU스케줄링 방식에는 비선점형 방식과 선점형 방식이 존재합니다.

 

- 비선점형(nonpreemptive)

CPU를 획득한 프로세스가 스스로 CPU를 반납하기 전까지 CPU를 빼앗기지 않는 방법

 

- 선점형(preemptive)

프로세스가 CPU를 계속 사용하기를 원하더라도 강제로 빼앗을 수 있는 스케줄링 방법

CPU를 빼앗는 방법으로는 할당시간을 부여한 후 타이머 인터럽트를 발생시키는 방법이 습니다.

 

※ 아래의 알고리즘의 각 예에서 사용하는 시간은 타임퀀텀은 초(s)를 기준으로 설명하겠습니다.

1. FCFS

- 비선점

 

FCFS(First Come First Served) 스케줄링은 프로세스가 준비 큐에 도착한 시간 순서대로 CPU를 할당하는 방식입니다. 이 방식은 CPU를 먼저 요청한 프로세스에게 CPU를 먼저 할당하고, 그 프로세스가 자발적으로 CPU를 반납할 때까지 CPU를 선점하지 않습니다.

 

먼저 온 요청을 먼저 처리하기 때문에 합리적인 스케줄링 방식인 것 같지만 경우에 따라 비효율적일 수도 있습니다. CPU 버스트가 긴 A프로세스가 먼저 도착하고 그 후에 CPU 버스트가 짧은 B프로세스가 도착하게 되면 B프로세스는 CPU를 잠깐 사용하고 I/O 작업을 하면 되는데 A프로세스 때문에 준비 큐에서 오래 기다려야 하므로 평균 대기시간이 길어지게 됩니다.

 

즉, CPU 버스트가 긴 프로세스가 먼저 도착할 경우 평균 대기시간이 길어지는 반면, CPU 버스트가 짧은 프로세스가 먼저 도착하게 되면 평균 대기 시간은 짧아지게 됩니다.

 

프로세스의 도착 순서는 P1, P2, P3라고 가정하겠습니다.

 

- P1

제일 먼저 도착했기 때문에 바로 CPU 사용 가능, 대기시간 0s

 

- P2

P1이 CPU가 다 사용한 시점, 12s 에 CPU를 사용할 수 있음, 대기시간 12s

 

- P3 

P2가 CPU를 다 사용한 시점, 15s 에 CPU를 사용할 수 있음, 대기시간 15s

 

평균 대기시간 : (0+12+15) / 3 = 9s

 

한편, 프로세스의 도착 순서가 P2, P3, P31 이라고 가정해 보겠습니다.

 

- P2

제일 먼저 도착했기 때문에 바로 CPU 사용 가능, 대기시간 0s

 

- P3

P2가 CPU를 다 사용한 시점, 3s 에 CPU를 사용할 수 있음, 대기시간 3s

 

- P1

P3가 CPU를 다 사용한 시점, 6s 에 CPU를 사용할 수 있음, 대기시간 6s

 

평균 대기시간 : (0+3+6) / 3 = 3s

 

두 가지의 경우를 비교했을 때, CPU버스트 시간이 짧은 프로세스가 먼저 도착한 경우 평균 대기시간이 크게 줄어든 것을 확인할 수 있습니다. 첫번째 경우처럼 CPU 버스트가 짧은 프로세스가 CPU 버스트가 긴 프로세스보다 나중에 도착해 오랜 시간을 기다려야 하는 현상을 콘보이 현상(Convoy Effect)라고 합니다. 

 

 

2. SJF

- 비선점 + 선점

 

SJF(Shortest Job First)스케줄링 알고리즘은 CPU 버스트가 가장 짧은 프로세스에게 제일 먼저 CPU를 할당하는 방식입니다. 이와 같은 방식은 CPU 버스트가 짧은 프로세스가 CPU를 먼저 사용하고 준비 큐를 빠져나가기 때문에 평균 대기시간을 가장 짧게 하는 최적의 알고리즘으로 알려져 있습니다.

 

SJF 알고리즘은 비선점형 방식과 선점형 방식 두 가지로 구현될 수 있습니다.

 

- 비선점형

일단 CPU를 획득하면 그 프로세스가 CPU를 자진 반납하기 전까지 CPU를 선점당하지 않는 방식입니다.

 

- 선점형

현재 CPU에서 실행중인 프로세스의 남은 CPU 버스트 시간보다 더 짧은 CPU 버스트시간을 가지는 프로세스가 도착하면 CPU를 빼앗게 됩니다.  일반적인 시분할 환경에서는 중간중간에 새로운 프로세스가 도착하는 경우가 발생하므로 선점형 방식이 평균 대기시간을 가장 많이 줄일 수 있는 방식이 됩니다. SJF를 선점형 구현 방식을 SRTF(Shortest Remaining Time First)라고 합니다. 

 

  • SJF 비선점형 스케줄링

SJF비선점형 방식은 준비큐에서 CPU 버스트가 가장 짧은 프로세스를 선택합니다.

 

- P1

0s 에 도착했고 준비큐가 비었기 때문에 바로 CPU 사용가능, 대기시간 0s

 

- P3

14s 에 P1가 끝났고, 준비큐에는 [P2, P3, P4]가 있음, 그 중에 CPU Burst가 가장 짧은 P3를 선택, 대기시간은 8s 에 도착했고 14s 에 CPU를 할당 받았기 때문에 6s 

 

- P2

16s 에 P3가 끝났고, 준비큐에는 [P3, P4]가 있음, P3와 P4는 CPU Burst 시간이 같기 때문에 먼저 도착한 P2를 선택, 대기시간은 4s 에 도착했고 16s 에 CPU를 할당 받았기 때문에 12s

 

- P4

24s 에 P2가 끝났고 준비큐에는 [P4]가 있음, 대기시간은 10s 에 도착했고 24s에 CPU를 할당 받았기 때문에 14s

 

평균 대기시간 : (0+6+12+14) / 4 = 8s

 

 

  • SJF 선점형 스케줄링

SJF선점형 방식은 프로세스가 새롭게 도착하거나 작업이 끝났을 때마다 CPU 버스트 시간을 비교하게 됩니다. 

선점형인 경우, 매 특정 시간마다 계산을 해야하기 때문에 시간을 기준으로 설명해 드리겠습니다.

 

- 0s

P1만 도착했기 때문에 P1가 먼저 CPU를 사용

 

- 4s (P1 ㅡ> P2)

4s 시점의 프로세스 상황

P1이 CPU를 4s 동안 사용하다 4s 시점에 P2가 준비큐에 도착, P2의 CPU Burst 시간이 P1보다 짧기 때문에 P2에게 CPU를 선점당함

 

- 8s (P2 ㅡ> P3)

8s 시점의 프로세스 상황

P2가 CPU를 4s 동안 사용하다 8s 시점에 P3가 준비큐에 도착, P3의 CPU Burst 시간이 P2보다 짧기 때문에 P3에게 CPU를 선점 당함

 

- 10s (P3 ㅡ> P2)

10s 시점의 프로세스 상황

P3가 10s에 CPU를 모두 사용, 때문에 다음 프로세스를 선택해야함. 현재 P2의 CPU Burst 시간이 가장 짧기 때문에 P2에게 CPU 할당

여기서, P2는 8s P3에게 CPU를 선점 당했다 10s 에 다시 CPU를 할당 받았기 때문에 P2의 총 대기시간에 2s를 더함

 

- 14s (P2 ㅡ> P4)

14s 시점의 프로세스 상황

P2가 14s CPU를 모두 사용, 때문에 다음 프로세스를 선택해야함. 현재 P4의 CPU Burst 시간이 가장 짧기 때문에 P4에게 CPU를 할당

여기서, P4는 10s 에 도착해서 14s 에 처음 CPU를 할당 받았기 때문에 P4의 총 대기시간에 4s를 더함

 

- 22s (P4 ㅡ> P1)

22s 시점의 프로세스 상황

P4가 22s에 CPU를 모두 사용, 때문에 다음 프로세스를 선택해야함. 현재 P1만 남은 CPU Burst시간이 있기 때문에 P1에세 CPU를 할당.

여기서, P1은 4s 에 P2에게 CPU를 선점 당했다 22s 에 다시 CPU를 할당 받았기 때문에 총 대기시간에 18을 더함

 

 

평균 대기시간 : P1 + P2 + P3 + P4 = (18 + 2 + 0 + 4) / 4 = 6

 

 

SJF는 구현에서 현실적으로 어려운 부분은 프로세스의 CPU 버스트 시간을 미리 알 수 없다는 점입니다. 그래서 예측을 통해 CPU Burst 시간을 구한 후 예측치가 가장 짧은 프로세스에게 CPU를 할당하게 됩니다. 또한 계속 CPU Burst가 짧은 프로스세에게만 CPU를 할당할 경우 CPU 버스트가 긴 프로세스는 준비 큐에서 무한정 기다려야 하는 문제가 발생할 수 있는데, 이런 현상을 기아현상이라고 합니다.

 

기아현상을 극복하는 방법에 대해서는 이후에 나올 스케줄링 알고리즘을 통해 설명드리겠습니다.

 

3. 우선순위 스케줄링

- 비선점 + 선점

 

우선순위 스케줄링(Priority Scheduling)이란 준비 큐에서 기다리는 프로세스들 중에서 우선순위가 가장 높은 프로세스에게 제일 먼저 CPU를 할당하는 방식을 말합니다. 이때 우선순위는 우선순위 값을 통해 표시하며 우선순위값이 작을수록 높은 우선순위를 가지는 것으로 가정합니다.

 

우선순위를 결정하는 방식에는 여러가지가 있는데, CPU 버스트시간을 우선순위 값으로 정의하면 우선순위 스케줄링은 SJF 알고리즘과 동일한 의미를 가지게 됩니다. 시스템과 관련된 중요한 작업을 수행하는 프로세스의 우선순위를 높게 부여하면 이러한 프로세스가 CPU를 빨리 할당받을 수 있습니다.

 

노화기법 ?

 우선순위 스케줄링 방식에서의 문제점 중 하나는 기아 현상이 발생할 수 있다는 점인데, 이는 노화기법으로 해결할 수 있습니다. 노화 기법이란, 기다리는 시간이 길어지면 우선순위를 조금씩 높여 언젠가는 가장 높은 우선순위를 가지는 방법입니다.

 

 

4. 라운드 로빈 스케줄링

- 선점

 

라운드 로븐 스케줄링(Round Robin Scheduling)은 지금 까지 소개한 스케줄링 방식과 달리 시분할 시스템의 성질을 가장 잘 활용한 새로운 스케줄링 방식으로 각 프로세스가 CPU를 연속적으로 사용할 수 있는 시간을 특정 시간으로 제한하여 이 시간이 경과하면 프로세스로부터 CPU를 회수해 준비 큐에 있는 다른 프로세스에게 CPU를 할당 합니다.

 

여기서 각 프로세스마다 한 번에 CPU를 연속으로 사용할 수 있는 최대 시간을 할당 시간(Time Quantum)이라고 부릅니다. 할당 시간이 너무 길면 라운드 로빈 스케줄링은 FCFS와 같게 되며 너무 짧은 경우 문맥 교환의 오버헤드가 커지게 됩니다.

 

라운드 로빈 스케줄링은 여러 종류의 이질적인 프로세스가 같이 실행되는 환경에서 효과적입니다. 예를 들어 n개의 프로세스가 준비 큐에 있고 할당 시간이 q라고 할 때, 모든 프로세스는적어도 (n-1)q 시간 이내에 한번은 CPU를 할당받을 수 있게 됩니다. 

 

할당 시간이 만료되어 CPU를 회수하는 방법으로는 타이머 인터럽트를 사용하게 됩니다. 만약 CPU Burst 시간이 할당 시간보다 짧으면 CPU를 자신의 버스트 만큼 사용한 후 스스로 반납하게 됩니다. 

 

라운드 로빈 스케줄링의 목적은 CPU 버스트 시간이 짧은 프로세스가 빨리 CPU를 얻을 수 있도록 하는 동시에, CPU 버스트 시간이 긴 프로세스가 불이익을 당하지 않도록 하는 것이며 프로세스의 대기시간 또한 자신이 사용하는 CPU 버스트 시간에 비례해 증가하므로 공정하다 볼 수 있습니다.

 

5. 멀티 레벨 큐

- 선점

 

멀티 레벨 큐(Multi Level Queue)는 일반적으로 성격이 다른 프로세스들을 별도로 관리하고 프로세스의 성격에 맞는 스케줄링을 적용하기 위해 준비 큐를 여러개로 분할해 관리하는 스케줄링 기법으로 프로세스들이 CPU를 기다리기 위해 한 줄로 서는 것이 아니라 여러 줄로 서는 것을 말합니다. 

 

예를 들어 대화형 작업과 그렇지 않은 작업을 별도의 큐에 줄을 세우도록 하고 대화형 작업을 우선적으로 CPU를 할당하고 대화형 작업이 없을 때 나머지 작업에게 CPU를 할당하는 방식을 생각해볼 수 있습니다.

 

멀티 레벨 큐에서 준비 큐는 보통 대화형 작업을 담기 위함 전위 큐와 계산 위주의 후위 큐로 분할하여 운영합니다.

 

- 전위 큐 : 응답 시간을 짧게 하기 위해 라운드 로빈 스케줄링을 사용

- 후위 큐 : 계산 위주의 작업을 하며 응답 시간이 큰 의미가 없기 때문에 FCFS를 사용

 

멀티레벨 큐 에서는 각각의 준비 큐 자체에 대해서 어느 큐에 먼저 CPU를 할당할 것인지를 결정하는 스케줄링이 필요하며 또한 프로세스가 도착했을 때 어느 큐에 삽입할 지에 대한 매커니즘도 필요합니다. 

 

6. 멀티 레벨 피드백 큐

- 선점

 

멀티 레벨 피드백 큐(Multi Level FeedBack Queue)는 CPU를 기다리는 프로세스를 여러 큐에 줄을 세운다는 측면에서 멀티 레벨 큐와 동일하지만 프로세스가 하나의 큐에서 다른 큐로 이동 가능하다는 점이 다릅니다. 

 

우선순위가 낮은 큐에서 오래 기다렸으면 우선 순위가 높은 큐로 승격시키는 방법으로 우선순위 스케줄링에서 기아 현상의 해결 방법인 노화기법을 구현할 수 있습니다.

 

그림에서 상위에 있는 큐 일수록 우선 순위가 높으며 상위 두 개의 큐에는 각각 라운도 로빈 스케줄링을 사용합니다. 세번째 큐는 FCFS 스케줄링 기법을 사용하는데 프로세스가 준비 큐에 도착하면 우선선위가 가장 높은 큐에 줄서게 됩니다.

 

예를 들어 하나의 A프로세스가 첫번째 큐에서 CPU를 사용하고도 작업을 완료할 수 없으면 두번째 할당시간이 더 많은 두번째 큐에 가서 줄을 서게 됩니다. 두번째 큐에서도 작업이 완료되지 않으면 CPU를 오래 사용하는 계산 위주의 프로세스로 간주되어 최하위 큐로 이동하여 FCFS 스케줄링을 받게 됩니다. 

 

7.HRN

- 비선점

 

HRN(Highest Response Ratio Next)은 SJF 스케줄링의 문제점인 기아 현상을 보완하기 위해 나온 알고리즘으로 준비 큐에서 우선순위에 밀려서 오랫동안 CPU를 받지 못하는 프로세스의 우선순위를 높이는 방식입니다. 우선순위를 정하는 방법은 특정 공식을 사용하며, 가장 큰 값을 가지는 프로세스가 높은 우선순위를 가집니다.

 

 

- (대기시간 + 서비스 시간) / 서비스 시간

 

P1  : (5 + 20) / 20 = 1.25

P2 : (40 + 20) / 20 = 3

P3 : (15 + 45) / 45 = 1.33...

P4 : (20 + 20) / 20 = 2

 

P2의 값이 제일 크기 때문에 P2가 우선적으로 CPU를 할당 받습니다.

 

 

8. 다중 처리기 스케줄링

다중 처리기 시스템(Multi Processor System)은 CPU가 여러개인 시스템을 의미하며 프로세스를 준비큐에 한 줄로 세워서 각 CPU가 알아서 다음 프로세스를 꺼내어 가도록 할 수 있습니다. 

 

그러나 반드시 특정 CPU에서 수행되어야 하는 프로세스가 있는 경우에는 문제가 복잡해 지는데, 이런 상황에서는 프로세스들을 한 줄로 세우는 것이 아니라 CPU별로 줄 세우기를 할 수도 있습니다.

 

한편, 여러 줄로 줄 세우기를 하는 경우 일부 CPU에 작업이 편중되는 현상이 발생할 수 있는데 다중 처리기 스케줄링 에서는 이와 같은 현상을 방지해 각 CPU별 부하를 적절히 분산되도록 하는 부하 균형 매커니즘이 필요합니다.

 

다중 처리기의 스케줄링 방식은 대칭형 다중 처리와 비대칭형 다중 처리로 나누어 볼 수 있습니다.

 

- 대칭형 다중 처리 : 각 CPU가 알아서 스케줄링을 결정하는 방식

- 비대팅형 다중 처리 : 하나의 CPU가 다른 모든 CPU의 스케줄링 및 데이터의 접근을 책임지고 나머지 CPU는 그에 따라                                                       움직이는 방식

 


스케줄링 알고리즘을 사용하는 그 외의 경우

 

스케줄링 알고리즘은 주로 단기 스케줄러에서 준비큐에 있는 프로세스 들 중에서 하나를 선택하는데 사용합니다. 하지만 이 밖에도 CPU 스케줄링이 필요한 경우가 몇가지 있습니다.

 

1. 실행 상태에 있던 프로세스가 I/O 요청 등에 의해 봉쇄 상태로 바뀌는 경우

2. 실행 상태에 있던 프로세스가 타이머 인터럽트 발생에 의해 준비 상태로 바뀌는 경우

3. I/O 요청으로 봉쇄 상태에 있던 프로세스의 I/O 작업이 완료되어 인터럽트가 발생하고 그 결과 이 프로세스의 상태가 준비 상태로 바뀌는     경우

4. CPU에서 실행 상태에 있는 프로세스가 종료되는 경우

 

1,4의 경우 비선점형 스케줄링이며 2,3은 선점형 스케줄링 방식에해당됩니다.

3의 경우에는 이번에 I/O 작업이 완료된 프로세스가 인터럽트 당한 프로세스보다 우선순위가 높아 인터럽트 처리 후 직전에 수행되던 프로세스에게 CPU를 다시 할당하는 것이 아니라 문맥 교환을 통해 I/O 완료된 프로세스에게 CPU를 할당당하는 경우를 말합니다.