우선순위 스케줄링 (Priority Scheduling)

핵심 인사이트 (3줄 요약)

  1. 본질: 우선순위 스케줄링 (Priority Scheduling)은 각 프로세스의 PCB(Process Control Block)에 중요도를 나타내는 정수값(우선순위)을 부여하고, Ready 큐에서 가장 높은 우선순위를 가진 프로세스에게 무조건 먼저 CPU를 할당하는 권력 지향적 알고리즘이다.
  2. 가치: 시스템 관리자가 의도한 대로 중요한 작업(OS 커널 태스크, 실시간 제어)을 일반 사용자 작업보다 무조건 먼저 처리하도록 보장하여, 시스템의 안정성과 목적성을 확립하는 모든 스케줄링의 기초 철학이다. (SJF도 실행 시간이 짧은 것을 우선순위로 삼는 일종의 우선순위 스케줄링이다.)
  3. 융합: 하지만 이 무자비한 계급 사회는 낮은 우선순위 프로세스가 영원히 CPU를 받지 못하는 치명적인 **기아 상태 (Starvation)**를 유발하며, 이를 구제하기 위해 시간이 지날수록 권력을 올려주는 노화 (Aging) 기법이 필수적인 한 세트로 묶여 다닌다.

Ⅰ. 개요 및 필요성 (Context & Necessity)

  • 개념: 스케줄러가 다음 프로세스를 고를 때, 도착 순서(FCFS)나 남은 시간(SRTF) 등 단일 조건에 얽매이지 않고 프로세스마다 명시적으로 부여된 '우선순위 번호(Priority Number)'만을 절대적인 기준으로 삼아 CPU를 분배하는 기법이다. (선점형, 비선점형 모두 적용 가능)
  • 필요성: 컴퓨터 안에서 실행되는 프로그램들의 가치는 절대 평등하지 않다. 메모리가 부족할 때 가동되는 OOM Killer 데몬, 하드웨어 인터럽트 핸들러, 마우스 커서 렌더링 같은 작업은 백그라운드 바이러스 백신 검사보다 수천 배 더 빨리, 절대적으로 먼저 처리되어야만 시스템이 붕괴하지 않는다.
  • 💡 비유: 비행기 탑승 수속을 할 때, 일반석 승객이 아무리 1시간 전부터 줄을 서 있어도 1등석 승객이나 VIP 회원이 도착하면 무조건 전용 라인으로 **'먼저 입장시키는 VIP 패스'**와 같다.
  • 등장 배경: 초기 순차적 처리 시스템을 넘어, 다중 프로그래밍(Multiprogramming) 환경에서 OS 스스로가 커널 시스템의 생존을 위해 사용자 프로세스보다 자신(커널 스레드)을 우대할 강력한 명분이 필요했다. 또한 국방, 의료, 우주 산업용 하드 리얼타임 OS (RTOS)에서 지정된 데드라인 내에 절대적으로 반응해야 하는 태스크를 강제할 구조적 장치로서 정립되었다.
  [우선순위 스케줄러의 동작 메커니즘 (작은 숫자가 우선순위가 높다고 가정)]

  (새로운 프로세스 도착)
   P5 [우선순위: 1 (VIP)] ──────────────────┐ (새치기 진입)
                                         ▼
   [Ready Queue]                         [ CPU 실행 ]
   | P2 (순위 2) | P1 (순위 3) | P4 (순위 4) | ───▶ [ P5 실행 ] (선점/배정)
   └─────────────────────────────────────┘
        (철저한 계급 기반의 우선순위 정렬 유지)

[다이어그램 해설] 큐에 먼저 왔든 늦게 왔든, 작업 시간이 1시간이든 1분이든 전혀 중요하지 않다. 오직 딱지가 붙어있는 '우선순위 숫자' 하나가 권력을 결정한다. 만약 선점형(Preemptive) 방식이라면, P2가 실행 중이더라도 우선순위 1위인 P5가 도착하는 즉시 목을 치고 CPU를 탈취해 버린다.

  • 📢 섹션 요약 비유: 도로 위에서 구급차나 소방차가 사이렌(우선순위 1순위)을 울리고 나타나면, 1시간째 막혀있던 일반 승용차들(낮은 우선순위)은 불만이 있어도 무조건 갓길로 비켜서 자리를 내주어야 하는 사회적 합의(OS 규칙)와 같습니다.

