고정 우선순위 스케줄링 (Fixed-Priority Scheduling)

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

  1. 본질: 고정 우선순위 스케줄링은 프로세스가 생성될 때 관리자나 설계자에 의해 한 번 부여된 우선순위(Priority)가 시스템이 종료될 때까지 영구적으로 변하지 않는 가장 정적이고 단순한 스케줄링 모델이다.
  2. 가치: 스케줄러가 매 틱(Tick)마다 점수를 재계산할 필요가 없어 커널 오버헤드가 제로(0)에 가깝고, 시스템의 동작(응답)을 100% 결정론적(Deterministic)으로 설계할 수 있어 하드 리얼타임 OS의 핵심 근간으로 사용된다.
  3. 융합: 하지만 하위 프로세스가 영원히 굶어 죽는 기아 상태(Starvation)를 내재하고 있으므로, 범용 운영체제에서는 이를 극복하기 위해 시간의 흐름에 따라 점수가 변하는 '동적 우선순위(Dynamic Priority)'와 융합되어 사용된다.

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

  • 개념: 스케줄러가 다음 실행할 프로세스를 선택할 때, 각 프로세스에 붙어있는 우선순위 딱지 하나만 보고 무조건 숫자가 높은 녀석(보통 숫자가 작을수록 높음)에게 CPU를 몰아주는 방식 중, 그 딱지의 값이 절대로 변하지 않는(Fixed) 형태를 말한다.
  • 필요성: 우주선이나 공장 로봇 제어 시스템에는 수십 개의 태스크가 돌아간다. 만약 스케줄러가 융통성을 발휘한답시고 임의로 순위를 바꿨다가 엔진 제어 태스크가 1ms라도 밀리면 시스템은 폭발한다. 시스템 설계자는 "내가 1등이라고 못 박은 놈은, 죽었다 깨어나도 1등이어야 한다"는 융통성 제로의 절대적인 통제력이 필요했다.
  • 💡 비유: 군대의 **'계급 제도(계급장)'**와 같다. 이등병이 아무리 1년 동안 화장실 청소만 하며 고생했어도, 오늘 갓 전입해 온 소위(높은 계급)가 나타나면 무조건 경례를 하고 길을 비켜주어야 하며 이 계급은 스스로 절대 바뀌지 않는다.
  • 등장 배경: 과거부터 산업용 임베디드 장비는 컴퓨팅 파워가 극도로 빈약했다. CPU 사이클을 1Hz라도 아끼기 위해 "스케줄링 알고리즘 자체가 무거우면 안 된다"는 철학 하에, 단순한 배열 큐에 우선순위별로 꽂아두고 위에서부터 무조건 빼서 쓰는 O(1) 수준의 멍청하지만 확실한 스케줄러가 탑재되었다.
  [고정 우선순위(Fixed) vs 동적 우선순위(Dynamic) 스케줄러의 철학 차이]

  [ 고정 우선순위 (Fixed-Priority) ]
  - 시스템 설계자: "태스크 A는 무조건 1순위, B는 무조건 2순위다. 끝."
  - 런타임 결과: A가 1년 내내 CPU를 써도, B는 그냥 1년 내내 굶어 죽음. (예측 가능함)
  - 사용처: 무기 체계, 공장 제어 (Rate Monotonic 등)

  [ 동적 우선순위 (Dynamic Priority) ]
  - 시스템 설계자: "A는 1순위, B는 2순위지만... B가 너무 불쌍하면 좀 올려줘라."
  - 런타임 결과: B가 너무 오래 굶자, 커널이 불쌍해서 B를 1.5순위로 임시 승급시킴 (Aging).
  - 사용처: 데스크톱 Windows, Linux (응답성 및 공정성 확보)

[다이어그램 해설] 고정 우선순위의 가장 큰 특징은 "비정함"이다. 스케줄러는 피도 눈물도 없이 오직 초기 설정값만 믿고 밀어붙인다. 이 비정함이 일반 PC 유저에겐 마우스가 얼어붙는 끔찍한 경험을 주지만, 무기 체계에서는 "핵심 부품이 절대 멈추지 않는다"는 완벽한 신뢰의 보증수표가 된다.

  • 📢 섹션 요약 비유: 왕족은 태어날 때부터 평생 왕족이고 노비는 평생 노비인 철저한 신분제 사회입니다. 노비 입장에선 숨이 막히지만, 국가(시스템) 전체가 흔들림 없이 설계된 기계처럼 굴러가게 만드는 가장 강력하고 값싼 통치 수단입니다.

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

