## 0.1 패키지 수준 병렬화와 컴파일 단위 병렬화 간 이중 가속 논리 구조
대규모 사이버-물리 시스템(CPS)의 소프트웨어를 빌드할 때, 전체 빌드 수행 시간의 최소화를 달성하기 위해서는 단순히 시스템의 코어 자원을 점유하는 것을 넘어 병렬 처리의 차원(Dimension)을 분리하여 관리해야 한다. Colcon은 최상위 계층의 메타 빌더(Meta-builder)로서 패키지들을 스케줄링하는 ’패키지 수준 병렬화(Inter-package Parallelism)’를 관장하고, 하위 빌드 도구인 CMake 및 Make/Ninja는 단일 패키지 내부의 개별 소스 코드 번역을 담당하는 ’컴파일 단위 병렬화(Intra-package Parallelism)’를 책임지는 이중 논리 구조(Dual-tier Parallelism Architecture)를 형성한다. 이 두 계층 간의 상호작용은 가속 논리의 핵심이다.
0.1.1 직교적(Orthogonal) 동시성 제어 아키텍처
Colcon의 이중 가속 논리는 두 가지 스케줄링 메커니즘이 완전히 다른 추상화 계층에서 직교적(Orthogonal)으로 작동한다는 점에 기반한다.
- 거시적 제어(Macro-control): Colcon 코어는 독립된 전체 패키지들의 DAG 정점(Vertex)을 기반으로 스케줄링하므로, 각 패키지가 내부적으로 C++로 작성되었는지, 순수 파이썬(Pure Python)으로 작성되었는지와 관계없이 동일한 워커 스레드 자원을 배분한다. 이는 패키지 간의 거시적 빌드 생명주기를 오버래핑(Overlapping)하여 시간 절약을 도모하는 것이다. (
--executor-config또는MAKEFLAGS=-j계열의 스레드 설정이 관여함) - 미시적 제어(Micro-control):
colcon-cmake익스텐션을 통해 제어권이 CMake 및 Make/Ninja 구동기로 이양되면, 이 하위 빌드 시스템은 패키지 루트 디렉터리 내에 존재하는 수십 개의.cpp파일들을 개별적인 번역 단위(Translation Unit)로 취급한다. 각 소스 파일은 각각의 목적 파일(.o)로 병렬 컴파일되며, 이 미시적 제어는 다시 호스트 시스템의 여유 CPU 자원을 파고들어 최대한의 컴파일 파이프라인(Instruction Pipeline) 효율을 이끌어낸다.
0.1.2 곱셉(Multiplicative) 효과와 리소스 스래싱 임계점
이 이중 가속 구조의 본질은 동시성 인자가 덧셈이 아닌 곱셈(Multiplication)으로 폭증(Explosion)할 수 있다는 점에 있다. 예를 들어, Colcon 스케줄러가 N개의 패키지 빌드 잡(Job)을 생성하고, 하위 메이크(make) 파일이 M개의 병렬 작업을 허용하도록 인자(-j$M$)를 전달받았다면, 이론적으로 활성화되는 최대 컴파일러 프로세스 수는 N \times M 개에 달하게 된다.
- 극대화 구간(Maximum Speed-up Phase): 시스템의 물리·논리 코어 수 C가 충분히 크고 메모리 대역폭이 여유로울 때 (N \times M \le C), 이중 가속 시스템은 단일 패키지 내부뿐만 아니라 패키지 간 빌드 시간의 격차(Tail latency)를 상호 보완하며 이상적인 선형 가속비(Linear Speedup)에 근접한다.
- 포화 및 스래싱 구간(Saturation and Thrashing Phase): 반면, N \times M \gg C 인 상황이 도래하면 CPU의 컨텍스트 스위칭(Context Switching) 오버헤드가 극도로 증가하며, 수많은 컴파일러 인스턴스(GCC, Clang 등)가 메인 메모리(RAM)를 고갈시켜 운영체제의 OOM(Out Of Memory) 킬러 작동이나 디스크 스와핑(Swapping)을 유발하는 병목 지점에 도달한다.
0.1.3 글로벌 로드 밸런싱(Global Load Balancing) 최적화 전략
이중 가속의 충돌 및 포화 에러를 방지하기 위하여, 최신 빌드 파이프라인 아키텍처에서는 Ninja 빌더를 활용한 글로벌 로드 제어(Global Load Control) 패턴이 가장 권장되는 학제적 표준이다. Colcon과 CMake 기반 워크스페이스를 연동할 때 CMake 생성기(Generator)로 Ninja를 채택하고 통합된 잡 풀(Job Pool, Ninja Jobserver)을 활성화하면, 패키지 단위의 분리벽을 허물고 전역적인 수준에서 동작 중인 전체 컴파일러 태스크 개수를 논리 코어 수치(예: -j$C$) 이하로 엄격하게 통제할 수 있다.
이는 이중 가속 구조의 유연성을 훼손하지 않으면서도 상하위 계층 간의 리소스 경합을 원천적으로 차단하는 가장 우아한(Elegant) 메커니즘으로 평가받으며 대규모 ROS 2 시스템 통합 환경(CI/CD Pipeline)에서 필수적으로 구성되는 최적화 기법이다.