Ⅱ. 아키텍처 및 핵심 원리 (Deep Dive)

우선순위의 결정 요소 (내부적 / 외부적)

우선순위 번호는 OS가 임의로 부여할 수도 있고, 사용자가 직접 세팅할 수도 있다.

  1. 내부적 요인 (OS가 자체 판단):
    • 메모리 요구량, 열린 파일의 수
    • 평균 I/O 버스트 비율 vs 평균 CPU 버스트 비율: (현대 OS의 핵심) I/O 바운드 프로세스는 즉각 반응이 중요하므로 높은 우선순위를 주입하고, CPU 바운드는 하위 우선순위로 강등시킨다.
  2. 외부적 요인 (관리자/정책 판단):
    • 프로세스의 중요성 (예: 커널 스레드 vs 유저 앱)
    • 과금 정책 (서버 비용을 많이 낸 클라이언트의 작업 우선)
    • 사용자 명령어: 리눅스의 nicerenice 명령어로 유저가 직접 -20(최고)부터 +19(최하)까지 우선순위를 조작 가능.

선점형 (Preemptive) vs 비선점형 (Non-preemptive) 구조 차이

우선순위 스케줄링은 두 가지 풍미로 조리될 수 있다.

  • 비선점 우선순위: 현재 CPU를 잡고 있는 애가 우선순위 3인데, 방금 우선순위 1인 슈퍼 VIP가 큐에 들어왔다. 커널은 "아이고 VIP님 오셨습니까, 근데 지금 3번 손님이 식사 중이시라 다 드시고 나가면 바로 모시겠습니다"라고 대기열 1번 자리에만 꽂아두고 강제로 뺏지 않는다.
  • 선점형 우선순위: 동일한 상황에서 커널은 즉시 3번 손님의 밥상을 엎어버리고 쫓아낸 뒤(Context Switch), 1번 슈퍼 VIP를 즉각 자리에 앉혀버린다. (실시간 OS의 필수 요건)
  ┌───────────────────────────────────────────────────────────────────────┐
  │         선점형 우선순위 스케줄링 시뮬레이션 (작은 수가 높은 우선순위) │
  ├───────────────────────────────────────────────────────────────────────┤
  │                                                                       │
  │ 프로세스 정보: P1(우선:3, 10ms), P2(우선:1, 2ms), P3(우선:2, 2ms)     │
  │ 도착 시간: P1(0), P2(2), P3(3)                                        │
  │                                                                       │
  │  0         2   (P2 도착)   4  (P3 처리) 6  (P1 복귀)       14         │
  │  │██ P1 ███│██ P2(VIP) ██│██ P3(2등) ██│██ P1(나머지8ms)███│          │
  │  (선점당함)  (즉시 CPU탈취)  (P2종료후 배정)  (서러운 재배정)         │
  │                                                                       │
  │  ▶ 철저히 우선순위가 높은(1, 2) 놈들이 무조건 앞길을 뚫고 지나간다.   │
  └───────────────────────────────────────────────────────────────────────┘

[다이어그램 해설] P1은 제일 먼저 도착해 작업을 시작했지만, 2ms 시점에 절대권력 P2가 들어오면서 즉각 목이 날아갔다(선점). 4ms 시점에 P2가 끝나자, P1이 다시 들어오려 했지만 3ms 시점에 들어와 있던 P3(우선순위 2)에게 또 밀려났다. 이처럼 우선순위 스케줄링 환경에서는 하위 계급(P1)이 언제 끝날지 장담할 수 없는 가혹한 생태계가 펼쳐진다.

  • 📢 섹션 요약 비유: 회사에서 부장님이 사원에게 "A 기획서 내일까지 써와"라고 지시해서 쓰고 있는데, 1시간 뒤 사장님이 나타나 "저리 치우고 B 보고서 당장 1시간 내로 써!"라고 엎어버리는 수직적 보고 체계(선점형)와 같습니다.