고정 우선순위의 구현 (비트맵 O(1) 탐색)

우선순위가 고정되어 있다는 것은, 큐를 배열(Array)로 미리 만들어 놓을 수 있다는 뜻이다.

  1. 우선순위 개수(예: 1~256)만큼 Ready 큐 배열을 하드코딩으로 생성한다.
  2. 각 큐에 프로세스를 링크드 리스트로 매달아 놓는다.
  3. 256비트(32바이트)짜리 비트맵(Bitmap) 변수를 두고, 큐에 프로세스가 하나라도 있으면 해당 비트를 1로 켠다.
  4. 스케줄링: 하드웨어 명령어(clz 등)로 256비트 중 가장 앞쪽에 1이 켜진 위치를 1클럭 만에 찾는다. 그 큐에서 무조건 첫 번째 놈을 빼서 CPU를 준다.
  ┌─────────────────────────────────────────────────────────────────────────┐
  │         고정 우선순위 스케줄러의 O(1) 비트맵 매핑 아키텍처              │
  ├─────────────────────────────────────────────────────────────────────────┤
  │                                                                         │
  │  [ 256 비트맵 (0은 빈 큐, 1은 대기 중인 큐) ]                           │
  │  비트 위치: 0 1 2 3 4 5 6 ... 255                                       │
  │  값(상태):  0 0 1 0 1 0 0 ... 1                                         │
  │              │   │         │                                            │
  │              ▼   ▼         ▼                                            │
  │  [ 배열 큐 ]                                                            │
  │  Queue[2] ──▶ [ P_A ] ──▶ [ P_B ]                                       │
  │  Queue[4] ──▶ [ P_C ]                                                   │
  │  Queue[255] ─▶ [ P_Z ] (가장 낮은 찌끄러기)                             │
  │                                                                         │
  │  🚨 스케줄러의 기계적 반복 로직:                                        │
  │  매 틱마다 비트맵 스캔 ─▶ "2번 비트가 제일 높네!" ─▶ Queue[2]의 P_A 실행│
  │  (P_A나 P_B가 큐에 존재하는 한 P_C는 절대 영원히 실행 불가)             │
  └─────────────────────────────────────────────────────────────────────────┘

[다이어그램 해설] 고정 우선순위 시스템에서 스케줄러의 역할은 계산이 아니라 그냥 '지정된 서랍 열기'에 불과하다. CPU 사이클을 낭비하는 복잡한 수식이나 트리 정렬(O(log N))이 전혀 없기 때문에, 이 스케줄러는 인터럽트가 발생한 직후 1마이크로초도 안 되는 찰나에 다음 타깃을 찾아내는 궁극의 디스패치 속도를 자랑한다.

  • 📢 섹션 요약 비유: 우편물을 256개의 서랍에 꽂아놓고, 무조건 1번 서랍부터 열어봐서 편지가 있으면 꺼내고, 없으면 2번 서랍을 여는 극도로 단순한 로봇 팔과 같습니다.

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

고정 우선순위 기반의 세부 알고리즘 분류 (RM vs DM)

우선순위가 변하지 않는다는 뼈대 위에, "그럼 처음에 무슨 기준으로 순위를 매길 것인가?"에 따라 두 알고리즘이 나뉜다.

알고리즘순위 결정 기준 (Metric)설명 및 특징
RM (Rate Monotonic)주기 (Period)"얼마나 자주 오는가?" 주기가 가장 짧은 놈에게 1등 번호표를 줌. (주기와 데드라인이 같을 때 가장 완벽한 수학적 최적 모델)
DM (Deadline Monotonic)마감 시간 (Deadline)주기가 길어도 "상대적 데드라인이 짧은 놈"에게 1등 번호표를 줌. (주기보다 데드라인이 더 짧은 특수 환경에서 RM보다 우수함)
EDF (비교군, 동적)매 순간 남은 시간 (Absolute)런타임에 순위가 휙휙 바뀌므로 '고정 우선순위' 가문에 끼지 못함.

치명적 한계: 기아 상태(Starvation)의 방치

