핵심 인사이트 (3줄 요약)
- 본질: 우선순위 스케줄링 (Priority Scheduling)은 Ready 큐에 있는 프로세스 중 우선순위 값이 가장 높은 작업에게 CPU (Central Processing Unit)를 먼저 주는 스케줄링 방식이다.
- 가치: 커널 작업, 대화형 작업, 실시간 작업처럼 더 빨리 반응해야 하는 일을 일반 배치 작업보다 앞세울 수 있어, 시스템의 목적성과 응답성을 높인다.
- 판단 포인트: 순수 우선순위만 믿으면 기아 상태 (Starvation)와 우선순위 역전 (Priority Inversion)이 쉽게 생기므로, 에이징 (Aging), 우선순위 상속 (Priority Inheritance), 동급 내 RR (Round Robin) 정책을 함께 설계해야 한다.
Ⅰ. 개요 및 필요성
우선순위 스케줄링은 "먼저 온 순서"보다 "더 중요한 순서"를 우선하는 CPU 배분 규칙이다. 프로세스마다 중요도 점수를 두고, 스케줄러는 가장 높은 우선순위의 작업을 먼저 실행한다. 어떤 시스템에서는 작은 숫자가 높은 우선순위를 뜻하고, 어떤 시스템에서는 큰 숫자가 더 높을 수 있지만, 핵심은 숫자의 방향이 아니라 중요도 기반 선택이라는 점이다.
이 방식이 필요한 이유는 운영체제 안의 모든 작업이 같은 가치를 가지지 않기 때문이다. 인터럽트 처리, 오디오 재생, 사용자 인터페이스 응답, 실시간 제어 태스크는 백그라운드 압축이나 배치 분석보다 늦게 처리되면 체감 품질이나 시스템 안정성이 크게 떨어진다. FCFS (First Come First Served)처럼 순서만 보는 정책은 공평해 보여도, 실제 시스템의 중요도를 반영하지 못한다.
특히 다중 프로그래밍 환경에서는 "누가 더 급한가"를 강제로 반영할 장치가 필요하다. 우선순위 스케줄링은 바로 그 판단 축을 제공하며, 현대 운영체제의 실시간 클래스, 인터랙티브 보정, 사용자 nice 정책도 모두 이 철학에서 출발한다.
┌────────────────────────────────────────────────────────────────────┐
│ 우선순위 스케줄러의 기본 시선 │
├────────────────────────────────────────────────────────────────────┤
│ Ready Queue │
│ │
│ Priority 1 : [ P_rt ] [ P_audio ] │
│ Priority 2 : [ P_ui ] │
│ Priority 3 : [ P_batch1 ] [ P_batch2 ] │
│ │
│ Dispatcher는 가장 위의 비어 있지 않은 우선순위부터 고른다. │
└────────────────────────────────────────────────────────────────────┘
- 📢 섹션 요약 비유: 우선순위 스케줄링은 병원 응급실의 분류 체계와 같다. 먼저 온 사람만 보는 줄서기가 아니라, 더 위급한 환자를 먼저 진료해 전체 시스템을 지키는 방식이다.
Ⅱ. 아키텍처 및 핵심 원리
우선순위 스케줄링의 핵심은 우선순위 부여 → 최고 우선순위 탐색 → CPU 배정 → 필요 시 선점의 반복이다. 우선순위는 정적으로 부여될 수도 있고, 대기 시간이나 I/O (Input/Output) 특성에 따라 동적으로 바뀔 수도 있다. 실제 커널은 이 값을 PCB (Process Control Block)나 스케줄링 엔티티에 기록해 둔다.
| 요소 | 역할 | 판단 포인트 |
|---|---|---|
| 우선순위 값 | 중요도 표현 | 정적 정책인지, 동적 조정인지 |
| Ready 큐 구조 | 후보 프로세스 저장 | 우선순위별 다중 큐, 힙, 비트맵 등 |
| 디스패처 (Dispatcher) | 실행 대상 선택 및 문맥 전환 | 가장 높은 우선순위 탐색 비용 최소화 |
| 선점 규칙 | 실행 중 작업을 빼앗을지 결정 | 응답성 vs 문맥 교환 오버헤드 |
| 동급 내 정책 | 같은 우선순위끼리의 순서 | RR, FCFS, 가상 런타임 등 |
보통 선점형 우선순위 스케줄링에서는 더 높은 우선순위 작업이 도착하면 현재 작업을 중단시키고 CPU를 넘긴다. 비선점형에서는 현재 작업이 종료되거나 I/O 대기에 들어갈 때까지 기다린다. 따라서 같은 우선순위 스케줄링이라도 선점 여부에 따라 응답성은 크게 달라진다.
┌────────────────────────────────────────────────────────────────────┐
│ Preemptive priority scheduling flow │
├────────────────────────────────────────────────────────────────────┤
│ time 0 2 4 7 │
│ │
│ running: P3 ────────┐ │
│ └─ higher priority P1 arrives at t=2 │
│ │ │
│ ▼ │
│ CPU: [ P3 ][ P1 ][ P2 ][ P3 resumes ] │
│ priority3 p1 p2 remaining work │
│ │
│ 규칙: 더 높은 우선순위가 오면 현재 작업은 즉시 선점될 수 있다. │
└────────────────────────────────────────────────────────────────────┘
우선순위는 어디서 오느냐도 중요하다. 실시간 시스템은 데드라인과 태스크 중요도가 우선이고, 범용 운영체제는 사용자 정책, I/O 성향, 대기 시간, 인터랙티브 반응성 등을 함께 고려한다. 그래서 실무에서의 Priority Scheduling은 "숫자 하나"가 아니라 시스템이 중요도를 표현하는 방식 전체에 가깝다.
- 📢 섹션 요약 비유: 이 구조는 회사 업무 분장과 비슷하다. 사장님 긴급 지시는 지금 하던 일반 문서를 잠깐 멈추게 만들 수 있고, 같은 급의 일들끼리는 차례표를 돌려 공정하게 처리한다.
Ⅲ. 비교 및 연결
우선순위 스케줄링을 이해하려면 다른 정책들이 사실상 "무엇을 우선순위로 보느냐" 의 차이라는 점을 봐야 한다. FCFS는 도착 순서를 우선순위로 보고, SJF (Shortest Job First)는 예상 실행 시간이 짧은 작업을 더 높은 우선순위로 본다. MLFQ (Multilevel Feedback Queue)는 여러 우선순위 큐를 두고 실행 패턴에 따라 프로세스를 오르내리게 만든다.
| 정책 | 우선 기준 | 장점 | 약점 | 연결 포인트 |
|---|---|---|---|---|
| FCFS | 도착 순서 | 단순하고 예측 가능 | 긴 작업이 전체를 막음 | 우선순위 축이 "먼저 온 순서"인 특수형 |
| RR (Round Robin) | 동급 공정성 | 응답성 확보 | 중요도 차별이 약함 | 같은 우선순위 내부 정렬에 자주 사용 |
| SJF | 짧은 버스트 | 평균 대기 시간 우수 | 실행 시간 예측 어려움 | "짧을수록 높은 우선순위"로 볼 수 있음 |
| 순수 우선순위 스케줄링 | 정책상 중요도 | 중요 작업 즉시 처리 가능 | 기아 상태 위험 | 실시간/커널 처리에 직접적 |
| MLFQ | 동적 행동 기반 | 응답성과 공정성 균형 | 튜닝 복잡 | 우선순위 개념을 발전시킨 하이브리드 |
중요한 차이는 정적 우선순위와 동적 우선순위다. 정적 우선순위는 예측 가능하고 제어하기 쉽지만, 낮은 우선순위 작업이 계속 밀릴 위험이 크다. 동적 우선순위는 대기 시간이 길어지거나 인터랙티브 성향이 강한 작업의 우선순위를 높여 불공정을 줄이지만, 정책이 복잡해진다.
또한 우선순위는 CPU 스케줄링만의 개념이 아니다. 디스크 I/O 스케줄링, 네트워크 QoS (Quality of Service), 락 경합 제어에도 같은 사고방식이 적용된다. 즉 이 개념은 운영체제가 "무엇을 더 급하다고 볼 것인가" 를 표현하는 공통 언어다.
- 📢 섹션 요약 비유: 우선순위 스케줄링은 줄 세우는 기준을 바꾸는 일과 같다. 키순으로 세울지, 나이순으로 세울지, 급한 사람부터 세울지에 따라 같은 사람들도 전혀 다른 순서가 된다.
Ⅳ. 실무 적용 및 기술사 판단
실무에서 우선순위 스케줄링은 단순히 VIP를 먼저 태우는 문제가 아니다. 중요 작업의 응답성을 높이면서도, 낮은 우선순위 작업이 영원히 굶지 않게 만드는 균형 문제다. 그래서 실제 시스템은 순수 우선순위만 쓰지 않고 에이징, 동급 RR, 우선순위 상속, 실시간 클래스 분리를 함께 사용한다.
가장 대표적인 실패는 기아 상태다. 높은 우선순위 작업이 계속 들어오면 낮은 우선순위 작업은 CPU를 한 번도 받지 못할 수 있다. 이를 막기 위해 대기 시간이 길어질수록 우선순위를 점차 높이는 에이징을 적용한다. 또 공유 자원을 낮은 우선순위 작업이 쥐고 있을 때, 중간 우선순위 작업들이 계속 CPU를 빼앗아 최상위 작업을 막아 버리는 우선순위 역전 문제도 있다. 이 경우에는 락을 잡은 낮은 우선순위 작업을 일시적으로 끌어올리는 우선순위 상속이 필요하다.
┌────────────────────────────────────────────────────────────────────┐
│ Priority inversion and inheritance │
├────────────────────────────────────────────────────────────────────┤
│ H (high) needs lock L │
│ M (mid) keeps getting CPU │
│ L (low) currently holds the lock │
│ │
│ without inheritance: H waits -> M runs -> L cannot release lock │
│ with inheritance : L temporarily boosted -> releases lock -> H │
└────────────────────────────────────────────────────────────────────┘
실무 판단 기준
- 정말 절대 우선이 필요한가? 하드 실시간이나 인터럽트 처리라면 선점형 고우선이 필요하지만, 일반 사용자 작업까지 모두 그렇게 설계하면 불공정이 커진다.
- 낮은 우선순위 작업이 언젠가는 실행된다는 보장이 있는가? 에이징이나 피드백 승급이 없다면 운영상 장애가 숨어 있을 수 있다.
- 동급 작업은 어떻게 공정하게 나눌 것인가? 같은 우선순위 안에서 RR을 섞지 않으면 특정 작업이 독점할 수 있다.
- 락과 공유 자원에 대한 역전 방지가 있는가? 실시간 시스템에서는 우선순위 상속이나 우선순위 천장 기법이 필수적일 수 있다.
안티패턴
-
중요해 보인다는 이유로 너무 많은 작업을 높은 우선순위에 몰아넣는 것
-
사용자
nice값만 조정하고 기아 상태나 역전 가능성은 검토하지 않는 것 -
실시간 클래스와 일반 클래스를 분리하지 않아 전체 시스템을 불안정하게 만드는 것
-
📢 섹션 요약 비유: 우선순위 운영은 VIP 전용 통로를 만드는 일과 같다. 꼭 필요한 사람만 그 통로를 써야 질서가 유지되고, 오래 기다린 일반 손님을 가끔 끌어올려 주는 규칙이 있어야 줄이 무너지지 않는다.
Ⅴ. 기대효과 및 결론
우선순위 스케줄링의 가장 큰 효과는 시스템이 정말 중요한 일을 먼저 처리하게 만든다 는 점이다. 덕분에 사용자 인터페이스는 더 민첩해지고, 커널 서비스는 더 안정적으로 반응하며, 실시간 제어는 필요한 마감 시간에 가까워질 수 있다. 단순 공평성만으로는 얻기 어려운 목적 지향적 자원 배분이 가능해진다.
하지만 순수한 우선순위 사회는 쉽게 불공정해진다. 낮은 우선순위 작업은 굶을 수 있고, 락이 섞이면 오히려 높은 우선순위 작업이 막히는 역설도 생긴다. 그래서 현대 운영체제는 우선순위를 절대 규칙으로만 쓰지 않고, 에이징, 피드백 큐, 우선순위 상속, 동급 공정 스케줄링을 함께 섞어 사용한다.
정리하면 우선순위 스케줄링은 운영체제가 중요도를 표현하는 가장 기본적인 언어다. 기억할 핵심은 분명하다. 급한 일을 먼저 처리하게 해 주지만, 그대로 두면 불공정이 커지므로 반드시 보정 메커니즘과 함께 설계해야 한다는 점이다.
- 📢 섹션 요약 비유: 좋은 지휘자는 솔로 파트를 먼저 들리게 하지만, 나머지 연주자가 영원히 소리를 못 내게 두지는 않는다. 전체 합주가 유지되려면 중요도와 공정성이 함께 맞아야 한다.
📌 관련 개념 맵
| 개념 | 연결 포인트 |
|---|---|
| 기아 상태 (Starvation) | 낮은 우선순위 작업이 무한 대기하는 대표 부작용이다 |
| 에이징 (Aging) | 오래 기다린 작업의 우선순위를 높여 기아를 완화한다 |
| 우선순위 역전 (Priority Inversion) | 낮은 우선순위 작업이 높은 우선순위 작업을 간접적으로 막는 현상이다 |
| 우선순위 상속 (Priority Inheritance) | 락을 쥔 낮은 우선순위 작업을 임시 승급시키는 해결책이다 |
| RR (Round Robin) | 같은 우선순위 내부의 공정성을 확보하는 보조 정책이다 |
| SJF (Shortest Job First) | 실행 시간이 짧을수록 높은 우선순위를 부여한 특수형으로 볼 수 있다 |
| MLFQ (Multilevel Feedback Queue) | 우선순위를 동적으로 조정하는 발전형 스케줄러다 |
📈 관련 키워드 및 발전 흐름도
모든 작업을 동일하게 다루는 한계
│
▼
우선순위 기반 CPU 배분
│
▼
선점형 우선순위 스케줄링
│
├──────────────▶ 기아 상태와 에이징
├──────────────▶ 우선순위 역전과 상속
└──────────────▶ MLFQ 같은 동적 하이브리드 정책
이 흐름도는 중요도 기반 자원 배분이라는 기본 아이디어가, 공정성과 동기화 문제를 해결하기 위해 보정 메커니즘과 결합해 발전해 왔음을 보여 준다.
👶 어린이를 위한 3줄 비유 설명
- 우선순위 스케줄링은 학교에서 아픈 친구나 급한 심부름을 먼저 도와주는 규칙과 같아요.
- 그런데 급한 친구만 계속 오면 맨 뒤 친구는 영원히 자기 차례를 못 받을 수 있어요.
- 그래서 컴퓨터는 오래 기다린 친구를 조금씩 앞으로 올려 주며 모두가 언젠가는 차례를 받게 만든답니다.