30.7 목표 취소(Cancel) 및 선점(Preemption) 처리 알고리즘 비동기 전개 양상
자율 이동체 통제 시스템에서 장기 실행 태스크(Long-Running Task)는 필연적으로 동적 주행 환경의 변화에 직면하게 된다. 목표 지점으로 네비게이션을 수행하는 도중에 동적 장애물이 출현하거나, 상위 관제 시스템에서 더 높은 우선순위의 새로운 좌표를 하달하는 상황은 빈번하게 발생한다. 이러한 예외적 상황을 안전하게 통제하기 위해서는 기존에 동작 중인 비즈니스 로직을 즉각적으로 중단시키고 제어권을 회수할 수 있는 매커니즘이 필수적이다. 본 절에서는 통신망 아키텍처 레벨에서 목표 취소(Cancel)를 처리하는 이론적 토대와, 새로운 목표가 기존 목표를 덮어쓰는 선점(Preemption) 알고리즘의 비동기적 전개 양상을 심층적으로 분석한다.
1. 클라이언트 주도의 비동기 취소(Cancel) 파이프라인
단방향으로 종료되는 단일 트랜잭션 서비스 모델과 달리, ROS2의 액션(Action) 컴포넌트는 클라이언트가 실행 중인 서버 프로세스에 동적으로 개입(Intervention)할 수 있는 취소 파이프라인을 내재하고 있다. 클라이언트 노드는 초기에 발급받은 목표 핸들(Goal Handle)의 UUID 식별자를 기반으로 async_cancel_goal 인터페이스를 호출할 수 있다.
네트워크를 경유하여 이 취소 요청 패킷이 서버 엑시큐터에 도달하면, 서버는 해당 트랜잭션을 강제 종료(Kill)하는 것이 아니라 공식적인 상태 머신의 전환 관문인 handle_cancel_callback으로 제어권을 인계한다. 이 콜백은 현재 구동 중인 백그라운드 연산 스코프가 논리적으로 중단 가능한 구간(Safe-point)에 위치해 있는지를 검사하며, 취소 수용 여부(Accept or Reject)를 반환한다. 이는 무조건적인 프로세스 인터럽트로 인한 하드웨어 메모리 단편화나 장치 레지스터 잠금 현상(Device Register Lock)을 소프트웨어 설계 수준에서 방지하기 위함이다.
2. 선점(Preemption) 아키텍처와 트랜잭션 수렴 이론
선점(Preemption)은 오퍼레이터가 명시적인 취소 명령을 내리기 이전에, 새로운 목표(New Goal)가 하달됨으로써 기존의 실행 흐름(Old Goal)이 자동으로 취소 및 교체되는 논리적 응용 형태를 지칭한다. 다중 에이전트 자율 주행 알고리즘에서는 실시간으로 지도가 갱신됨에 따라 초당 수 회씩 경로 궤적이 덮어 쓰이는 시나리오가 일반적이다.
서버가 새로운 목표의 SendGoal 패킷을 수락했을 때, 내부에 이미 Executing 상태의 트랜잭션이 존재한다면 서버 로직 자체적으로 구형 목표 핸들의 상태를 Canceling으로 강제 전이시키는 선점 모델을 구현해야 한다. 이때 스케줄링 큐 내에서 동일한 액추에이터 자원을 확보하기 위해 발생하는 구버전과 신버전 태스크 간의 데드락 충돌(Priority Inversion)을 방지하기 위하여, 개발자는 이전 워커 스레드의 점유권 반환을 확정하는 논블로킹(Non-blocking) 스왑 알고리즘과 상호 배제(Mutex) 앵커를 정교하게 설계해야 한다.
3. Canceling 상태 전이와 루프 양보(Yield) 메커니즘
취소 또는 선점이 승인되어 목표 핸들이 Canceling 상태로 진입한 직후에도 워커 스레드의 코어 연산 루프는 즉각적으로 소멸하지 않는다. 연산을 관장하는 백그라운드 반복문(while loop) 내부에는 주기적으로 goal_handle->is_canceling() 플래그를 검열하는 앵커 포인트가 배치되어야 한다.
콜백 내부 루틴이 이 취소 징후를 식별하면, 시스템은 즉시 연산 흐름을 return 하거나 코루틴을 yield 하여 자원을 해방한다. 이 메커니즘은 매우 높은 학술적 가치를 지닌다. 왜냐하면 이는 운영체제 커널의 시그널 단위 처형(e.g., SIGKILL)에 의존하지 않고, 쓰레드 스스로가 안전하게 자신이 점유한 힙(Heap) 메모리와 I/O 포트를 정리(Garbage Collection)하게끔 유도하는 자발적 생명주기 통제(Self-Governed Lifecycle Control) 모델의 축소판이기 때문이다.
4. 기구학적 하드웨어 안전 폴백(Fallback)과 2단계 종료
물리적 로봇의 구동부 제어에 액션망을 매핑했을 때, 최상위 취소 명령은 단순한 데이터 연산 중단을 넘어 기구학적 안전 확보 단계(Safe Kinematic Sequence)를 필연적으로 수반한다.
예를 들어 주행 중인 드론에게 취소 명령이 인가되어 비행 루프가 Canceling 상태가 되었을 때, 모터 제어 소프트웨어가 갑자기 정지해버리면 로터 추력이 순간 상실되어 곧바로 자유 낙하 충돌로 직결된다. 따라서 Canceling 상태 동안의 서버 액션 코드는 궤적 추종 루틴을 벗어나는 즉시 정해진 감속 프로파일(Deceleration Profile)에 따라 기체 모멘텀을 상쇄하는 제동(Braking) 및 안전 고도 정지 비행(Hovering) 시퀀스로 전환(Fallback)되어야만 한다. 일련의 물리적 둔화 절차가 종료되어 드론이 완전 상태 머신상 정찰 대기열에 진입했을 때 비로소 Canceled라는 종단 상태를 선언하는 이러한 2단계 종료(Two-phase Termination) 프로세스는, 오류 발생 시 사이버(Cyber) 세계 단위의 조치와 물리(Physical) 세계 단위의 조치를 매끄럽게 결속해 주는 실시간 분산 시스템 설계의 정수이다.