## 0.1 컴포넌트 간 빌드 선행 조건 트리에 따른 순차적 작업 큐 제어 모델
위상 정렬을 통해 방향성 비순환 그래프(DAG)가 의존성 계층별로 그룹화되면, Colcon 코어 스케줄러는 이를 기반으로 실제 컴파일러 프로세스들을 구동하고 생명주기(Lifecycle)를 관리하는 ’순차적 작업 큐 제어 모델(Sequential Task Queue Control Model)’을 가동한다. 이 모델의 핵심은 가용한 컴퓨팅 자원 내에서 최대한 많은 빌드 작업을 병렬로 처리하되, 개별 컴포넌트(패키지) 간에 설정된 아키텍처적 선행 조건(Preconditions) 트리 구조를 엄격하게 만족시키는 것이다.
0.1.1 비동기 이벤트 루프 기반의 큐 스케줄링
Colcon 스케줄러는 멀티스레딩(Multi-threading) 환경 하에서 비동기 이벤트 루프(Asynchronous Event Loop) 엔진인 asyncio 모듈 형태의 코어를 활용하여 큐잉 시스템(Queuing System)을 구현한다. 모델의 논리적 실행 단계는 다음과 같다.
- 작업 인스턴스화: 정규화된 DAG 모델 내의 각 패키지 노드는 개별적인
Task객체로 인스턴스화된다. 이 객체에는 해당 패키지를 처리할 구체적인 익스텐션(예:colcon-cmake,colcon-ros)의 콘텍스트와 의존성 상태 플래그가 포함된다. - 준비 큐(Ready Queue) 승격: 진입 차수(In-degree)가 0인 노드, 즉 선행 패키지 빌드가 전혀 필요 없거나 모두 성공적으로 완료되어 빌드 대기 상태로 전환 가능한
Task들은 즉시 ’준비 큐’로 승격(Promotion)된다.
0.1.2 워커 풀(Worker Pool)과 동시성 제어 메커니즘
준비 큐에 다수의 태스크가 대기하고 있을 때, Colcon은 시스템 하드웨어의 병렬 처리 능력을 바탕으로 워커 풀(Worker Pool)을 구성하여 이 태스크들을 스레드 혹은 프로세스 자원에 매핑한다.
이때 시스템은 무분별한 리소스 경합(Resource Contention)을 방지하기 위하여, 코어 프로세서의 수식에 따른 상한선(Max Concurrent Workers) 모델을 사용한다. 만일 준비 큐에 존재하는 패키지의 수가 가용 Executor의 수보다 많다면 초과된 패키지는 큐에서 대기 상태(Pending)를 유지하며, 기존 작업이 완료되어 워커 스레드가 반환될 때 선입선출(FIFO, First-In-First-Out) 혹은 지정된 우선순위(Priority) 정책에 따라 순차적으로 워커에 편입된다.
0.1.3 콜백 기반의 상태 전이 및 데드락(Deadlock) 방지
개별 패키지의 빌드 태스크가 완료(성공 또는 실패)되면, 워커 스레드는 코어 스케줄러에 비동기 콜백(Callback) 형태의 시그널을 전송한다. 스케줄러는 이 시그널을 수신한 직후 다음의 상태 전이 절차를 밟는다.
- 성공(Success) 시: 해당 패키지를 의존성으로 삼고 있던 자식 노드(Child Nodes) 측의 DAG 진입 차수(In-degree)를 1 감소시킨다. 만일 감소 결과 특정 자식 노드의 진입 차수가 0이 되었다면, 해당 태스크는 즉각적으로 준비 큐에 승격된다. 이는 마치 트리 구조의 상부에서 하위 가지(Branch)로 통제 권한이 순차적으로 해제(Unlock)되어 전파되는 양상과 일치한다.
- 실패(Failure) 및 이상 종료 시: 스케줄러는 해당 패키지의 수행 상태를 ’에러(Error)’로 마킹한다. DAG 모델의 특성상 하나의 코어 패키지가 빌드에 실패하면, 이를 의존하는 모든 하위 계층의 패키지 역시 근본적으로 컴파일이 불가능하다. 스케줄러는 빌드 실패 노드로부터 파생되는 서브 트리(Sub-tree) 노드들을 전부 스킵(Skip) 혹은 중단(Abort) 상태로 폐기 처리하여 무의미한 연산 자원의 낭비를 방지한다.
이러한 선행 조건 트리에 입각한 콜백 기반 큐 구조는 매우 거대한 마이크로서비스 아키텍처(MSA) 수준의 다중 패키지 로보틱스 시스템에 대해서도 데드락 없는 병렬 연산을 보장하며, 개발자에게는 결정론적(Deterministic)이고 직관적인 빌드 생명주기 제어 인터페이스를 제공한다.