## 0.1 데이터 의존성이 없는 독립 패키지 그룹 간 비동기 동시 빌드 방식
ROS 2(Robot Operating System 2) 워크스페이스에 존재하는 수많은 패키지들은 모두가 직렬적인 종속 관계로 얽혀있지 않으며, 기능적 분리(Functional Decoupling)에 따라 상호 연관성이 전혀 없는 다수의 독립적인 서브 그래프(Subgraph)로 구성되는 경우가 일반적이다. 예를 들어, 라이다(LiDAR) 센서 드라이버 패키지와 웹 기반 GUI 대시보드 패키지는 아키텍처 상 공유하는 라이브러리나 메시지 타입이 없다면 동일한 의존성 계층(Topological Level)에 배치될 수 있다. Colcon 빌드 시스템은 이러한 데이터 의존성(Data Dependency) 부재를 기회로 삼아, 독립 패키지 그룹 간의 비동기 동시 빌드(Asynchronous Concurrent Build)를 수행하여 전체 빌드 스루풋(Throughput)을 비약적으로 향상시킨다.
0.1.1 상태 독립성과 워커 스레드의 분리
비동기 동시 빌드의 핵심 전제는 단일 패키지의 컴파일 과정이 워크스페이스 내의 다른 독립 패키지의 컴파일 상태(예: 파일 시스템 변경, 환경 변수 덮어쓰기 등)에 영향을 주거나 받지 않아야 한다는 점이다. 이를 위해 앞서 논의된 Colcon의 build 디렉터리 파티셔닝(Out-of-source Build)이 필수적으로 요구된다.
Colcon 스케줄러는 방향성 비순환 그래프(DAG) 분석을 통해 현재 빌드 가능한(Ready) 상태의 패키지들을 식별한다. 이 패키지들은 상호 독립적이므로, 스케줄러는 준비 큐(Ready Queue)에 등재된 태스크(Task)들을 사용 가능한 여러 워커 스레드(Worker Thread)에 즉시 디스패치(Dispatch)한다. 각 워커 스레드는 할당받은 패키지의 하위 빌더(예: CMake, Python setuptools)를 자식 프로세스(Child Process) 형태로 스폰(Spawn)하며, 이 자식 프로세스들은 운영체제의 선점형 다중 작업(Preemptive Multitasking) 스케줄러에 의해 물리적 혹은 논리적 CPU 코어에 분산되어 시분할(Time-sharing) 또는 병렬(Parallel) 연산을 수행하게 된다.
0.1.2 비동기 이벤트 루프 체계(Asynchronous Event Loop Mechanism)
Colcon 코어 프로세스 자체는 스팬(Spawn)된 수많은 자식 컴파일 프로세스들의 종료를 동기적(Synchronous)으로 블로킹(Blocking)하며 기다리지 않는다. 대신 파이썬의 asyncio 기반 비동기 이벤트 루프를 활용하여 I/O 멀티플렉싱(Multiplexing) 기반의 비블로킹(Non-blocking) 상태 모니터링 체계를 가동한다.
- 파이프(Pipe) 스트림 수집: 개별 워커 스레드에서 실행 중인 컴파일러 프로세스의 표준 출력(stdout) 및 표준 에러(stderr) 파일 디스크립터(File Descriptor)는 코어 스케줄러의 이벤트 루프에 등록된다. 코어 루프는
select또는epoll과 같은 OS 레벨 폴링(Polling) 기법을 사용하여, 데이터 전송이 발생한 프로세스의 출력 스트림만을 비동기적으로 읽어들여 로그 파일에 기록하거나 화면에 출력한다. - 프로세스 완료 인터럽트 처리: 특정 독립 패키지(예: 패키지 A)의 컴파일 자식 프로세스가
Exit 0상태 코드를 반환하며 종료되면, 이 시그널은 이벤트 루프의 퓨처(Future) 또는 태스크 콜백(Callback)을 트리거한다. 스케줄러는 즉시 패키지 A의 상태를 ’완료(Finished)’로 갱신하고, 해당 패키지에 의존하던 후행 패키지들의 DAG 진입 차수(In-degree)를 평가하여 새로운 태스크를 준비 큐로 격상시킨다. 이때 아직 컴파일이 진행 중인 독립 패키지 B, C의 생명주기는 컴파일 프로세서에 의해 어떠한 간섭도 받지 않고 독립적으로 동작을 이어간다.
0.1.3 꼬리 지연시간(Tail Latency) 문제 완화 효과
독립 패키지 간 비동기 동시 빌드 방식은 병렬 시스템 아키텍처에서 고질적으로 발생하는 워커 고갈 현상 및 꼬리 지연시간(Tail Latency) 문제를 지연방어(Mitigation)하는 효과를 지닌다.
순차적 동기 방식(예: 고전적 스크립트 기반 루프)에서는 그룹 내 하나의 패키지만 유독 빌드 시간이 길어질 경우 다른 여유 자원이 대기 상태에 머무는 병목이 발생한다. 반면 프로세스 분리를 기반으로 한 Colcon의 비동기 동시 큐 제어 모델에서는, 무거운(Heavy) 패키지가 1개의 워커 스레드를 장시간 점유하더라도 나머지 잉여 워커 스레드들이 큐에 존재하는 가벼운 패키지들을 지속적으로 팝(Pop)하여 처리하게 되므로 CPU 이용률(Utilization)이 빌드 종료 직전까지 지속적으로 높게 유지된다. 이는 다중 노드 및 마이크로서비스 지향의 로보틱스 생태계 파이프라인에서 빌드-테스트 주기를 최적화하는 데 결정적인 시간 단축 효과를 제공한다.