CPU 스케줄링
이란, 컴퓨터 시스템에서 여러 프로세스가 CPU를 공유하고 실행되는 과정을 관리하는 방법입니다.
CPU 스케줄링의 목적은 CPU의 활용도를 높이고, 프로세스의 대기 시간과 응답 시간을 줄이고, 시스템의 처리량과 성능을 향상시키는 것입니다.
CPU 스케줄링에는 여러 종류의 알고리즘이 있습니다.
대표적인 예로는 선입선출(FIFO)
, 최단 작업 우선 스케줄링(SJF)
, 최소 잔류 시간 우선 스케줄링(SRTF)
, 우선순위(Priority)
, 라운드로빈(RR)
, 멀티 레벨 큐(Multilevel Queue)
, 멀티 레벨 피드백 큐(Multilevel Feedback Queue)
등이 있습니다.
CPU 스케줄링의 종류를 알아보기 전에 선점형 스케줄링
과 비선점형 스케줄링
이 뭔지 간단하게 알아보겠습니다.
실행 중인 프로세스가 CPU를 점유하고 있을 때 다른 프로세스가 CPU를 강제로 빼앗을 수 있는 방식입니다.
예를 들어, 우선순위가 높은 프로세스나 시간이 적게 남은 프로세스가 CPU를 요청하면, 실행 중인 프로세스는 중단되고 다른 프로세스가 CPU를 할당받습니다.
이렇게 하면, 긴급한 작업이나 짧은 작업을 빠르게 처리할 수 있습니다. 하지만, 프로세스가 자주 교체되면 오버헤드가 발생하고, 실행 순서가 예측하기 어렵습니다.
선점형 스케줄링의 예로는 라운드로빈(RR)
, 우선순위(Priority)
기반 등이 있습니다.
실행 중인 프로세스가 CPU를 점유하고 있을 때 다른 프로세스가 CPU를 빼앗을 수 없는 방식입니다.
예를 들어, 실행 중인 프로세스가 입출력 작업을 요청하거나 종료될 때까지 CPU를 계속 사용합니다.
이렇게 하면, 프로세스의 교체가 적게 일어나서 오버헤드가 줄고, 실행 순서가 예측하기 쉽습니다. 하지만, 긴 작업이 CPU를 오랫동안 점유하면 다른 작업들이 오래 기다려야 합니다.
비전형 스케줄링의 예로는 선입선출(FIFO)
, 최단 작업 우선 스케줄링(SJF)
등이 있습니다.
프로세스가 도착한 순서
대로 CPU를 할당하는 가장 간단하고 공평한 스케줄링 알고리즘입니다. 비선점형 스케줄링이므로 프로세스가 자발적으로 CPU를 반납할 때 까지 CPU를 빼앗지 않습니다.
예를 들어, 프로세스 A, B, C가 각각 3초, 5초, 2초의 서비스 시간을 가지고 있고, A가 먼저 도착하고 B가 그 다음에 도착하고 C가 마지막에 도착한다면, FCFS 스케줄링은 다음과 같은 순서로 프로세스를 실행합니다.
프로세스 | 서비스 시간 | 대기 시간 | 응답 시간 | 반환 시간 |
---|---|---|---|---|
A | 3초 | 0초 | 0초 | 3초 |
B | 5초 | 3초 | 3초 | 8초 |
C | 2초 | 8초 | 8초 | 10초 |
이렇게 되면 평균 대기 시간은 (0 + 3 + 8) / 3 = 3.67초, 평균 응답 시간은 (0 + 3 + 8) / 3 = 3.67초, 평균 반환 시간은 (3 + 8 + 10) / 3 = 7초가 됩니다.
짧은 작업이 긴 작업보다 늦게 도착하면 긴 작업을 기다려야 하므로 평균 대기 시간이 증가할 수 있습니다. 이를 호위 효과(convoy effect)
라고 합니다.
FCFS 스케줄링은 비선점형(nonpreemptive) 방식이므로 한 프로세스가 CPU를 점유하고 있으면 다른 프로세스는 CPU를 빼앗을 수 없습니다. 이는 CPU 사용률을 낮추고 I/O 바운드 프로세스의 대기 시간을 증가시킬 수 있습니다.
FCFS 스케줄링은 간단하고 공평하지만 효율적이지는 않습니다. 따라서 실제 시스템에서는 보다 성능이 좋은 다른 스케줄링 알고리즘을 사용하는 경우가 많습니다.
SJF는 준비 큐에 있는 프로세스들 중에서 실행 시간이 가장 짧은 프로세스를 먼저
실행시키는 방식입니다.
SJF는 평균 대기 시간과 평균 응답 시간을 최소화하는 최적의 알고리즘입니다.
SJF는 비선점형과 선점형 두 가지 방식으로 구현할 수 있습니다.
비선점형 SJF
는 이미 CPU를 할당받은 프로세스는 실행이 완료될 때까지 CPU를 빼앗기지 않습니다.
선점형 SJF
는 새로운 프로세스가 준비 큐에 도착하면 현재 실행 중인 프로세스의 남은 실행 시간과 비교하여 새로운 프로세스의 실행 시간이 더 짧으면 CPU를 선점하여 새로운 프로세스에게 할당합니다.
선점형 SJF
에서 기아 현상
이 생길 수 있습니다.최소 잔류 시간 우선 스케줄링(SRTF) 방식은 프로세스의 남은 실행 시간이 가장 짧은 것부터 우선적으로 처리하는 CPU 스케줄링 알고리즘입니다.
이 방식은 선점형 스케줄링이므로, 새로운 프로세스가 도착하거나 기존의 프로세스가 종료될 때마다 CPU를 재할당합니다.
SRTF 방식은 평균 대기 시간과 평균 응답 시간을 최소화할 수 있으므로, 시스템의 처리량을 높이고 사용자의 만족도를 향상시킬 수 있습니다.
하지만, 실행 시간이 긴 프로세스는 계속해서 선점당할 수 있어서 기아 현상이 일어날 수 있습니다.
우선순위 스케줄링이란 프로세스나 작업에 우선순위
를 부여하여 실행 순서를 결정하는 스케줄링 방식입니다.
우선순위 스케줄링은 CPU의 효율성과 처리량을 높이기 위해 사용됩니다.
우선순위 스케줄링에는 선점/비선점 방식
과 정적/동적 방식
의 스케줄링이 있습니다.
정적 우선순위 스케줄링
은 프로세스나 작업이 생성될 때 우선순위가 정해지고 변경되지 않는 방식입니다.
동적 우선순위 스케줄링
은 프로세스나 작업의 상태에 따라 우선순위가 변화하는 방식입니다.
에이징(Aging) 기법
을 사용해 해결할 수 있습니다.라운드 로빈 스케줄링은 시분할 시스템에서 사용되는 선점형 스케줄링 알고리즘 중 하나입니다.
이 알고리즘은 프로세스들에게 우선순위를 부여하지 않고, 정해진 시간 단위(Time Quantum)
만큼 순서대로 CPU를 할당합니다. 시간 단위는 보통 10ms에서 100ms 사이입니다.
시간 단위 동안 수행된 프로세스는 준비 큐의 맨 뒤로 이동하고, 다음 프로세스에게 CPU를 넘깁니다.
멀티레벨 큐 스케줄링이란 운영체제에서 프로세스를 여러 개의 큐로 분류하여 실행하는 방식입니다.
큐 자체에 대한 알고리즘
과 각 큐의 자신만의 알고리즘
을 스케줄링 해야합니다.
예를 들어, 대화형 작업을 담기 위한 전위 큐
와 계산 위주의 작업을 담기 위한 후위 큐
로 분할해 운영할 수 있습니다.
큐 자체에 대한 스케줄링
으로 가장 쉽게 생각할 수 있는 방식은 고정 우선순위 방식
입니다. 이 방식에서는 큐에 고정적인 우선순위를 부여해 우선순위가 높은 큐를 먼저 서비스합니다. 전위 큐가 비어 있는 경우에만 후위 큐에 있는 프로세스에게 CPU가 할당될 수 있습니다.
타임 슬라이스(time slice)
방식을 사용하면 큐에 대한 기아 현상
을 해소할 수 있습니다. 이 때는 각 큐에 CPU 할당 시간을 다르게 적용할 수 있습니다.
이렇게 하면 각 프로세스의 특성에 맞게 적절한 스케줄링을 할 수 있습니다.
다양한 종류의 프로세스를 효율적으로 관리할 수 있다는 점입니다.
예를 들어, CPU 바운드 프로세스와 입출력 바운드 프로세스를 구분하여 실행하면, CPU의 활용도를 높이고, 입출력 장치의 대기 시간을 줄일 수 있습니다.
우선순위가 높은 프로세스에게 더 많은 CPU 시간을 할당하여 응답성을 향상시킬 수 있습니다.
프로세스를 여러 개의 큐에 나누고, 각 큐는 다른 우선순위와 시간 할당량을 가집니다.
우선순위가 높은 큐에 있는 프로세스는 먼저 실행되고, 시간 할당량이 초과되면 다음 우선순위의 큐로 이동
합니다. 이렇게 하면 프로세스의 응답 시간과 처리량을 균형있게 유지할 수 있습니다.
멀티레벨 큐와 다른 점은 프로세스가 하나의 큐에서 다른 큐로 이동 가능하다는 점입니다.
프로세스의 특성에 따라 적절한 우선순위와 시간 할당량을 부여할 수 있습니다.
CPU를 효율적으로 활용할 수 있습니다.
기아 현상을 방지할 수 있습니다.
큐의 수와 우선순위를 결정하는 것이 어렵습니다.
오버헤드가 발생할 수 있습니다.
선점형 스케줄링이므로 프로세스의 실행 순서를 예측하기 어렵습니다.
CPU 스케줄링에서 기아 현상
이란 프로세스가 CPU를 할당받지 못하고 무한정 대기하는 상황을 말합니다. 이러한 상황은 CPU 스케줄링 알고리즘의 성능에 영향을 미치고, 프로세스의 응답 시간과 처리량을 저하시킬 수 있습니다.
기아 상태를 방지하기 위해서는 CPU 스케줄링 알고리즘에 우선순위
를 부여하거나, 에이징(Aging) 기법
을 사용하는 등의 방법이 있습니다.
기아 상태를 해결하기 위한 방법 중 하나는 에이징(Aging)
이라고 합니다.
에이징은 프로세스가 대기 큐에서 기다릴수록 우선순위를 증가
시켜주는 방식입니다. 이렇게 하면 오랫동안 기다린 프로세스가 결국에는 CPU를 할당받을 수 있습니다.
에이징은 우선순위 기반의 스케줄링
알고리즘에서 주로 사용됩니다.
또 다른 방법은 피드백(Feedback)
이라고 합니다.
피드백은 프로세스가 CPU를 사용할수록 우선순위를 감소시켜주는 방식
입니다. 이렇게 하면 자주 CPU를 사용하는 프로세스가 낮은 우선순위로 밀려나게 되고, 오랫동안 기다린 프로세스가 높은 우선순위로 올라가게 됩니다.
피드백은 다단계 큐(Multilevel Queue)
나 다단계 피드백 큐(Multilevel Feedback Queue)
와 같은 스케줄링 알고리즘에서 주로 사용됩니다.
이 외에도 페어 스케줄링(Fair Scheduling)
이라는 방법도 있습니다.
페어 스케줄링은 모든 프로세스에게 동일한 비율의 CPU 시간을 할당
해주는 방식입니다.
예를 들어, 10개의 프로세스가 있다면 각각 10%의 CPU 시간을 받게 됩니다. 이렇게 하면 어떤 프로세스도 기아 상태에 빠지지 않습니다.
페어 스케줄링은 리눅스(Linux)와 같은 운영체제에서 사용되는 스케줄링 알고리즘입니다.