19.6.1. 다중 인스턴스의 개념 및 아키텍처

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) 구조로 뻗어나간다.

  1. 최상위 메타데이터 객체 (ORB_ID): 시스템 램에 단 1개만 유일하게 배정되어 존재하는 ORB_ID(vehicle_acceleration) 식별자. 토픽의 고유 길이명, 데이터 해시 크기(Size) 등 스키마 기본 뼈대 정보를 들고 있다.
  2. 중간 계층 인스턴스 브랜치 (Instance Indices): 퍼블리셔들이 데이터를 쏠 때 생겨난 동적 가지파이프들.
    [Instance 0] (SPI 센서용), [Instance 1] (I2C 센서용), [Instance 2] (가상 보드 시뮬레이터용)…
    이 칸막이들은 각자 완전하게 메모리가 물리적으로 단절되어 분리되어 있으므로, 1번 방에 1000Hz로 미친 듯이 데이터를 때려부어도 0번 방의 데이터는 L1 캐시상에서 1바이트도 손상(Overwrite)되지 않고 영구 완벽하게 방어된다.
  3. 최하위 구독자 커넥션 (Subscriber FDs): 하나의 인스턴스 꼬리단 노드(예: Instance 0)에 무려 수십 개의 여러 데몬 스레드들이 각각의 독립적인 수신 핸들(FD) 파이프를 꽂고 매달려, 누군가 각자의 orb_copy 타이밍에 맞춰 안전하게 뽑아먹는 방사형 브로드캐스트 망.

이 강력한 트리 구조 토폴로지 덕분에, 마더보드가 불량이라 비행 중 0번 SPI 센서 칩셋이 물리적으로 바싹 타버려 데이터 송출이 뚝 끊기더라도, 커널의 인스턴스 1번, 2번 파이프 방은 기스 하나 나지 않고 멀쩡하게 계속 살아남아 데이터를 흘려보낸다. 메인 중앙 항법 모듈은 이 타임아웃(Timeout) 붕괴 시그널을 즉각 인터럽트로 잡아채고, 구독 타겟을 0번 방에서 1번 보조 방으로 스냅 스위칭(Hot-swap) 해버림으로써, 공중에 뜬 100kg짜리 공격 드론의 추락을 이중 삼중으로 완벽 방어하는 경이로운 페일세이프(Failsafe) 아키텍처 토대를 다지게 된다.