# 1. 하드웨어 자원 매핑형 병렬 컴파일 아키텍처

대규모 ROS 2 소프트웨어 스택의 빌드 소요 시간(Build Time)을 극적으로 단축하기 위해 Colcon 빌드 시스템은 단일 코어의 순차 처리 한계를 벗어나 멀티코어(Multi-core) 프로세서 및 다중 스레딩(Multi-threading) 환경을 최대한 활용하는 하드웨어 매핑형 병렬 컴파일(Hardware-mapped Parallel Compilation) 아키텍처를 구현하고 있다. 이 아키텍처의 핵심은 운영체제(OS)가 제공하는 논리적 연산 자원을 빌드 파이프라인의 작업 큐(Task Queue)와 효율적으로 맵핑하여 가용성(Availability)과 처리량(Throughput)을 동시에 극대화하는 것이다.

1.1 이중 계층(Dual-layer) 병렬화 모델

Colcon의 병렬 컴파일은 단일 차원의 확장이 아니라 ’패키지 간 병렬성(Inter-package Parallelism)’과 ’패키지 내 병렬성(Intra-package Parallelism)’이라는 이중 계층 모델 위에서 작동한다. 두 계층은 서로 다른 단위의 스케줄링 정책을 따른다.

1.1.1 패키지 간 병렬성 (Inter-package Parallelism)

패키지 간 병렬성은 앞서 기술된 방향성 비순환 그래프(DAG) 스케줄링을 통해 구현된다. DAG 모델 상에서 동일한 위상 레벨(Topological Level)에 위치하며 상호 간에 의존성이 없는 패키지 노드들은 Colcon의 코어 실행기(Executor)에 의해 병렬로 분배된다.

  • 익스트리밍 워커 풀(Streaming Worker Pool): Colcon은 파이썬의 표준 concurrent.futures 혹은 asyncio 라이브러리를 활용하여 런타임에 워커 스레드 풀(Worker Thread Pool)을 생성한다. 이 스레드 풀의 크기(Size)는 기본적으로 호스트 시스템의 CPU 논리 코어(Logical Core) 수식으로 매핑되거나 빌드 인자(예: --executor-config)를 통해 수학적으로 상한(Upper bound)이 설정된다.
  • 프로세스 격리(Process Isolation): 태스크 큐에 진입한 서로 다른 패키지의 빌드 잡(Job)들은 독립된 하위 스레드 또는 하위 프로세스에 매핑되어 실행된다. 이는 패키지 A의 빌드가 지연되더라도, 의존성이 없는 패키지 B, C의 빌드가 유휴(Idle) 코어에서 지속되도록 보장한다.

1.1.2 패키지 내 병렬성 (Intra-package Parallelism)

단일 패키지가 워커 스레드에 할당되어 컴파일러 프로세스(예: make, ninja)가 트리거(Trigger)될 때, 해당 패키지를 구성하는 다수의 소스 파일(예: 수십 개의 .cpp 파일) 자체를 병렬로 컴파일하는 메커니즘이 패키지 내 병렬성이다.

  • 하위 빌더 인자 주입: Colcon은 실행 시 하위 빌드 시스템(CMake 등)으로 병렬 실행 플래그(예: make -jN, cmake --build . -jN)를 투명하게 주입(Injection)한다.
  • 컴필레이션 유닛(Compilation Unit) 분배: 컴파일러는 패키지 내의 개별 소스 코드 파일(번역 단위, Translation Unit)을 분할하여 병렬로 목적 파일(Object file, .o)로 컴파일하고, 마지막 단계에서 링커(Linker)를 통해 단일 공유 라이브러리(.so) 혹은 실행 바이너리로 병합한다.

1.2 로드 밸런싱(Load Balancing)과 자원 스래싱(Resource Thrashing) 방지

이중 계층 병렬화는 극도의 성능 향상을 제공하지만, 동시에 수많은 패키지가 각각 N개의 컴파일러 스레드를 생성할 경우 전체 활성화된 스레드 수가 기하급수적으로 폭증하는 문제를 안고 있다. (예: 10코어 시스템에서 Colcon 워커가 10개로 분배되고, 각 워커가 다시 -j10을 수행하면 일순간 100개의 컴파일 작업을 시도하게 된다.)
이 상태는 물리적 코어 수를 초과하는 대규모 컨텍스트 스위칭(Context Switching) 오버헤드와 가용 메모리(RAM) 고갈을 야기하며, 결국 디스크 스왑(Swap) 영역을 침범하는 시스템 스래싱(Thrashing) 상태로 귀결될 수 있다.

이를 방지하기 위해 최신 Colcon 아키텍처 및 하위 빌드 도구들은 잡 컨트롤(Job Control) 메커니즘을 지원한다.

  • Ninja 프로토콜의 활용: CMake의 생성기(Generator)로 Ninja를 사용할 경우, 중앙 집중화된 잡 토큰 서버(Job Token Server)를 통해 시스템 전체의 병렬 컴파일 횟수를 동적으로 조절한다.
  • CPU 아피니티(CPU Affinity) 및 로드 평균(Load Average): 시스템의 로드 평균(loadavg)을 지속적으로 샘플링하여, 임계치(Threshold)를 초과할 경우 일시적으로 워커 스레드의 활성화를 지연시키는 적응형 밸런싱(Adaptive Balancing) 기법이 활용된다.

결과적으로 Colcon의 하드웨어 매핑형 병렬 아키텍처는 가상의 DAG 모델을 물리적 하드웨어의 파이프라인으로 매끄럽게 연결하고 제어하는, 분산 컴파일 시스템의 핵심 중추 역할을 담당한다.