tlov

[스터디] 4-1. CPU 스케줄링 본문

개발/운영체제

[스터디] 4-1. CPU 스케줄링

nowitzki 2024. 8. 15. 15:07

CPU 스케줄링?

운영체제가 프로세스들에게 공정하고 합리적으로 CPU 자원을 배분하는 것이다. 해당 작업의 목표는 CPU가 쉬지 않고 주어진 시간동안 많은 작업을 하며 프로세스들간의 짧은 응답시간을 갖는 것이다.

 

CPU 스케줄링은 다음과 같은 상황에서 발생한다.

1. 실행 상태 -> 대기 상태

2. 실행 상태 -> 준비 상태

3. 대기 상태 -> 준비 상태

4. 종료 상태

 

 

프로세스 우선순위

어떤 방식이 가장 합리적인 CPU 스케줄링일까?

가장 먼저 생각해볼 수 있는 방법은 CPU를 사용하고 싶어하는 프로세스들이 차례대로 CPU 자원을 할당받는 것이다. 하지만, 이 방법이 생각만큼 좋은 방법은 아니다. 왜냐면 빨리 처리해야 하는 프로세스들이 있기 때문이다. 즉, 프로세스마다 우선순위가 다르기 때문이다. 일반적으로 입출력 집중 프로세스(=IO-Bound 프로세스)가 CPU 집중 프로세스(=CPU-Bound 프로세스)가 우선순위보다 우선순위가 더 높다.

 

왜냐면, 입출력 집중 프로세스가 대기 상태에 머무는 시간이 더 많기 때문에 그냥 우선순위를 높여서 CPU를 많이 쓰게하면 빠르게 CPU 작업을 처리하고 다시 대기 상태에 머물게 되어 나머지 시간동안 CPU 작업이 많은 CPU 집중 프로세스에 몰빵할 수 있기 때문이다.

 

이처럼 모든 프로세스가 같은 우선순위를 가지고 차례대로 실행되는 것보다는 우선순위를 가지고 실행되는 것이 효율적이다. 우선순위는 프로세스의 PCB에 저장되고 운영체제는 이 PCB 내의 우선순위를 보고 스케줄링 알고리즘에 따라 CPU 자원을 할당한다. 근데, 프로세스마다 우선순위가 적혀있다해도 다음에 실행할 프로세스를 결정하기 위해 모든 프로세스의 PCB를 열어보는 것은 매우 비효율적이다. 그래서 운영체제는 스케줄링 큐를 사용한다.

 

스케줄링 큐는 어떤 자원을 사용하고 싶은 프로세스들이 서는 줄 같은 개념이다. 스케줄링 큐는 CPU, 하드 디스크, 입출력 장치 등으로 나누어 각각 사용하고 싶은 자원에 프로세스들이 줄을 선다. 여기서 큐라고 해서 꼭 FIFO일 것 같지만 스케줄링 큐는 FIFO로 작동되지는 않는다.

 

 

준비 큐와 대기 큐

 

준비 큐는 CPU를 이용하고자 하는 프로세스들이 서는 줄

대기 큐는 입출력 장치를 이용하고 싶은 프로세스들이 서는 줄

 

아까 프로세스 상태 중에서 준비 상태와 대기 상태에 따른 큐인 것이다.

 

입출력 장치 별로 대기 큐를 만들어두어 같은 장치를 요구한 프로세스들은 같은 큐에서 대기한다. 입출력 인터럽트가 발생하면 운영체제는 작업이 완료된 PCB를 찾고 이 PCB의 상태를 대기상태에서 준비상태로 만든다. 그러고 대기 큐에서 준비 큐로 옮긴다.

 

 

선점형과 비선점형 스케줄링

가령 어떤 프로세스가 지금 자기 차례가 되어 CPU를 할당받아 이용하고 있는데, 어떤 프로세스가 급하게 처리해야 한다고 당장 CPU 자원을 할당받을 수 있냐고 요청한 것이다. 이때, 당장 CPU 자원을 뺏어 할당하는 방법이 있고, 일단 할당된 프로세스 작업이 끝나고 할당해주는 방법이 있다.

 

선점형 스케줄링이 타이머 인터럽트와 같은 상황이 생기면 CPU 자원을 뺏어 할당하는 방법이고, 비선점형 스케줄링은 할당된 프로세스 작업이 끝나고 할당하는 방법이다.

 

어떤 프로세스 하나가 CPU 자원 하나를 독점해서 쓸 수 없는 스케줄링 - 선점형

ㄴ 오버헤드가 크다

ㄴ 모든 프로세스가 골고루 자원 이용이 가능

어떤 프로세스가 CPU를 이용하고 있다면 프로세스가 종료되거나 대기 상태에 들어갈 때까지 CPU 자원을 할당하지 않음 - 비선점형

ㄴ 오버헤드가 작다

ㄴ 모든 프로세스가 골고루 자원 이용이 불가능