19.3.4. 자원 해제 및 발행 종료 처리

19.3.4. 자원 해제 및 발행 종료 처리

픽스호크 마더보드 위에서 미친 듯이 미들웨어 트래픽 폭격을 무자비하게 쏟아내던 우리의 퍼블리셔(Publisher) 스레드가, 드디어 사용자의 “stop” 터미널 커맨드 한 방에 의해 지긋지긋한 무한 루프 감방에서 풀려나 영원한 죽음을 맞이할 시간이다. 하지만 가혹한 C/C++ 펌웨어 임베디드 생태계에서 프로세스의 죽음이란, PC 윈도우 창 닫기 버튼을 누르듯 OS가 알아서 메모리를 수거해 가며 쿨하게 끝나는 축복이 아니다. 아키텍처 관점에서 **“완벽하게 잘 죽는 것(Graceful Shutdown)”**은 “완벽하게 실행되는 것” 이상으로 시스템의 장기적인 안정성과 직결되는 가장 치명적인 코어 아키텍처의 의무 과제이다.

만약 이 백그라운드 스레드가 자신이 점유한 배설물(링 버퍼, 핸들 메모리)들을 커널 상방에 그대로 더럽게 흩뿌려둔 채 자신만 홀연히 껍데기로 자살(Exit)해 버린다면 어떻게 될까? 그것은 곧바로 NuttX 커널 VFS 가상 파일 시스템 디스크립터(FD) 고갈과 시스템 로컬 램의 메모리 릭(Memory Leak)이라는 시한폭탄 징벌로 고스란히 남게 되며, 몇 시간 뒤 로봇 기체가 공중에서 임무 중 알 수 없는 커널 패닉(OOM)을 일으키며 산산조각 추락하는 대형 시스템 브레이크다운(Breakdown) 참사의 근본 원흉이 된다.

이 통합 단원에서는 C++ 스레드가 메인 루프를 탈출하여 완전 스택 소멸하기 직전, 오직 자신의 손으로 자신이 뚫어 놓았던 시스템 파이프를 파괴하고 떠나는 결벽증적이고 완벽한 자원 청소(Cleanup) 절차를 집행 통제한다.

  • 1단계: 미들웨어 광고 권한 파괴 선언 (orb_unadvertise): 스레드가 while 무한 루프를 탈출한 직후 찰나에, 코어 커널 스케줄러를 향해 “이제 나는 더 이상 이 토픽 데이터를 쏘지 않고 조용히 죽을 테니, 나에게 할당했던 더러운 링 버퍼 메모리와 파이프망을 당장 회수해 시스템에 토해내라“라고 폭력적으로 통보하여 펌웨어 RAM을 소독하는 가장 치명적인 자원 반환 스킬을 코드에 꽂아 넣게 된다.
  • 2단계: 커스텀 구조체 할당 해제 및 스레드 자살 완료 (Graceful Exit): 로컬 힙/스택 캐시 포인터들의 완전무결한 매립과 스레드의 데드(Dead) 소멸 상태를 NSH(NuttShell) 마스터 관제소에 정상(0) 코드로 보고하고 가장 평온하게 프로세스 죽음을 맞이하는 킬링(Killing) 분기를 설계 제어한다.

이 피도 눈물도 없이 잔혹하고 완벽한 클린업 청소(Cleanup) 프로세스까지 소스 파일 맨 끄트머리에 무사히 타설해 내야만, 비로소 당신의 커스텀 모듈은 터미널에서 수백, 수천 번을 무지성으로 켰다(Start) 껐다(Stop) 폭력적으로 반복 실험하더라도, 물리 칩셋의 남은 코어 메모리를 단 1바이트도 영구히 훔쳐 가지 않는 완벽한 무결점의 마스터 애플리케이션으로 시스템에 군림 통치하게 되는 것이다.