# 1. 실시간 스케줄링(Real-Time Scheduling) 알고리즘
NuttX 커널의 가장 핵심적인 임무 중 하나는, 현재 실행 대기 중인 수십 개의 스레드 중에서 ’지금 당장 누구에게 CPU의 제어권을 넘길 것인가’를 결정하는 것이다. PX4는 일반적인 윈도우(Windows)나 리눅스(Linux) 데스크톱 환경이 사용하는 ‘공평성(Fairness)’ 위주의 스케줄링을 철저히 배격하고, 오직 ‘가장 중요한 놈이 먼저, 끝날 때까지 쓴다’ 는 무자비한 철학을 고수한다.
우선순위 기반 선점형 스케줄링(Priority-based Preemptive Scheduling)
NuttX는 0부터 255까지의 우선순위 레벨을 정의하며, 숫자가 높을수록 절대적인 권력을 가진다. (일반적으로 Idle 스레드가 0, 센서나 자세 제어가 최상위 계층을 차지한다.)
- 선점(Preemption): 우선순위 100짜리 스레드(예: 로깅)가 한창 CPU를 점유하여 SD 카드에 데이터를 쓰고 있다고 가정하자. 이때 타이머 인터럽트가 발생하여 앞서 잠들어 있던 우선순위 250짜리 스레드(예:
mc_att_control자세 제어)가 깨어났다. NuttX는 자비 없이 현재 실행 중인 우선순위 100짜리 로거 스레드를 RAM 공간으로 걷어차버리고(Context Switch), 즉각 250짜리 스레드에게 제어권을 넘겨버린다. - 라운드 로빈(Round-Robin) 파티션: 만약 우선순위가 100으로 완전하게 동일한 두 개의 스레드가 존재한다면? 이 경우에 한해서만 커널은 동일 권력자들 사이에서 일정 시간(Time Slice) 단위로 CPU를 공평하게 나눠 쓰도록 강제 스와핑(Swapping)을 돌린다. 이를
SCHED_RR정책이라고 부른다.
PX4의 우선순위 디자인 패턴(Priority Architecture)
PX4 소스코드 트리 어디를 뒤져봐도 수동으로 우선순위 숫자(230 등)를 박아 넣은 곳은 거의 없다. PX4OSAL 추상화 계층은 SCHED_PRIORITY_MAX, SCHED_PRIORITY_DEFAULT, SCHED_PRIORITY_SLOW_DRIVER 와 같이 사전에 정의된 하이러키(Hierarchy) 매크로를 제공한다.
가장 극악의 최상위 티어(Tier)는 I2C/SPI 버스에서 센서값을 미친 듯이 퍼 올리는 디바이스 드라이버 스레드 이며, 그다음이 그 센서값을 받아 즉각 모터 출력을 뱉어내야 하는 EKF 및 비행 제어기(mc_att_control) 다. 반대로 SD 카드 쓰기나 콘솔 UI, GCS 스트리밍(MAVLink) 모듈들은 우선순위가 바닥을 친다.
이렇게 무자비하게 설정된 계급 사회 덕분에 기체는 MAVLink 통신이 잠시 끊기거나 SD 카드가 고장 날지언정 절대 지상으로 추락하지는 않는 것이다.