19.5.2. 다중 Topic 동시 구독 처리 로직

19.5.2. 다중 Topic 동시 구독 처리 로직

지금까지의 훈련 단계를 거치며 우리는 오직 sensor_test_data라는 단 1개의 커스텀 센서 토픽 통로만을 일편단심으로 바라보는, 눈이 하나뿐인 아주 단순한 외눈박이 수신 데몬 스레드를 설계해 왔다. 하지만 픽스호크 펌웨어의 진짜 무자비한 코어인 ’비행 자세 제어기(Attitude Controller)’나 극한의 행렬 연산을 돌리는 ‘EKF 항법 추정기(Estimator)’ 모듈의 끔찍한 코드 스코프를 상상해 보라.

이 거대한 코어 스케줄러 괴물 모듈들은 자이로(Gyro), 가속도(Accel), 지자기(Mag), 기압계(Baro), GPS, RC 조종기 입력 등 최소 5~10개의 전혀 다른 타임라인과 헤르츠(Hz) 주파수를 가진 VFS 파이프라인에서 미친 듯이 쏟아지는 파편화된 데이터들을, 오직 단 한 점의 시공간에서 동시에(Simultaneously) 융합하여 씹어 먹어야만 온전한 기체의 3D 자세 매트릭스를 뽑아내고 모터에 1000Hz PWM 신호를 쏠 수 있다.

그렇다면 초보자의 직관대로, 5개의 서로 다른 센서 버퍼를 수신해야 할 때 각 센서 채널마다 1개씩 총 5개의 무작위 무한 루프 워커 스레드(while 루프 5개)를 메모리 힙에 동시에 병렬 배포하여 띄워야 할까? 절대 아니다. 그것은 한정된 1MB 임베디드 코어 CPU 캐시와 스케줄러 컨텍스트 스위칭(Context Switching) 자원을 단 몇 분 만에 산산조각 파괴해 버리는 최악의 쓰레기 안티 패턴(Anti-pattern)이다.

위대한 유닉스 철학을 이어받은 px4_poll() 메커니즘의 진짜 압도적인 파괴력은 바로 이 지점에서 폭발하듯 발휘된다. 단 1개의 초경량 메인 스레드 데몬만 링커에 띄워둔 채, 수십 개의 서로 다른 파편화된 I/O 파이프라인(FD)들을 단 ‘하나의 거대한 커널 감시망(Poll Set)’ 배열로 강제 결속하여 묶어버릴 수 있다. 이 극강의 커널 다중 감시망 아키텍처는 다음과 같은 엣지 트리거(Edge-trigger) 절차로 전개된다.

  • 1단계. 전방위 그물망 개통: 내가 데몬에서 훔쳐보고 감시하고 싶은 타겟 N개의 모든 토픽들에 대해 연속적으로 orb_subscribe()를 타격하여, N개의 개별 VFS 마스터 키(fd)를 일거에 확보해 낸다.
  • 2단계. px4_pollfd_struct_t 명세서 배열(Array)의 거대화: 앞서 크기 1로 쩨쩨하게 잡았던 폴링 인스턴스 배열의 크기를 N으로 확장 선언하고, 각 0부터 N-1번째 슬롯 방마다 앞서 확보한 N개의 파이프라인 키를 모두 배정하여 감시 이벤트(POLLIN) 덫을 전방위로 세팅한다.
  • 3단계. 통합 인터럽트 기상 및 식별 역추적 분기 (Switch-Case): N개의 덫이 세팅된 이 거대한 명세서 배열 덩어리를 단 1번의 px4_poll 시스템 콜 타격으로 커널에 밀어 넣고 스레드를 기절시킨다. 그 후 N개의 버퍼 중 “단 한 곳에서라도” 누군가 데이터를 내려써 업데이트(POLLIN)가 터지면 즉각 스레드가 뺨을 맞고 깨어난다. 스레드가 기상한 직후, 곧바로 switch-caseif 분기문을 거칠게 돌며 **“대체 저 칠흑 같은 N개의 센서 통로 중 정확히 어떤 놈이 방금 나를 깨웠는가?”**를 정확히 역추적 식별하여, 오직 해당 갱신된 토픽 하나만 orb_copy로 얌체같이 빼먹고 연산하는 극한의 멀티플렉싱을 달성한다.

이 3단계의 런타임 멀티플렉싱(Multiplexing) VFS 수신 아키텍처를 온전히 마스터하게 되면, 단 1개의 가벼운 스레드만으로 온 픽스호크 마더보드 우주의 모든 주요 PX4 텔레메트리 파이프를 단오차 없이 실시간으로 지휘하는 완벽무결한 마에스트로(Maestro) 데몬을 탄생시킬 수 있게 될 것이다.