운영체제와 CPU 스케줄링 (CPU Scheduling)
1. 개요: 자원 할당의 필요성
모든 프로세스는 실행을 위해 자원을 필요로 하며, 그중에서도 CPU는 모든 프로세스가 공통적으로 사용해야 하는 핵심 자원입니다. 하지만 CPU는 한정되어 있고, 이를 사용하고 싶어 하는 프로세스는 많습니다.
운영체제는 이러한 프로세스들에게 공정하고 합리적으로 CPU 자원을 배분해야 하는데, 이를 CPU 스케줄링(CPU Scheduling)이라고 합니다. 만약 스케줄링이 제대로 이루어지지 않으면, 특정 프로세스가 실행되지 못하거나 시스템 전체의 성능이 저하될 수 있습니다.
2. 프로세스 우선순위 (Priority)
운영체제는 프로세스들에게 어떻게 공정하게 CPU를 배분할까요? 단순히 차례대로 돌아가며 기회를 주는 것이 가장 공정한 방법일까요?
결론부터 말하면 그렇지 않습니다. 프로세스마다 '우선순위'가 다르기 때문입니다.
입출력 집중 vs CPU 집중
프로세스는 실행 중 'CPU를 사용하는 시간(CPU Burst)'과 '입출력 장치를 기다리는 시간(I/O Burst)'을 반복합니다. 이 비중에 따라 크게 두 가지로 나뉩니다.
- 입출력 집중 프로세스 (I/O Bound Process): 비디오 재생, 디스크 백업 등 입출력 작업이 주가 되는 프로세스. CPU를 짧게 쓰고 대기 상태로 들어갑니다.
- CPU 집중 프로세스 (CPU Bound Process): 복잡한 연산, 컴파일, 그래픽 렌더링 등 CPU 연산이 주가 되는 프로세스.
우선순위 부여의 효율성
입출력 집중 프로세스는 CPU를 잠깐만 사용하면 곧바로 대기 상태(입출력 작업)로 빠집니다. 따라서 입출력 집중 프로세스에게 CPU를 먼저 할당해 주면, 이 프로세스가 입출력을 하는 동안 CPU 집중 프로세스가 CPU를 사용할 수 있어 전체적인 자원 효율이 높아집니다.
운영체제는 이러한 중요도에 맞춰 각 프로세스의 PCB(Process Control Block)에 우선순위를 명시하고, 이를 기준으로 어떤 프로세스를 먼저 실행할지 결정합니다.
3. 스케줄링 큐 (Scheduling Queue)
운영체제가 매번 가장 높은 우선순위를 가진 프로세스를 찾기 위해, 모든 프로세스의 PCB를 일일이 뒤적거리는 것은 매우 비효율적입니다.
그래서 운영체제는 프로세스들을 줄 세워 관리하는데, 이를 스케줄링 큐라고 합니다.
(참고: 자료구조의 큐는 선입선출(FIFO)이 원칙이지만, 스케줄링 큐는 우선순위에 따라 순서가 바뀔 수 있습니다.)

주요 큐의 종류
- 준비 큐 (Ready Queue): CPU를 할당받기 위해 기다리는 프로세스들의 줄입니다. 운영체제는 큐에 있는 프로세스 중 우선순위가 높은 프로세스를 꺼내어 실행(Dispatch)합니다.
- 대기 큐 (Waiting Queue): 입출력 장치 등을 사용하기 위해 '대기 상태'에 있는 프로세스들의 줄입니다. 같은 장치를 요구하는 프로세스들은 같은 대기 큐에 서게 됩니다.
프로세스의 이동 과정
- 준비 큐: 프로세스 생성 후 혹은 대기 완료 후, 준비 큐의 마지막에 삽입되어 차례를 기다립니다.
- 실행: 차례가 오면 CPU를 할당받아 실행됩니다.
- 대기 큐: 실행 중 입출력 요청이 발생하면 해당 장치의 대기 큐로 이동합니다.
- 복귀: 입출력 작업이 완료되어 인터럽트가 발생하면, 다시 준비 큐로 이동하여 다음 실행을 기다립니다.
4. 선점형 vs 비선점형 스케줄링
어떤 프로세스가 CPU를 사용 중인데, 갑자기 더 급한(우선순위가 높은) 프로세스가 등장한다면 운영체제는 어떻게 해야 할까요? 여기서 두 가지 선택지가 발생합니다.
1) 선점형 스케줄링 (Preemptive Scheduling)
- 개념: 운영체제가 현재 자원을 사용 중인 프로세스로부터 강제로 자원을 빼앗아 다른 프로세스에 할당하는 방식입니다.
- 장점: 어느 한 프로세스의 자원 독점을 막고, 긴급한 프로세스를 빠르게 처리할 수 있어 시스템의 응답성이 좋습니다.
- 단점: 잦은 문맥 교환(Context Switch)으로 인한 오버헤드(Overhead)가 발생할 수 있습니다.
- 활용: 현대의 대부분의 운영체제(Windows, macOS, Linux 등)가 이 방식을 차용합니다.
2) 비선점형 스케줄링 (Non-preemptive Scheduling)
- 개념: 일단 CPU를 할당받으면, 그 프로세스가 종료되거나 스스로 대기 상태로 들어가기 전까지는 누구도 끼어들 수 없는 방식입니다.
- 장점: 문맥 교환 횟수가 적어 오버헤드가 낮습니다.
- 단점: 하나의 프로세스가 CPU를 오래 사용하면, 다른 프로세스들은 하염없이 기다려야 하므로 전체적인 처리율이 떨어질 수 있습니다.
요약 비교표
| 구분 | 선점형 (Preemptive) | 비선점형 (Non-preemptive) |
|---|
| 자원 반납 | 강제 회수 가능 (운영체제 개입) | 자발적 반납 (종료 또는 대기) |
| 장점 | 자원 독점 방지, 빠른 응답성 | 문맥 교환 오버헤드 최소화 |
| 단점 | 문맥 교환 오버헤드 발생 | 긴 작업 실행 시 다른 작업 대기 (기아 현상) |