21.1.2.2. 협력적(Cooperative) Work Queue 기반 런루프(Run-loop)의 이점
독립 태스크 방식이 야기했던 ’메모리 파편화’와 ’무자비한 문맥 교환 오버헤드’라는 양대 산맥을 정복하기 위해, PX4 아키텍트들은 리눅스의 커널 스레딩 모델에서 영감을 받아 ‘협력적(Cooperative) Work Queue’ 아키텍처를 전격 도입했다. 이것은 파편화된 다수의 독립 프로세스들을 거대한 컨베이어 벨트 위에 일렬로 세우는 혁명적인 레일건(Railgun)과도 같다.
1. Work Queue의 본질: 다대일(N:1) 스레딩 모델
Work Queue 모델의 핵심은 “CPU 코어 수에 맞추어, 혹은 주요한 실행 주기(Rate) 단위로 소수의 거대한 ’메인 스레드(Worker Thread)’만 띄워놓고, 그 위에 수십 개의 ’함수 쪼가리(Work Items)’들을 얹어서 돌리자“는 것이다.
- 과거 50개의 센서 스택(Stack)이 50개의 독립 스레드였다면, 현재는 50개의 센서가
WorkItem이라는 가벼운 C++ 객체로 포장되어 **단 하나의 고우선순위 스레드(wq_hp_default등)의 실행 대기열(Queue)**에 순차적으로 매달린다. - 이 거대한 메인 워커 스레드는
Run-loop라는 무한 루프를 돌면서, 자신에게 할당된 큐(Queue)를 쳐다보고 있다. 큐에 누군가 일을 던져주면(Schedule), 1번 객체의Run()함수를 호출하여 실행을 끝내고, 그다음 2번 객체의Run()함수를 연달아 호출하는 방식으로 일을 처리한다.
2. 선점형(Preemptive)에서 협력적(Cooperative)으로의 철학적 도약
가장 중요한 차이는 스레드의 실행을 중단시키는 주체이다. OS 커널이 시간 할당량(Time slice)을 근거로 폭력적으로 모가지를 치는 선점형 방식을 버리고, 모듈 스스로가 연산을 끝내고 스레드 제어권을 다음 순서의 모듈에게 우아하게 반납(Yield/Return)하는 협력적 방식을 채택했다.
이러한 협력형 런루프 모델이 PX4의 비행 제어 성능에 가져온 극적인 이점은 다음과 같다.
- 메모리 스택 오버헤드 박멸: 수십 개의 모듈이 수십 개의 스택을 낭비하지 않고, 메인 워커 스레드 하나가 가진 거대한 4KB 스택 하나만을 돌려 쓴다(Sharing) (상세 내용은 21.1.2.2.1 단원 참조). 결과적으로 픽스호크의 가용 가능한 여유 RAM 메모리가 극적으로 증가했다.
- 제로-컨텍스트 스위칭(Zero-Context Switching): 1번 모듈에서 2번 모듈로 넘어갈 때, OS 레벨의 레지스터 백업이나 스택 포인터 교체가 일어나지 않는다. 그저 같은 스레드 공간 안에서 평범한 C++ 함수 포인터 호출이 연속적으로 일어날 뿐이다.
- 캐시 히트율(Cache Hit Rate)의 극대화: 스레드가 바뀌지 않으므로 L1/L2 캐시 메모리가 불필요하게 날아가지 않는다(Flush). 연속된 제어 로직 간에 명령 캐시(I-Cache)가 그대로 유지되어 엄청난 실행 속도 향상을 가져온다.
- 락-프리(Lock-free) 설계의 용이성: 같은 워크 큐 내에서 순차적으로 도는 함수들은 절대로 서로를 다치게 하거나(Preempt) 동시에 중간에 끼어들지 않는다. 따라서 복잡한 뮤텍스(Mutex) 락을 겹겹이 칠 필요 없이 훨씬 안전하고 빠르게 전역(Global) 데이터나 하드웨어 버스를 다룰 수 있게 되었다.
3. 무한한 자유에 따르는 무자비한 책임
이토록 완벽해 보이는 협력적 Work Queue 시스템에도 치명적인 맹점이 존재한다. 이 모든 아키텍처는 **“큐에 올라탄 모든 함수(WorkItem)들이 약속된 짧은 시간 안에 즉시 반환(Return)을 해준다는 성선설(性善說)”**에 완벽하게 기대고 있다.
만약 여러분이 짠 커스텀 모듈이 wq_hp_default 같은 워크 큐에 올라타서, 0.1초 동안 파일을 쓴다며 CPU 제어권을 반납하지 않는다면 어떻게 될까? 그 뒤에 큐에서 줄 서서 기다리던 자세 제어기, 모터 출력기 등 수십 개의 생명 유지 장치들이 모두 멈춰서 드론은 바닥에 처박힌다. (이 끔찍한 큐 지연 현상에 대해서는 21.1.2.2.2 단원에서 상세하게 다룬다.)
정리하자면, Work Queue는 PX4를 현대적인 초고속 비행 로봇으로 탈바꿈시킨 1등 공신이다. 사용자 커스텀 모듈 개발자 역시 필연적으로 이 고속 열차에 올라타야 하며, 탑승객의 기본 소양인 철저한 ’블로킹 혐오증(Non-blocking mindset)’을 장착해야만 한다.