
운영체제가 수행하는 가장 핵심적인 일 중 하나는 CPU를 누구에게 줄지 결정하는 것이다. 시스템에는 항상 여러 개의 Ready 상태 프로세스가 있고, CPU는 한 번에 오직 하나의프로세스만 실행할 수 있다.
그래서 운영체제는 스케쥴러(Scheduler)를 통해 어떤 프로세스가 언제 실행할지 결정한다. 이걸 바로 프로세스 스케줄링(Process Scheduling)이라고 한다.
Ready Queue는 CPU를 기다리는 프로세스들이 모여 있는 대기열로, 이 Ready Queue에 있는 애들 중 누굴 먼저 실행할지 정하는 게 바로 스케줄러의 역할이다.
CPU는 단순히 프로스세만 사용하는 것이 아니다. 대부분의 프로그램은 실행 중에 CPU 연산도 하고, 입출력(I/O)도 한다. 예를 들어 워드 프로세서는 입력도 받고, 화면에 출력도 하고, 저장도 한다.


운영체제에서 프로세스 스케줄러(Process Scheduler)는 시스템 자원을 효율적으로 사용하고 사용자에게 빠르고 공정한 응답을 제공하기 위해서 반드시 필요한 구성요소이다. 특히 프로세스 스케줄러는 CPU 스케줄링을 담당하며, 이는 곧 단기 스케줄러(short-term scheduler)라고도 불린다.
프로세스 스케줄러는 준비 상태(ready state)에 있는 여러 프로세스들 중에서, CPU 실행을 위해 하나의 프로세스를 선택하는 일을 담당한다. 이 선택 과정은 스케줄링 결정(Scheduling Decision)이라 불리며, 매우 중요한 결정이다. 이때 선택된 프로세스를 실제로 CPU에 할당하는 역할은 디스 패처(Dispatcher)가 수행한다.
스케줄링 결정은 프로세스 상태 전이 중 다음의 세 가지 경우에 발생할 수 있다.
비선점형 스케줄링에서는 프로세스가 CPU를 스스로 반납할 때까지 계속 실행된다. 이는 위에서 언급한 경우 중 (1), (3)에 해당된다. 즉, 프로세스 I/O 요청으로 대기 상태로 전이하거나, 작업을 모두 마치고 종료될 때까지 CPU는 해당 프로세스에 할당된다.
이 방식은 구현이 단순하고 오버헤드가 적지만, CPU를 오랫동안 사용하는 CPU 바운드(CPU-bound) 프로세스가 있으면 짧은 작업들이 기다리는 시간이 길어지는 문제가 발생할 수 있다. 이는 대화식 환경이나 실시간 시스템에는 적합하지 않다.

선점형 스케줄링은 현재 실행 중인 프로세스를 강제로 중단하고, 다른 프로세스에게 CPU를 할당하는 방식을 말한다. 이 방식은 (1), (2), (3) 모두에서 스케줄링이 발생할 수 있으며, 특히 시간 공유 시스템(time-sharing system)에서 많이 사용된다.
선점형 스케줄링은 반응 시간(response time)을 줄이고, 여러 프로세스가 공정하게 CPU를 사용할 수 있도록 한다. 하지만 문맥 교환(Context Switch)이 자주 발생하므로 오버헤드가 증가할 수 있다.

