24.4.2 순차 빌드 옵션 기반 스케줄링 시점 메모리 자원 병행 제약 강제성
ROS2 메타 빌드 시스템 프레임워크인 Colcon에서 시스템 메모리 포화(OOM, Out of Memory) 현상을 원천적으로 회피하기 위해 동원할 수 있는 스케줄링 제약자(Scheduling Constraint) 중 하나인 순차 빌드 처리 제어 원리와 적용 방식에 대해 기술한다.
제한된 물리 RAM 자원을 보유한 단일 보드 컴퓨터(SBC, Single Board Computer) 또는 소형 폼팩터의 엣지 임베디드 디바이스(Edge Embedded Device) 환경에서는 방향성 비순환 그래프(DAG, Directed Acyclic Graph) 기반의 기본 병렬 작업 스케줄링이 허용하는 다중 패키지의 동시 컴파일 행위가 시스템의 가용 물리 메모리 도메인을 즉각적으로 이탈시키는 주원인이 된다. Colcon 메타 빌드 시스템은 이러한 가혹 조건(Harsh Condition) 하에서 빌드 파이프라인의 생존성과 무결성을 동시 보장하기 위해, 기본 고수준 병렬 익스큐터(Parallel Executor)를 무효화(Override)하고 작업 큐(Job Queue)를 단일 스레드 형태의 파이프라인으로 직렬화하는 순차 기반 명령줄 옵션을 제공한다.
1. 메타 빌드 시스템의 스케줄러 계층 구조 및 순차 실행(Sequential Execution) 메커니즘
Colcon 아키텍처의 평가 엔진은 의존성 해결(Dependency Resolution) 파싱 단계 이후 확정된 개별 패키지 빌드 노드 작업을 익스큐터(Executor) 객체로 위임하여 처리하는 패러다임을 갖춘다. 기본 빌드 익스큐터 모듈인 colcon-core.executor.parallel은 의존성 그래프 상 충돌이 존재하지 않는 독립적 노드 집합을 스레드 풀(Thread Pool)에 일괄 할당(Dispatch)하여 작업의 동시성을 극대화한다.
반면, --executor sequential 명령줄 옵션을 주입할 경우, 프레임워크 메인 루틴은 내부 스케줄링 전략을 colcon-core.executor.sequential 클래스 알고리즘으로 동적 대체한다. 순차 익스큐터는 식별된 전체 패키지 빌드 노드들을 위상 정렬(Topological Sorting)된 우선순위 큐(Priority Queue)에 일차원적으로 도열시킨 후, 동시간에 오직 단일한 패키지에 대해서만 하위 트리의 빌드 프로세스(예: CMake 계층 또는 Setuptools 계층)를 역위임하여 호출(Invoke)한다.
이러한 직렬화 메커니즘을 전역적으로 강제할 경우 커널 시스템이 특정 시점에 감당해야 하는 컴파일 메모리 점유 모델은 다중 스레드의 합산치인 \sum M_{package}가 아니라 집합 내 최댓값인 \max(M_{package_i})로 억제 및 고정된다. 요컨대 다중 패키지 상호 작용에 의한 병렬 오버헤드가 단일 차원으로 붕괴하므로, 개발 워크스페이스(Workspace) 내에서 제일 방대한 빌드 메모리를 요구하는 단일 패키지만을 정상적으로 컴파일러에 적재할 수 있는 베이스라인 시스템 메모리 한도만 제공된다면 전체 노드의 빌드 성공 완수가 수학적으로 담보되는 구조적 안정성을 획득한다.
2. 플래그 연계 및 제어 방법론 모델링
해당 제약 메커니즘은 빌드 유틸리티 명령어 실행 시점에 CLI 플래그 입력을 통하여 호스트 커널 공간(Kernel Space)이 아닌 Colcon 스케줄러 사용자 영역(User-space)의 런타임 제어 알고리즘을 명시적으로 확정 짓는다. 커맨드라인 상 적용 기준 형태는 아래와 동일하다.
colcon build --executor sequential
선언된 플래그는 워크스페이스에 편입된 모든 타겟 패키지를 전수 검사 대상으로 하여, 빌드 페이즈 진행 시 한 번에 오직 하나의 패키지 빌드 워킹 디렉토리 영역만 독점 접근이 가능하도록 강한 동기화(Synchronization) 제약을 강제 주입한다. 이 접근법은 전체 시스템 파이프라인 측면에서 패키지 A에 대한 colcon_build 서브루틴 동작이 완전하게 성공적 반환(Exit Code 0 도출) 조치되고, 해당 컴파일 파생 메모리 덤프가 리눅스 커널에 의해 온전히 회수(Garbage Collected / Memory Free)된 이후 단계에 진입해서야 차순위 패키지 B의 빌드 스케줄이 비로소 활성화되는 절대적 격리 상태를 의미한다.
3. 시스템 자원 생존성 대기 처리 성능 지연의 상충성(Trade-off) 검토
명시적으로 순차 빌드 익스큐터를 스케줄러 단에 강제 고정시키는 방식은 다중 패키지 병행 처리가 유발하는 메모리 충돌 증폭 현상을 시스템 레벨에서 원천 차단하는 가장 확정적(Deterministic)이고 직관적인 기술적 수단이다.
그러나 본 옵션은 메타 스케줄링 계층의 단위 관점에서 오로지 패키지(Package) 간의 직렬화(Serialization)만을 거시적으로 보장할 따름이다. 즉 하부 계층 트리의 빌드 생성기(Generator) 시스템(CMake와 직접 통신하는 하위 GNU Make 또는 Ninja 등)이 보유한 컴파일러의 내부 미시 다중 스레드 제어권까지를 Colcon 메타 빌드 엔진이 직접 탈취하지는 못한다(내부 코어 단위 병렬화 제어는 MAKEFLAGS를 별도로 따라간다).
결과적으로 --executor sequential 방식의 단독 구동 모드는 대상 시스템이 자체 구비한 멀티 코어 논리 유휴 자원(Idle Resources)을 상당 부분 대기 상태로 사장시키는 맹점을 낳는다. 이에 의해 총 빌드 수행 소요 시간(Total Build Duration Time)이 처리해야 할 패키지의 누적수에 완벽히 정비례하여 급속도로 지연되는 치명적 시간 페널티(Time Penalty) 팩터를 고스란히 감수하여야 한다.
결론적으로, 이 통제 구조는 시스템 메모리의 순간 허용 임계 여유 도메인이 소진된 한계 인프라 구조 하에서 프레임워크 개발자가 전략적으로 개입함으로써 필수불가결한 시스템 안정성 한계 도메인을 강제로 확보해 내는 가장 보수적이고 안정 편향적인 방어 기제로 평가된다.
출처 및 버전 정보
- ROS2 Colcon Core Framework Official Build Executor Architecture Documentation (Version: Humble / Jazzy)
- CMake Build Generator Scheduling Internals