Ⅲ. 융합 비교 및 다각도 분석 (Comparison & Synergy)

치명적 한계: 무한 대기 (Indefinite Blocking)와 기아 상태 (Starvation)

우선순위 스케줄링의 가장 완벽하고도 끔찍한 부작용이다. 시스템의 부하가 높아 끊임없이 새로운 프로세스들이 유입된다고 상상해 보자. 만약 우선순위가 높은 VIP 프로세스들이 1초마다 계속 Ready 큐에 들어온다면, 구석에 찌그러진 우선순위가 낮은 프로세스(예: 백그라운드 데이터 백업)는 어떻게 될까? 컴퓨터 전원을 뽑을 때까지 단 1ms의 CPU도 배정받지 못한 채 Ready 큐에서 말라 죽어간다. 이를 기아 상태(Starvation)라고 한다.

(유명한 일화: 1973년 MIT의 메인프레임 IBM 7094 시스템을 종료할 때, 1967년에 레디 큐에 들어왔으나 우선순위가 너무 낮아 무려 6년 동안 한 번도 실행되지 못하고 대기만 하고 있던 비운의 프로세스가 발견되었다.)

구세주 메커니즘: 에이징 (Aging, 노화)

기아 상태를 막기 위해 발명된 아주 인간적인 해법이 바로 **에이징(Aging)**이다. 프로세스가 레디 큐에서 늙어가는(대기하는) 시간에 비례하여, 스케줄러가 불쌍히 여겨 점진적으로 이 프로세스의 우선순위를 강제로 승급(높여줌) 시키는 기법이다.

  [기아 방지를 위한 에이징 (Aging) 적용 시뮬레이션]
  
  시간 흐름: 0s ────▶ 10s ────▶ 20s ────▶ 30s ────▶ (임계점 돌파)
  
  [슈퍼 VIP 프로세스 계속 유입 중 (우선순위 1 고정)]
  
  [불쌍한 일반 프로세스 P_Low 의 운명]
  초기 우선순위: 100 (절대 실행 못 됨)
  10초 경과 ─▶ 우선순위 90 으로 상승 (+10 가산점)
  20초 경과 ─▶ 우선순위 80 으로 상승 (+10 가산점)
  ...
  100초 경과 ─▶ 우선순위 0 도달! (천민에서 옥황상제로 신분 세탁)
              ─▶ 마침내 VIP들을 다 뚫어버리고 최우선으로 CPU 탈취 성공!

에이징이 적용되면, 제아무리 밑바닥 우선순위를 가진 프로세스라도 수학적으로 "언젠가는 반드시 최고 우선순위에 도달하여 한 번은 실행됨"이 100% 보장된다. 이는 운영체제가 시스템의 신뢰성을 유지하기 위한 최소한의 안전망이다.

  • 📢 섹션 요약 비유: VIP만 우대하는 불합리한 식당이라도, 일반 손님이 바깥에서 5시간 동안 덜덜 떨며 기다리고 있다면(에이징) 지배인이 미안해서라도 이번 한 번만큼은 장관이 오든 말든 이 일반 손님을 가장 좋은 룸(CPU)으로 모시는 융통성을 발휘하는 것입니다.

Ⅳ. 실무 적용 및 기술사적 판단 (Strategy & Decision)