디스패처는 스케줄러가 선택한 프로세스를 실제로 CPU에서 실행되도록 하는 모듈이다. 디스패처는 다음과 같은 작업을 수행한다. :
문맥 교환(Context Switch) : 이전 프로세스의 상태를 저장하고, 새 프로세스의 상태를 불러온다.
프로그램 카운터 설정 : 새 프로세스가 어디서부터 실행을 재개해야 하는지를 결정한다.
사용자 모드로 전환 : 커널 모드에서 사용자 모드로 전환하여 프로그램 실행을 시작한다.
이러한 작업들에는 시간 지연(dispatch latency)이 존재하며, 이는 시스템 응답 속도에 영향을 줄 수 있다.
운영체제는 다양한 CPU 스케줄링 알고리즘을 제공하며, 이를 정량적으로 비교하기 위해 평가 기준이 존재한다. 대표적인 기준은 다음과 같다.
운영체제가 추구하는 스케줄링의 이상적인 목표는 다음과 같다:
CPU 이용률을 최대화
처리율을 최대화
반환 시간, 대기 시간, 응답 시간을 최소화
또한, 단일 값 외에도 평균 지표들도 중요한 기준이 된다.:
평균 CPU 이용률
평균 처리율
평균 반환 시간
평균 대기 시간
평균 응답 시간
각 스케줄링 알고리즘은 이 기준들에 대해 서로 다른 특성을 가지며, **시스템의 목적에 땨라 적절한 알고리즘을 선택하는 것이 중요하다. 예를 들어, 실시간 시스템에서는 응답시간이 가장 중요하고, 배치 처리 시스템에서는 처리율이 우선시될 수 있다.
운영체제에서 CPU 스케줄링(CPU Scheduling)은 프로세스 관리의 핵심이다. 현대 컴퓨터 시스템은 여러 개의 프로세스가 동시에 실행되기를 원하지만, CPU는 한 번에 하나의 작업만을 처리할 수 있다. 따라서 준비 상태(Ready state)에 있는 프로세스들 중에서 어떤 프로세스를 우선적으로 실행할 것인지를 결정하는 전략이 필요하며, 이를 위한 알고리즘을 CPU 스케줄링 알고리즘이라고 한다.
스케줄링 알고리즘은 Ready Queue에 있는 프로세스들 중에서 CPU를 어느 프로세스에 할당할지를 결정하는 전략이다. 스케줄러는 이 알고리즘을 기반으로 다음에 실행할 프로세스를 선택하며, 선택된 프로세스는 디스패처에 의해 CPU에 전달된다.
대표적인 스케줄링 알고리즘에는 다음과 같은 것들이 있다.
FCFS는 가장 간단한 스케줄링 알고리즘으로, CPU 요청이 먼저 들어온 순서대로 처리한다. 선입선출(FIFO) 방식으로 구현되며, **비선점형(Non-preemtive) 스케줄링에 속한다.



SJF는 CPU 버스트 시간이 가장 짧은 프로세스를 우선 실행한다. 평균 대기 시간을 최소화할 수 있으며, 이론적으로 가장 효율적인(non-preemptive) 알고리즘이다.
방식
예제

각 프로세스에 우선 순위(priority)를 부여하여, 우선 순위가 가장 높은 프로세스를 먼저 실행한다.(보통 작은 숫자가 높은 우선순위)
방식
비선점형 : 현재 실행 중인 프로세스는 우선순위가 낮더라도 끝날 때까지 실행

선점형 : 우선순위가 더 높은 새 프로세스가 오면 현재 프로세스를 중단


Round Robin(RR)스케줄링은 시분할 시스템(time-sharing system)을 위해 설계된 스케줄링 방식이다. 모든 프로세스가 동등한 기회를 갖도록, 고정된 시간 단위(time quantum) 동안만 CPU를 사용하게 하고, 그 시간이 끝나면 큐의 뒤로 이동한다.
FCFS 방식에 preempion 기능을 추가한 형태
사용자 응답 시간을 줄이고, 시스템의 반응성을 높이기 위해 설계되었다.
스케줄링 방식


대기 시간
평균 대기 시간 : (53 + 17 + 68 + 24) / 4 = 40.5
RR은 일반적으로 SJF보다 평균 반환 시간(Turnaround Time)은 높지만, 응답 시간(Response Time)은 더 우수하다. 즉, 사용자 체감 반응 속도가 빠르다.
RR의 수학적 특성 및 분석 : 준비 큐에 n개의 프로세스가 있고, Time Quantum을 q라고 할 때, 각 프로세스는 최대 q 단위씩, 1/n 비율로 CPU를 나눠 가진다. 또한 어떤 프로세스도 (n-1) x q 이상 기다리지 않는다. 단, CPU burst가 q보다 작으면, 해당 프로세스는 그 시간 내에 완료된다.
Time Quantum의 영향