고정 우선순위는 시스템 전체에 **"너희는 굶어 죽어라"**라고 공식적으로 선고하는 것과 같다. 일반 범용 OS(Windows)에서는 이 기아 상태를 막기 위해 에이징(Aging)을 써서 우선순위를 올려준다(동적 변화). 하지만 하드 실시간 OS에서는 에이징을 절대 허용하지 않는다. 10등짜리 쩌리 태스크가 오래 굶었다고 1등석으로 쳐들어오면, 원래 1등석에 앉아서 미사일 궤도를 맞춰야 할 VIP 태스크가 쩌리 때문에 밀려나서 미사일이 오폭되는 초대형 사고가 터지기 때문이다. 즉, RTOS 환경에서 기아 상태는 "버그"가 아니라 "시스템의 안전을 위해 하위 태스크를 합법적으로 꼬리 자르기 하는 방어 기제"로 쓰인다.

  • 📢 섹션 요약 비유: 타이타닉 호가 침몰할 때, "1등석 승객부터 무조건 보트에 태운다"는 것이 고정 우선순위입니다. 3등석 승객이 오래 기다렸다고 보트에 먼저 태우면(에이징) 질서가 붕괴됩니다. 3등석 승객의 희생(기아 상태)을 담보로 시스템의 규칙을 지키는 비정한 아키텍처입니다.

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

실무 시나리오

  1. 리눅스 SCHED_FIFO 정책 튜닝 (실무 고정 우선순위): 리눅스 서버에서 네트워크 패킷 유실을 막기 위해 튜닝할 때, 범용 SCHED_OTHER가 아닌 SCHED_FIFO에 우선순위 99(최고치)를 줘서 프로세스를 띄운다.
    • 실무의 공포: SCHED_FIFO는 타임 슬라이스(퀀텀)의 개념조차 없는 가장 무식한 고정 우선순위다. 이 프로세스 안에 while(true) {} 버그가 하나라도 섞여 있다면? 이 녀석의 우선순위는 영원히 99로 '고정'되어 있으므로 다른 어떤 프로세스(심지어 ssh 접속 쉘이나 리부팅 데몬마저도)도 실행되지 못해 서버가 완전히 벽돌(Hang)이 된다.
    • 아키텍트 조치: 개발자가 SCHED_FIFO를 쓴다고 하면 무조건 코드 리뷰 시 sleep() 이나 I/O 대기(블로킹) 구간이 확실히 존재하는지 악착같이 검증해야만 서버 폭파를 막을 수 있다.
  2. 우선순위 할당 규칙 (RMA, Rate Monotonic Analysis): 임베디드 장비(드론)를 짤 때, 5개의 센서 읽기 스레드를 띄웠다. 개발자 맘대로 우선순위 1~5를 대충 부여하면 10분쯤 비행하다가 타이밍이 꼬여 추락한다.
    • 실무 조치: 반드시 엑셀을 켜고 각 스레드의 호출 주기(Period)를 적은 뒤, **"주기가 짧은 순서대로 1등부터 5등까지 우선순위를 고정(하드코딩)"**해야 한다. 이것이 RMA 기법이며, 이 순서를 지켰을 때 전체 CPU 점유율이 69% 이하라면 이 드론은 수학적으로 평생 추락하지 않음이 보장된다.
  ┌───────────────────────────────────────────────────────────────────┐
  │     개발자의 고정 우선순위 (SCHED_FIFO/RR) 남용 방지 검증 트리    │
  ├───────────────────────────────────────────────────────────────────┤
  │                                                                   │
  │   [코드 리뷰: 신규 백그라운드 스레드에 Priority 90 셋팅 발견]     │
  │                │                                                  │
  │                ▼ 스레드의 본질적 성격 검증                        │
  │   이 스레드가 CPU를 100% 갉아먹는 연산(CPU Bound)인가?            │
  │          ├─ [예 (이미지 렌더링, 암호화 등)]                       │
  │          │      │                                                 │
  │          │      ▼ 🚨 시스템 사형 선고                             │
  │          │  고정 90순위가 안 비키면 시스템 전체가 마비됨.         │
  │          │  ▶ 조치: 일반 CFS 큐(Nice 조절)로 즉각 강등 지시.      │
  │          │                                                        │
  │          └─ [아니오 (I/O Bound, 센서 폴링 등)]                    │
  │                 │                                                 │
  │                 ▼ ✅ 허가 및 조건부 배포                          │
  │             1ms만 일하고 바로 Sleep() 하는 구조가 명확하므로,     │
  │             고정 우선순위를 줘서 빠른 응답성을 챙기는 게 이득임.  │
  └───────────────────────────────────────────────────────────────────┘