실무 시나리오

  1. 리눅스 Nice / Renice 명령어 (사용자 공간 우선순위 개입): 리눅스 서버에서 배치 스크립트로 거대한 디렉터리 압축(tar) 작업을 돌렸는데, 이놈이 CPU를 다 잡아먹어 Nginx 웹 서버의 응답이 느려지는 장애가 터졌다.
    • 실무 조치: 시스템 관리자는 프로세스를 죽이지 않고, renice -n 19 -p [압축프로세스PID] 명령을 쳐서 이 녀석의 우선순위를 최하(19)로 바닥까지 떨어뜨린다. 반대로 Nginx 웹 데몬에게는 nice -n -10 같은 마이너스(음수일수록 우선순위 높음) 값을 주어 웹 응답을 즉각 최우선으로 복구시킨다. 이것이 우선순위 스케줄링이 주는 직관적인 시스템 제어력이다.
  2. 우선순위 역전 (Priority Inversion)과 데드락의 공포: 실시간 운영체제(예: 화성 탐사선 패스파인더)에서 자주 터지는 재앙이다. 최하위 프로세스(L)가 공유 자원의 락(Lock)을 쥐고 있는데 중간 우선순위 놈들이 계속 CPU를 선점해 버려서 L이 락을 못 푸는 상황이다. 이때 최우선순위(H)가 그 자원을 쓰려고 접근하면 L이 락을 풀 때까지 멈춰버리게 되어, 결과적으로 최고 존엄(H)이 평민들 때문에 동작을 멈추는 우선순위 역전 현상이 발생한다.
    • 아키텍처 결단: 이를 방지하기 위해 L이 락을 쥔 상태라면, 커널이 임시로 L의 우선순위를 H급으로 뻥튀기시켜(Priority Inheritance Protocol, 우선순위 상속) L이 무조건 제일 빨리 락을 풀고 나가도록 시스템을 조작해야 한다.
  ┌─────────────────────────────────────────────────────────────────────┐
  │       다단계 큐(Multilevel Queue)로의 융합 진화 아키텍처            │
  ├─────────────────────────────────────────────────────────────────────┤
  │                                                                     │
  │   현대 OS는 단순히 1~100 숫자 하나로 순위를 매기지 않는다.          │
  │   아예 '계급장' 별로 물리적인 큐(Queue)를 쪼개버렸다.               │
  │                                                                     │
  │   [Queue 0: System/Real-time] (최상위 우선순위)                     │
  │      └─▶ RR 알고리즘 (동급끼리는 빙빙 돌며)                         │
  │           ▼ (Q0이 완벽히 비어있을 때만 아래로 CPU가 떨어짐)         │
  │                                                                     │
  │   [Queue 1: Interactive/UI] (중간 우선순위)                         │
  │      └─▶ 짧은 타임 퀀텀 RR 적용 (빠른 응답성 유지)                  │
  │           ▼ (Q1도 비어있어야 제일 바닥으로 떨어짐)                  │
  │                                                                     │
  │   [Queue 2: Batch Process] (최하 우선순위)                          │
  │      └─▶ FCFS 또는 긴 타임 퀀텀 (그냥 던져놓고 방치)                │
  │                                                                     │
  │   🚨 문제: Q0과 Q1에 계속 작업이 들어오면 Q2는 평생 굶음 (기아)     │
  │   ✅ 해결: 특정 주기가 지나면 Q2의 작업을 Q1, Q0으로 끌어올림 (MLFQ)│
  └─────────────────────────────────────────────────────────────────────┘

[다이어그램 해설] 단일 큐에 우선순위 숫자만 박아 넣고 매번 "누가 젤 숫자가 작지?" 하고 검색(O(N) 오버헤드)하는 것은 미련한 짓이다. 현대 OS는 아예 우선순위별로 전용 대기줄(다단계 큐)을 만들어 놓고, 위쪽 줄에 사람이 한 명이라도 있으면 아랫줄은 절대 쳐다보지도 않는다. 그리고 에이징(Aging) 효과를 위해 아랫줄에서 10분 기다린 사람은 위쪽 줄로 통째로 옮겨주는 '피드백(Feedback)'을 추가한 것이 스케줄링의 끝판왕 MLFQ다.

  • 📢 섹션 요약 비유: 병원 응급실입니다. "생명 위독 환자 큐", "골절 환자 큐", "감기 환자 큐"를 아예 따로 만들어놓고, 생명 위독 큐에 환자가 한 명이라도 있으면 감기 환자는 절대 의사를 못 봅니다. 하지만 감기 환자가 열이 펄펄 끓어서 12시간을 대기하면(에이징), 간호사가 이 환자를 멱살 잡고 골절 환자 큐로 한 단계 승급시켜 주는 자비로운 룰이 숨어있습니다.