Multilevel Queue Scheduling은 하나의 레디 큐(Ready Queue)를 사용하는 대신, 여러 개의 독립된 큐를 만들어 프로세스를 특성별로 분리하여 관리하는 방식이다. 시스템은 각 프로세스가 가진 고유한 특성(예: 우선 순위, 입출력 빈도, 메모리 사용량 등)에 따라 해당 프로세스를 하나의 큐에 고정적으로 할당한다.
스케줄링 방식
큐 간 스케줄링 : 프로세스는 하나의 큐 안에서만 스케줄링되지만, 여러 큐 중 어느 큐의 프로세스를 우선 실행할지는 고정 우선순위(Fixed Priority) 또는 시간 분할(Time Slice) 방식으로 결정된다.
고정 우선순위 방식
가장 높은 우선순위 큐에 있는 프로세스들만 먼저 실행된다.
낮은 큐는 높은 큐가 비워질 때까지 기다려야 한다.
Starvation 현상 발생 가능
시간 분할 방식(Time Slice)
CPU 시간을 큐들 사이에 일정 비율로 배분한다.
각 큐는 자신에게 할당된 시간 동안 내부 프로세스들을 처리한다.
예제 : 우선순위 기반 멀티레벨 큐
큐는 우선 순위 0(가장 높음)부터 6(가장 낮음)까지 구성되어 있다.
각 큐에는 다음과 같이 프로세스가 분배된다.

- 스케줄러는 항상 가장 높은 우선순위 큐부터 탐색하여 실행할 프로세스를 선택한다.
- starvation 발생
Multilevel Queue scheduling의 가장 큰 단점은 프로세스가 처음 배정된 큐에서 이동할 수 없다는 점이다. 이로 인해 다음과 같은 문제가 발생한다.
입출력 중심(I/O-bound) : 프로세스가 낮은 우선 순위 큐에 고정되면, 응답 시간이 길어진다.
CPU 사용량이 높은 프로세스가 높은 우선 순위 큐에 있으면, 다른 프로세스들이 오랫동안 대기한다.
이 문제들을 해결하기 위해 Multilevel Feedback-Queue Scheduling이 도입되었다.
Multilevel Feedback Queue는 다음과 같은 특징을 가진다.
프로세스가 여러 큐 사이를 이동할 수 있다.
프로세스의 실행 특성(예: CPU burst 시간)에 따라 우선 순위를 동적으로 조정한다.
I/O-bound 프로세스는 우선순위를 올려 빠르게 응답, CPU-bound 프로세스는 낮은 큐로 내려 보냄으로써 공정성과 효율성을 동시에 달성한다.
동작 원리

장점
단점
Windows XP는 고성능과 반응성을 동시에 만족시키기 위해, 우선순위 기반(priority-based)이면서 선점형(preemptive)인 다단계 피드백 큐(Multilevel Feedback Queue) 스케줄링 방식을 채택하였다.
이 방식은 대화형(interactive) 프로그램과 CPU 사용량이 많은 프로그램 사이에서 공정한 CPU 분배를 보장하면서도, 사용자 경험이 중요한 프로세스의 응답 속도를 높이기 위해 설계되었다.
우선 순위 클래스 구조 : Windows XP의 스케줄링은 두 가지 우선순위 클래스(priority class)를 기반으로 한다
실시간 클래스 (Real-Time Class)
가변 클래스 (Variable Class)
- 우선순위 1 ~ 15
- 대부분의 사용자 애플리케이션이 여기에 포함된다.
- 이 클래스의 우선순위는 동적으로 조정될 수 있다.
우선순위 0은 사용되지 않는다.
스케줄링 동작 방식
동적 우선수위 조정
Window XP의 중요한 특징은 변동 우선순위(variable priority)를 사용하여 **CPU 사용량이 높은 프로세스를 억제하고, 대화형 프로세스의 반응성을 개선하는 데 있다.
동작 원리 :
이러한 방식은 인터랙티브(interactive)한 작업이 높은 우선순위를 유지하도록 하여, 사용자의 체감 반응 속도를 향상시킨다.
동시에 배치(Batch Process)은 우선순위가 낮아져 CPU 독점 장비 효과도 있다.

