22.2.3 콜백 그룹 병행 제어 단일화 및 디폴트 이그제큐터 안정성 개선 체계
1. 개요
ROS2 프레임워크의 실행 모델(Execution Model)은 노드 내에서 발생하는 비동기 이벤트(타이머 만료, 토픽 수신, 서비스 요청 등)를 처리하기 위해 이그제큐터(Executor)와 콜백 그룹(Callback Group)이라는 두 계층의 스케줄링 메커니즘을 운용한다. ROS2 Foxy 및 Galactic 배포판에서는 다중 스레드 이그제큐터(Multi-threaded Executor) 사용 시 뮤텍스(Mutex) 경합 및 콜백 스레드 안전성(Thread-safety)과 관련한 시스템 불안정성이 종종 보고되었다. ROS2 Humble Hawksbill은 이러한 병렬 처리 아키텍처의 결함을 파악하고, 콜백 그룹의 병행 제어(Concurrency Control)를 단일화 및 고도화하여 디폴트 이그제큐터의 런타임 안정성을 비약적으로 향상시켰다. 본 절에서는 Humble 배포판에 적용된 콜백 스케줄링의 구조적 개선 양상을 분석한다.
2. ROS2 이그제큐터와 콜백 그룹의 아키텍처적 역할
이그제큐터는 미들웨어(DDS) 큐에 적재된 메시지나 이벤트를 꺼내어 애플리케이션 계층에 정의된 콜백 함수로 전달하는 스레드 풀(Thread Pool) 관리자이다. 반면 콜백 그룹은 이러한 콜백들이 이그제큐터의 스레드 위에서 ’동시에 실행될 수 있는지’를 규정하는 룰셋(Rule-set)이다.
2.1 상호 배타적(Mutually Exclusive) 콜백 그룹
동일한 Mutually Exclusive 그룹에 속한 콜백들은 다중 스레드 이그제큐터가 작동하더라도 절대 병렬로 실행되지 않는다. 이는 클래스 멤버 변수나 공유 자원을 수정하는 콜백 간의 경쟁 상태(Race Condition)를 방지하는 가장 1차원적인 안전장치이다.
2.2 재진입 가능(Reentrant) 콜백 그룹
Reentrant 그룹에 속한 콜백들은 서로 다른 스레드에서 동시에 병행(Concurrent) 실행될 수 있으며, 심지어 동일한 콜백 함수가 동시에 여러 스레드에서 호출(재진입)될 수도 있다. 이는 높은 빈도의 센서 스트림을 병렬로 처리해야 하는 자율 주행 비전 노드 등에서 필수적으로 요구되는 설정이다.
3. Humble 배포판의 이그제큐터 안정성 개선 메커니즘
이전 버전의 아키텍처에서는 다중 스레드 이그제큐터가 Reentrant 그룹 내의 작업을 가져올 때(Wait Set 구성 단계), 로직의 결함으로 인해 불필요한 뮤텍스 락(Lock)을 장시간 점유하거나 스레드 풀이 소진되는 교착 상태(Deadlock)에 빠지는 현상이 빈번했다. Humble 배포판은 런타임 수준(rcl 및 rclcpp)에서 이 제어 구조를 전면적으로 개편하였다.
3.1 뮤텍스 제어 로직의 세분화 및 지연 락(Lazy Locking) 도입
Humble 배포판은 이그제큐터가 실행 대기 중인 콜백을 식별(Ready)하고 할당(Take)하는 두 단계의 파이프라인에서 공유 자원에 대한 전역 잠금(Global Lock)을 제거하였다. 대신 C++17의 std::shared_mutex를 활용한 다중 읽기/단일 쓰기(Multiple Reader/Single Writer) 패턴을 적용하여, 스레드들이 큐(Queue)의 상태를 검사할 때는 잠금을 공유하고 실제 콜백을 가져가는 순간에만 독점 락(Exclusive Lock)을 활성화한다. 이를 통해 멀티 코어 환경에서 스레드가 유휴 상태로 대기하는 스톨(Stall) 사이클이 획기적으로 감소하였다.
3.2 콜백 그룹 상태 추적 메커니즘(State Tracking System)
Mutually Exclusive 그룹의 병행 실행 차단을 보장하기 위해, 이그제큐터는 각 콜백 그룹의 ‘실행 중(Executing)’ 상태를 원자적(Atomic) 변수를 통해 정밀하게 추적하도록 개선되었다. 한 스레드가 특정 Mutually Exclusive 그룹의 콜백을 실행하기 시작하면, 해당 그룹은 즉시 이그제큐터의 다음 탐색 풀에서 논리적으로 은닉(Hidden)된다. 이러한 원자적 연산을 통한 상태 관리 기법은 이전 버전에서 발생하던 ’동시성 판단 타이밍 오류’를 원천적으로 해결하여 멀티 스레드 제어기(Controller) 노드의 안정성을 극대화했다.
4. 디폴트 이그제큐터(Default Executor)의 신뢰성 향상 효과
자율 비행 드론의 비행 제어기(Flight Controller)나 복합 SLAM 노드는 IMU 데이터 처리(고주파스), 이미지 콜백(고부하), 상태 발행(저주파스) 등 다양한 주기의 콜백이 격렬하게 혼재된 실행 상태를 가진다. Humble의 개선된 병행 제어 단일화 덕분에, 개발자는 커스텀 스레드 풀을 복잡하게 직접 구현할 필요 없이 시스템이 제공하는 디폴트 ’Multi-threaded Executor’만으로도 데드락 없는 안정적인 제어 주기를 확정적으로 보장받을 수 있다.
5. 결론
ROS2 Humble 시스템은 이그제큐터의 작업 탐색(Wait Set)과 콜백 인출 메커니즘의 아키텍처 결함을 C++17의 모던 동기화 기법과 원자적 상태 관리를 통해 치유하였다. Mutually Exclusive 그룹의 엄격한 상호 배제가 멀티 스레드 환경에서도 O(1)에 가까운 저비용으로 보장됨에 따라, 디폴트 이그제큐터는 미션 크리티컬 실시간 시스템에 즉시 투입 가능한 수준의 엔터프라이즈급 신뢰성과 안정성 프로파일을 확보하게 되었다.