19.6.1. 다중 인스턴스의 개념 및 아키텍처
PX4 커널 코어가 자랑하는 ‘다중 인스턴스(Multi-instance)’ 아키텍처의 철학을 한 문장으로 압축하면 다음과 같다. “하나의 우체통(Topic) 이름표 아래, 내부적으로 0번, 1번, 2번… N번으로 무한정 쪼개지는 동적 칸막이(Sub-pipeline)를 배열(Array)처럼 생성해 내는 VFS 링 버퍼 매니지먼트 기술.”
만약 초보 개발자가 이 다중 인스턴스 지원 커널 기술의 존재조차 모른 채 픽스호크 보드에 똑같은 센서를 3개 달았다고 가정해 보자. 이 불쌍한 개발자는 각 센서의 데이터를 충돌 없이 독립적으로 링커에 살려두기 위해, sensor_1, sensor_2, sensor_3이라는 전혀 다른 독자적인 3개의 토픽 이름으로 스키마(uORB .msg 파일)를 각각 물리적으로 3장 복사 붙여넣기 하여 만들 것이다. 이 삽질로 인해 시스템 헤더는 쓸데없이 3배로 무거워지고, 이 3개의 이질적인 센서를 먹어야 하는 하단 EKF 구독자 모듈은 C++ 소스 코드 안에서 3개의 전혀 다른 헤더 타입을 일일이 include하며 개별 구조체 객체를 무작위로 복사해 짜야 하는 악몽 같은 하드코딩 지옥에 빠지게 된다.
1. 스키마의 전역적 단일화(Unification) 및 런타임 분기
이 하드코딩의 참사를 완전히 분쇄하는 것이 바로 PX4 uORB 다중 인스턴스 설계이다.
- 컴파일 타임(Compile-time)의 단일화: 물리적인 센서가 마더보드에 100개가 달리든 1000개가 달리든, 개발자는 오직 단 한 장의
.msg스키마 파일(예:vehicle_acceleration.msg)만을 생성하고 렌더링 시스템에 등록한다. 하단 구독자건 상위 퍼블리셔건 간에, 오직 이 한 장의 공통 헤더 타입(<uORB/topics/vehicle_acceleration.h>)과 단일 구조체 껍데기(vehicle_acceleration_s)만을 런타임 내내 일관되게 재활용(Reuse)한다. 개발 코드의 기적적인 통일성이다. - 런타임(Runtime)의 물리적 분할: 정작 프로그램 메인 루프가 돌아갈 때(Runtime), 커널 스케줄러 VFS 내부에서는 이 단일화된 토픽 이름표 밑으로, 퍼블리셔 데몬들이 런칭 순서대로 들어와 커널에게 집을 지어달라고 요청할 때마다 0, 1, 2, 3… 번호표가 매겨진 완전히 독립적인 메모리 링 버퍼 파이프(칸막이)를 동시 다발적으로 무한 복제 생성해 준다.
2. 다중 인스턴스의 런타임 메모리 토폴로지(Topology)
이 개념을 픽스호크 마더보드 램(RAM) 구조에서 바라보면 다음과 같은 3계층의 거대한 네트워크 트리(Tree) 구조로 뻗어나간다.
- 최상위 메타데이터 객체 (ORB_ID): 시스템 램에 단 1개만 유일하게 배정되어 존재하는
ORB_ID(vehicle_acceleration)식별자. 토픽의 고유 길이명, 데이터 해시 크기(Size) 등 스키마 기본 뼈대 정보를 들고 있다. - 중간 계층 인스턴스 브랜치 (Instance Indices): 퍼블리셔들이 데이터를 쏠 때 생겨난 동적 가지파이프들.
[Instance 0](SPI 센서용),[Instance 1](I2C 센서용),[Instance 2](가상 보드 시뮬레이터용)…
이 칸막이들은 각자 완전하게 메모리가 물리적으로 단절되어 분리되어 있으므로, 1번 방에 1000Hz로 미친 듯이 데이터를 때려부어도 0번 방의 데이터는 L1 캐시상에서 1바이트도 손상(Overwrite)되지 않고 영구 완벽하게 방어된다. - 최하위 구독자 커넥션 (Subscriber FDs): 하나의 인스턴스 꼬리단 노드(예:
Instance 0)에 무려 수십 개의 여러 데몬 스레드들이 각각의 독립적인 수신 핸들(FD) 파이프를 꽂고 매달려, 누군가 각자의orb_copy타이밍에 맞춰 안전하게 뽑아먹는 방사형 브로드캐스트 망.
이 강력한 트리 구조 토폴로지 덕분에, 마더보드가 불량이라 비행 중 0번 SPI 센서 칩셋이 물리적으로 바싹 타버려 데이터 송출이 뚝 끊기더라도, 커널의 인스턴스 1번, 2번 파이프 방은 기스 하나 나지 않고 멀쩡하게 계속 살아남아 데이터를 흘려보낸다. 메인 중앙 항법 모듈은 이 타임아웃(Timeout) 붕괴 시그널을 즉각 인터럽트로 잡아채고, 구독 타겟을 0번 방에서 1번 보조 방으로 스냅 스위칭(Hot-swap) 해버림으로써, 공중에 뜬 100kg짜리 공격 드론의 추락을 이중 삼중으로 완벽 방어하는 경이로운 페일세이프(Failsafe) 아키텍처 토대를 다지게 된다.