리눅스 운영체제 역시 우선 순위 기반(Priority-Based), 선점형(Preemptive), 다단계 피드백 큐(Multilevel Feedback Queue) 스케줄링 방식을 채택하고 있다. 하지만 Linux는 오픈소스 커널답게 지속적인 발전을 거듭해 왔으며, 버전에 따라 스케줄러의 구조와 성능이 크게 향상되었다.
특히, Linux2.5 버전 이후부터는 새로운 알고리즘 도입을 통해 스레드 수에 관계없이 일정한 시간 안에 스케줄링이 가능하도록 개선되었다.

리눅스 우선순위 체계 : Linux에서는 모든 프로세스에 대해 고정된 숫자의 우선순위가 부여되며, 이는 두 가지 범주로 나뉜다.
실시간 우선 순위(Real-time Priority)
일반 프로세스 우선순위(Nice value 기반)
- 우선 순위 범위 : 100 ~ 140
- 사용자 태스크나 백그라운드 작어베 해당
- 낮은 nice 값일수록 높은 우선 순위를 의미함
nice 값은 명령어를 통해 조정 가능하며, 이를 통해 시스템 자원 배분을 유도 가능
Runqueue 구조 : Linux는 각 CPU마다 Runqueue라는 자료구조를 사용하여 실행 가능한 태스크들을 관리한다. Runqueue는 다음과 같이 두 개의 배열로 구성된다.
Active array : 현재 CPU에서 실행할 수 있는 태스크
Expired array : 자신의 Time Quantum을 다 써서 한동안 대기해야 하는 태스크
동작 방식
동적 우선순위 조정 : Linux는 프로세스의 행동패턴에 따라 우선순위를 동적으로 조정하여 다음과 같은 특성을 구현한다.
I/O-Bound : 더 높은 동적 우선순위 부여 -> 빠른 응답
CPU-Bound : 낮은 동적 우선순위 부여 -> CPU 점유 억제
결과적으로 대화형 프로세스의 반응 속도는 향샹되고, CPU 점유가 많은 작업은 배경에서 조용히 처리된다.
사용자 경험을 개선하면서, 자원도 효율적으로 배분하는 효과를 갖는다.

O(1) 스케줄링과 오버헤드 개선 : 기존 전통적인 스케줄링 방식에서는 스레드 수에 비례해서 스케줄링 결정 시간이 늘어났다. 하지만 Linux 2.5 이후 도입된 O(1) 스케줄러는 이러한 문제를 해결했다.
이후 Linux 2.6.23부터는 CFS (Completely Fair Scheduler)가 도입되어, 프로세스에 정확히 공정한 CPU 시간을 분배하도록 개선됨
Linux는 성능과 공정성을 동시에 만족시키기 위해 설계된 스케줄러를 가지고 있다. 특히 O(1) 알고리즘은 스레드 수가 많아도 스케줄링 결정 시간이 일정하게 유지되어, 멀티코어 시스템에서 매우 높은 효율을 보인다. 또한 동적 우선순위 조정 메커니즘은 사용자 중심의 빠른 반응성과 자원 관리 효율을 함께 제공한다.
이후 버전에서 등장한 CFS는 이런 기조를 유지하면서도 실제 시간을 기반으로 공정한 분배를 실현하고 있으며, 현대 리눅스 배포판(예: Ubuntu, Fedora 등)의 핵심 스케줄러로 사용된다.