Ⅴ. 기대효과 및 결론 (Future & Standard)

기대효과

우선순위 스케줄링의 도입으로 시스템 관리자는 기계의 작동 원리 깊숙한 곳까지 개입하여 자원 통제권을 장악할 수 있게 되었으며, 이를 통해 중요한 시스템 데몬이 좀비 사용자 프로세스에 의해 렉에 걸려 뻗어버리는 사태를 구조적으로 방어할 수 있게 되었다.

결론 및 미래 전망

우선순위 스케줄링은 알고리즘의 한 종류라기보다 운영체제를 설계하는 근본적인 철학 그 자체다. (가장 짧은 작업 우선인 SJF도 시간이라는 우선순위를 매긴 것이므로 이 범주에 속한다). 현대의 리눅스 CFS, 윈도우 커널 스케줄러, 실시간 운영체제(RTOS)의 O(1) 스케줄러 등 모든 시스템은 각자의 방식으로 0부터 139까지의 우선순위 레벨을 세밀하게 나누고, 동적 에이징(Dynamic Aging)과 우선순위 상속(Priority Inheritance) 같은 보완 기법을 떡칠하여 기아(Starvation)와 역전(Inversion)이라는 악마를 틀어막으며 완벽한 계급사회를 유지하고 있다.

  • 📢 섹션 요약 비유: 순수하게 능력만 보는 우선순위 사회(자본주의)는 필연적으로 빈익빈 부익부(기아 상태)를 만듭니다. 이 사회가 무너지지 않고 유지되게 하는 힘은, 가장 낮은 곳에 있는 사람도 시간이 지나면 살 수 있게 끌어올려 주는 복지 정책(에이징, Aging) 덕분입니다.

📌 관련 개념 맵 (Knowledge Graph)

개념 명칭관계 및 시너지 설명
기아 상태 (Starvation)우선순위 스케줄링의 근본적 결함으로, 낮은 권력의 프로세스가 무한한 큐에 갇혀 한 틱도 실행되지 못하는 비극이다.
노화 (Aging)기아 상태를 부수기 위한 처방전으로, 큐에 머문 대기 시간이 길어질수록 강제로 우선순위를 1단계씩 승급시켜 주는 자비로운 매커니즘이다.
다단계 피드백 큐 (MLFQ)우선순위 개념을 발전시켜, 아예 큐 자체를 여러 계층으로 나누고 프로세스들이 큐 사이를 오르락내리락하게 만든 현대 스케줄러의 정점이다.
우선순위 역전 (Priority Inversion)공유 자원의 락(Lock) 때문에, 최상위 VIP 프로세스가 최하위 천민 프로세스의 작업 완료를 목 빠지게 기다려야만 하는 동기화 버그다.
SJF (Shortest Job First)스케줄러가 '우선순위(Priority)'를 평가하는 기준치를 사람의 지정이 아니라, 오직 "버스트 시간이 짧은 것"으로 세팅해 둔 우선순위 스케줄링의 특수 케이스다.

👶 어린이를 위한 3줄 비유 설명

  1. 학교 매점 줄을 설 때 원래는 도착한 순서대로지만, 선생님이 오시거나 몸이 아픈 친구가 나타나면 줄에 상관없이 "프리패스!"로 맨 앞줄로 꽂아주는 게 우선순위 스케줄링이에요.
  2. 중요한 친구를 먼저 챙겨주는 건 좋지만, 내가 제일 안 중요한 사람(우선순위 꼴찌)이라면 선생님과 아픈 친구들이 끝없이 올 때 빵을 영원히 못 사고 굶어 죽는 슬픈 일(기아 상태)이 생겨요.
  3. 그래서 매점 아저씨가 "너 여기서 1시간 넘게 덜덜 떨고 기다렸구나! 너무 불쌍하니까 이번 한 번만 선생님보다 먼저 빵 줄게!" 하고 내 계급을 높여주는 마법(에이징)을 써서 나를 살려준답니다!