[다이어그램 해설] 고정 우선순위는 양날의 검이다. 찌르면 적(렉)이 1초 만에 죽지만, 잘못 쓰면 내가 죽는다. 이 절대 권력을 부여할 때는 반드시 해당 코드가 "자발적으로 권력을 내려놓는가(Yield, Sleep, I/O)"에 대한 물리적 확신이 있어야만 한다.

  • 📢 섹션 요약 비유: 운전 초보(버그가 많은 코드)에게 속도 제한 장치가 풀린 포르쉐(고정 우선순위 권한)를 주면 100% 벽에 박습니다. 포르쉐는 앞만 보고 달리게 만들어진 기계(O(1) 속도)이므로, 오직 브레이크를 언제 밟을지 아는 베테랑 드라이버(검증된 실시간 코드)에게만 키를 줘야 합니다.

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

기대효과

고정 우선순위 스케줄링을 채택하면 운영체제의 디스패치 로직을 어셈블리어 몇 줄로 끝낼 수 있을 만큼 극도로 경량화할 수 있으며, 시스템 동작의 **'100% 수학적 예측(Deterministic Analysis)'**이 가능해져 항공, 우주, 의료 기기의 필수 안전 인증(ISO 26262 등)을 통과할 수 있는 논리적 기반을 마련한다.

결론 및 미래 전망

순수한 의미의 "고정 우선순위" 알고리즘은 일반 데스크톱(Windows/Mac)이나 모바일 환경에서는 동적 에이징(Aging)과 융합된 형태(MLFQ, CFS)로 흡수되어 흔적만 남아있다. 그러나 사람의 목숨이 달린 임베디드 하드 리얼타임 OS (FreeRTOS, VxWorks) 생태계에서는 여전히, 그리고 앞으로도 영원히 이 '고정 우선순위(RM/DM)'가 유일무이한 표준으로 군림할 것이다. 복잡한 계산(EDF)을 런타임에 하는 것은 리스크가 너무 크기 때문에, 컴파일러와 분석 도구가 배포 전에 미리 오프라인에서 수학적 증명을 끝내고, 기계는 멍청하지만 확실하게 고정된 순서대로만 움직이는 보수적 아키텍처가 실시간 시스템의 절대 진리이기 때문이다.

  • 📢 섹션 요약 비유: 똑똑한 로봇(동적 스케줄링)은 상황에 맞춰 유연하게 대처하지만 가끔 예상치 못한 오류를 냅니다. 하지만 톱니바퀴로 짜인 아날로그시계(고정 우선순위)는 멍청해 보여도 100년 동안 단 1초도 틀리지 않고 똑같은 속도로 돕니다. 목숨을 걸어야 할 땐 화려한 인공지능보다 투박한 톱니바퀴가 정답입니다.

📌 관련 개념 맵 (Knowledge Graph)

개념 명칭관계 및 시너지 설명
RM (Rate Monotonic)고정 우선순위 스케줄링 가문에서 가장 성공한 천재 알고리즘으로, 주기가 짧은 순서대로 번호표를 쾅 박아준다.
기아 상태 (Starvation)우선순위가 변하지 않기 때문에 발생하는 하위 프로세스의 필연적 희생양(버그가 아닌 특징)이다.
우선순위 역전 (Priority Inversion)고정된 순위 때문에 오히려 VIP가 하위 계급에게 발목을 잡히는 최악의 모순적 데드락이다.
동적 우선순위 (Dynamic Priority)고정 우선순위의 피도 눈물도 없는 기아 상태를 막기 위해 에이징이나 vruntime을 섞어 런타임에 점수를 조작하는 라이벌 철학이다.
O(1) 스케줄링 (비트맵)고정 우선순위 배열 구조 덕분에 탐색 속도를 나노초 단위의 O(1)으로 끊어낼 수 있게 된 물리적 최적화 기법이다.

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

  1. 게임방에서 "1번 컴퓨터는 무조건 회장님(VIP) 전용이야!"라고 딱 못을 박아놓고 절대 안 바꿔주는 규칙이 고정 우선순위예요.
  2. 회장님이 1년 내내 컴퓨터를 쓰면, 다른 친구들은 1년 내내 옆에서 구경만 하다 굶어 죽는 슬픈 일(기아 상태)이 무조건 생겨요.
  3. 하지만 이렇게 무식하고 꽉 막힌 규칙을 쓰는 이유는, 우주선이나 로봇을 조종할 때 "진짜 중요한 명령은 다른 자잘한 일에 절대 방해받지 않고 0.001초 만에 실행된다"는 100% 믿음을 주니까요!