18.1.3.2 데이터 직렬화(Serialization)/역직렬화(Deserialization) 생략이 시스템 자원에 미치는 영향
미들웨어가 데이터를 서로 다른 기기 간에 주고받기 위해서는, 메모리에 산재해 있는 C/C++ 구조체의 변수들을 네트워크 선송을 위한 일렬의 바이트 스트림(Byte Stream)으로 묶어내는 과정이 필수적이다. 이를 직렬화(Serialization) 라고 하며, 반대로 수신된 바이트 스트림을 다시 본래의 구조체 변수로 풀어내는 과정을 역직렬화(Deserialization) 라고 부른다.
PX4의 uORB는 앞서 언급했듯 이 과정을 완전히 생략하고 C 구조체 메모리의 배열 상태(Memory Layout)를 원시 형태(Raw) 그대로 공유 메모리에 복사(Copy)하는 방식을 취한다. 이러한 파격적인 아키텍처 결단이 임베디드 비행 제어기(FCC)의 시스템 자원(CPU, RAM, WCET)에 미치는 긍정적인 영향은 지대하다.
1. CPU 연산 주기의 극한 절약 (Zero-Overhead)
일반적인 ROS 통신망이나 MAVLink 프로토콜의 직렬화 패키징 로직 내부를 살펴보면 다음과 같은 연산들이 쉴 새 없이 일어난다.
- 빅 엔디안(Big-Endian)과 리틀 엔디안(Little-Endian) 간의 바이트 순서 변환 연산
- 가변 길이 배열(Variable Length Array) 처리 및 반복문(for-loop) 순회
- 데이터 무결성 검증을 위한 체크섬(Checksum, 예: CRC32) 연산
1초에 4,000번(4kHz)씩 자이로 센서 데이터를 퍼블리시해야 하는 드론의 최하단 층위에서 이 연산들을 매 주기마다 수행한다면, 200MHz 대역의 마이크로컨트롤러는 통신 스택을 유지하는 것만으로 연산력(CPU Load)의 절반 이상을 허비하게 된다.
uORB는 발행자와 구독자가 물리적으로 완벽하게 동일한 칩셋(동일한 엔디안, 동일한 워드 사이즈, 동일한 컴파일러 패딩 규칙) 위에서 동작한다는 대전제를 깔고 있다. 따라서 직렬화를 위한 연산 분기를 모두 날려버리고 오직 CPU의 하드웨어 가속을 받는 일괄 복사(memcpy()) 명령어 1회만으로 송수신을 마친다. 이는 데이터 교환에 드는 CPU 사이클을 수천 번대에서 수십 번대로 혁신적으로 단축시킨다.
2. 런타임 동적 메모리 할당(Dynamic Allocation)의 원천 차단
직렬화를 수행하기 위해서는 패킹된 바이트를 담아둘 임시 버퍼(Buffer) 가 필요하다. 데이터의 크기가 가변적일 경우 범용 미들웨어들은 내부적으로 malloc()이나 new 키워드를 사용해 힙(Heap) 영역의 메모리를 동적으로 끌어다 쓴다.
이는 하드 리얼타임 시스템(RTOS) 관점에서 두 가지 치명적인 독을 품고 있다.
- 메모리 단편화(Memory Fragmentation): 며칠간 쉬지 않고 구동되는 시스템에서 동적 할당과 해제가 반복되면, 남은 메모리 총량은 충분한데 쪼개진 파편화로 인해 연속된 메모리를 구하지 못해 펌웨어가 멈추는(Out-of-memory Crash) 현상이 발생한다.
- 할당 지연(Allocation Latency): 힙 영역을 탐색하여 빈 공간을 찾는 알고리즘은 O(n)의 불규칙한 실행 시간을 가지므로 제어 주기의 결정론성을 파괴한다.
uORB는 직렬화를 생략함으로써 중간 크기의 버퍼가 완전히 불필요해졌다. 시스템 부팅 시점에 메인 메모리(SRAM)에 sizeof(구조체) 만큼 고정된 정적(Static) 크기의 링 버퍼를 단 한 번 지어놓고, 전원이 꺼질 때까지 그 공간 안에서만 memcpy() 덮어쓰기를 반복한다. 메모리 누수(Leak)나 파편화 가능성이 구조적으로(By Design) 0%가 되는 것이다.
3. 최악 실행 시간(WCET, Worst-Case Execution Time)의 예측 가능성
항공우주 소프트웨어 인증(DO-178C 등)에서 가장 중요하게 보는 지표 중 하나가 WCET이다. 아무리 복잡한 상황이 겹쳐도 “함수가 여기서부터 저기까지 실행되는 데 걸리는 최대 시간“이 수학적으로 증명되어야 한다.
복잡한 역직렬화 파서를 거치면 데이터 페이로드(Payload)의 내용에 따라 if-else 분기가 다르게 타기 때문에 WCET 산출이 극도로 어두워진다. 반면 uORB는 메시지의 내용이 무엇이든 상관없이 정해진 sizeof(구조체) 바이트만큼만 기계적으로 복사하고 끝나므로, O(1)의 상수로 고정된 완벽한 WCET 예측 가능성을 획득한다.
결과적으로 데이터 직렬화의 생략은, 하이엔드급 리눅스 컴퓨터가 아니면 꿈도 꿀 수 없었던 ROS 급의 유연한 발행-구독 아키텍처를 불과 몇 천 원짜리 초저전력 마이크로컨트롤러(MCU) 위에서도 20% 미만의 CPU 점유율로 구동시킬 수 있게 한 일등 공신이라 할 수 있다.