# 1. Dataman(Data Manager) 계층의 LRU(Least Recently Used) 캐시 교체 알고리즘 기반 SD 카드 I/O 최적화 로직
초창기 오픈소스 비행 제어기(Legacy Ardupilot 등) 아키텍처가 겪었던 고질적 골칫거리 중 하나는 비행 임무 아이템(웨이포인트) 보관을 위한 메모리 관리 한계였다. 수백 개의 MAVLink 미션 스크립트를 수백 킬로바이트(KB) 남짓한 마이크로컨트롤러(MCU) SRAM에 일괄적으로 로드하면 힙 아웃오브메모리(Heap OOM) 오류로 시스템이 크래시(Crash)할 위험에 노출되었고, 반대로 필요할 때마다 EEPROM이나 마이크로 SD 카드에서 1개씩 읽어오게 하면 극심한 하드웨어 I/O 병목(Bottleneck)이 발생하여 제어 루프의 타이밍 마진을 파괴했다.
이러한 모순을 해결하기 위해 PX4-Autopilot은 **dataman (Data Manager)**이라는 자체 내장 초경량 데이터베이스 서브 매니저를 개발하여 도입하였다. 본 절에서는 MissionBlock이 웨이포인트를 Fetch할 때 dataman 모듈이 어떻게 배후에서 LRU(Least Recently Used) 캐시(Cache) 교체 알고리즘을 활용하여 SD 카드 입출력 병목을 방어하고, 비행 모드의 하드 리얼타임(Hard Real-time) 제약 조건을 사수하는지 상세히 분석한다.
1.1 dataman 백엔드 스토리지 아키텍처 및 페이징(Paging) 모델
dataman 시스템은 Mission, Geofence, Rally Point 등 덩치가 크고 연속성을 띠는 배열형(Array) 데이터 집합을 관리하는 백그라운드 데몬(Daemon) 모듈이다. 이 모듈은 데이터를 저장할 때 일차적으로 기체의 마이크로 SD 카드 내의 비휘발성 저장소인 dataman 특수 이진(Binary) 파일 포맷을 주 백엔드(Backend) 베이스로 삼는다.
하지만, navigator 메인 스레드가 50Hz라는 타이트한 주기마다 현재 나아가야 할 차기 경로점 정보(mission_item_s)를 읽어오기 위해 매번 마이크로 SD 파일 버퍼의 fseek()와 fread() 시스템 콜을 호출하는 것은 자살 행위와도 같다. SD 모듈의 파일 시스템 접근 지연(Latency)은 예측 불가할 뿐 아니라 수 밀리초에서 단위십 밀리초까지 튀기 때문이다.
이를 극복하기 위해 dataman은 MCU 코어의 고속 SRAM 내부 일정 구역을 할당하여 소위 페이징(Paging) 블록 단위의 캐시(Cache) 메모리 레이어를 중간에 삽입했다. navigator의 MissionBlock 계층은 결코 SD 카드의 물리적 I/O 버스 인터페이스와 직접 결합(Tight-Coupling)되지 않고, 오로지 이 고속 램(RAM)단의 캐시 매니저와만 교신(Fetch)하는 아키텍처적 격리(Isolation) 정책을 보유하게 된다.
1.2 LRU(Least Recently Used) 기반 캐시 미스(Cache Miss) 처리 및 교체 알고리즘
수십 개에 달하는 웨이포인트를 무한히 RAM 캐시에 올릴 수는 없으므로, dataman은 내부적으로 고정된 개수의 배열 슬롯(예: 4~8 블록의 페이징 윈도우)만을 활성화하여 유지한다. 기체가 비행을 진행하며 MissionBlock이 인덱스를 전진시켜 특정 MAVLink 미션 아이템을 데이터 버스에 요구(dm_read())했을 때, 캐시에 해당 인덱스가 운 좋게 존재하면 이 **캐시 히트(Cache Hit)**를 통해 수명이 지연율 없이 즉결 반환된다.
만약 해당 인덱스의 아이템을 페이징 윈도우에서 찾지 못하면 **캐시 미스(Cache Miss)**가 선언된다. 이때 dataman 데몬은 새로운 메모리를 마이크로 SD 카드 블록에서 읽어와 램에 덮어써야 한다. 문제는 이미 꽉 찬 캐시 블록 중 어떤 희생자(Victim) 플롯을 무효화(Invalidate)하고 밀어낼(Eviction) 것인가를 결정짓는 기준치이다. PX4는 여기서 범용 전산학의 고전적이고 확실한 명제인 LRU(Least Recently Used) 교체 정책을 선택했다.
graph TD
A[MissionBlock <br/> 웨이포인트 N번 요청] --> B{RAM 캐시 테이블 <br/> 조회}
B -->|인덱스 존재 (Cache Hit)| C[즉시 반환 <br/> (지연시간 < 1ms)]
B -->|인덱스 부재 (Cache Miss)| D[LRU 기반 교체 발동 <br/> 희생 슬롯 선정]
D --> E[가장 오랫동안 <br/> 참조되지 않은 블록 <br/> Eviction (N-X번 등)]
E --> F[Micro SD 스토리지 <br/> 백그라운드 I/O Read]
F --> G[캐시 슬롯 교체 (Swap) <br/> 반환]
style C fill:#ccffcc,stroke:#333
style G fill:#ffcccc,stroke:#333
- 각 캐시 슬롯 모듈은
dataman내부에서 구조체로 타임스탬프와 흡사한 생명주기 카운터(Counter)를 상속 관리받는다. Mission특유의 순차 진행적 특성(Sequential Access, Index 1 \rightarrow 2 \rightarrow 3 \rightarrow 4)에 기인하여, 새로 읽어와야 할 아이템은 대개 최전선 미래 아이템이므로, 가장 오랫동안 호출된 적 없는(Least Recently Used), 즉 한참 전에 지나친 과거의 웨이포인트(예: 인덱스 1, 2번 등 파견 지역) 슬롯이 LRU 포인터 타겟 희생자로 선정어 교체된다.- 이는 FIFO(First-In First-Out)나 LFU(Least Frequently Used) 알고리즘 대비, 순차적 임무 이정표 탐색에 최적화된 높은 캐시 히트율(Cache Hit Ratio)의 확률론을 제공한다.
1.3 삼중체(Triplet) 생성 모델의 Look-ahead 캐시 퍼포먼스
앞 장에서 분석한 navigator 모듈의 설정점 삼중체(Setpoint Triplet) 모델 특성은 이 LRU 캐싱 효율과 시너지를 이루어 엄청난 성능 최적화를 일구어 낸다.
삼중체는 항상 previous, current, next의 인접한 3종 세트 웨이포인트를 무조건적으로 요구한다. 따라서 MissionBlock은 기체가 current를 향해 한참 이동 중인 그 긴 시간 동안부터 이미 백그라운드 dataman API를 통해 미래의 아이템인 next 인덱스를 향해 암묵적 호출을 던져 놓는다.
이 선제적 읽기(Readahead / Look-ahead) 유도 덕분에, 기체가 current 수용 반경에 도달하여 실제로 next 아이템이 current로 승격(Shift)되는 매우 시간제약이 긴박한 그 시점에는 이미 타겟 구조체가 램 슬롯 위에 100% 락아웃(Lock-out) 기반 캐시 히트로 거치되어 있게 된다. 이는 일명 은닉된 지연(Hidden Latency) 현상으로, SD 카드 엑세스의 잠재적 렉(Lag)을 물리 비행 궤적의 충격으로 번지지 않도록 소프트웨어 레벨에서 철저하게 봉쇄하는 고급 기술이다.
1.4 비동기 무손실 트랜잭션과 무결성 보호(Failsafe)
더욱이 dataman은 데이터 쓰기 모드 시(GCS로부터 임무 패킷을 새롭게 수신할 시)에도 LRU 캐시 단계를 중간 지대로 활용한다.
조종사가 GCS를 통해 수십 개의 MAVLink 미션 스크립트를 재업로드하는 돌발 과정 중 통신이 일시 단절에 빠지는 경우, 절반만 쓰인(Incomplete) 부정 오염된 미션 아이템이 하위 제어기에 전달되면 기체의 자살 행위로 이어질 수 있다. 이를 예방하기 위해, dataman은 쓰기 캐시에 들어온 데이터를 ‘수정 중(Dirty)’ 상태로 마킹해 두고, GCS의 최종 MISSION_ACK가 인증되었을 때 한꺼번에 원자적(Atomic) 트랜잭션 방식으로 플래시(Flush)하여 적용 데이터베이스 스위칭을 이룩한다.
만일 비행 도중 정전(Power Failure)이나 예기치 못한 워치독 리셋(Watchdog Reset)으로 컨트롤러가 강제 재부팅이 된다 하더라도, 비휘발성 백엔드(SD 카드) 기록의 무결성 덕에 dataman은 부팅 직후 단 한 번의 O(1) 복구 스캐닝만으로 가장 마지막에 유효했던 임무 상태값을 온전히 램 캐시로 부활시킨다.
종합하여 볼 때, dataman 스토리지 모듈과 LRU 페이징 캐시 모델의 도입은 PX4 자동 비행 모드가 가변적인 외부 메모리 매체 지연성(I/O Jittering)을 극복하고, 임베디드 하드 리얼타임 비행 궤적 제어 루프의 매끄러움을 100% 무결 결벽 수준으로 영속하는 최강의 추상화 쉴드(Abstraction Shield)라 평가된다.