시스템 강제 결정론적 병렬 처리의 효율적 구현

시스템 강제 결정론적 병렬 처리의 효율적 구현
안내: 본 포스트의 한글 요약 및 분석 리포트는 AI 기술을 통해 자동 생성되었습니다. 정보의 정확성을 위해 하단의 [원본 논문 뷰어] 또는 ArXiv 원문을 반드시 참조하시기 바랍니다.

초록

Deterministic 실행을 시스템 차원에서 강제하는 OS인 Determinator를 소개한다. 커널은 단일 스레드 “공유‑없음” 주소 공간만 제공하고, Put/Get/Ret 세 가지 시스템 콜로 공간 간 동기화·통신을 수행한다. 사용자 레벨 런타임이 파일 시스템, 공유 메모리, POSIX‑유사 프로세스 등을 에뮬레이션해 기존 프로그램이 동작하도록 하며, 거친 입출력·시간 접근을 I/O로 제한한다. 실험 결과, 거친 입출력·시간 의존성이 적은 코스‑그레인 병렬 어플리케이션은 기존 비결정론 시스템과 비슷한 성능·확장성을 보였지만, 미세한 동기화가 빈번한 어플리케이션에서는 큰 오버헤드가 발생한다.

상세 분석

Determininator는 “결정론적 병렬성”을 운영체제 수준에서 보장하기 위해 기존 OS가 제공하는 전역 공유 자원을 완전히 배제한다는 급진적 설계를 취한다. 핵심 설계 원칙은 (1) 동기화 지점 사이에 작업 상태를 완전히 격리하고, (2) 전역 이름 대신 애플리케이션이 직접 선택한 로컬 이름을 사용해 주소 공간 할당·프로세스 ID 부여를 결정론적으로 만든다. (3) 모든 동기화는 명시적 대상과 시점을 지정하도록 강제해, “첫 번째 도착” 같은 비결정적 이벤트를 차단한다. (4) 실시간 시계와 같은 비결정적 입력은 I/O 장치로 취급해 접근을 제어하고, (5) 스케줄링 로직을 애플리케이션 로직과 분리한다.

커널은 “space”라는 단일 스레드 실행 단위만 제공한다. 각 space는 자체 레지스터와 가상 메모리를 보유하며, 부모‑자식 관계만 허용한다. 세 가지 시스템 콜인 Put, Get, Ret을 통해 부모와 자식 사이에 레지스터·메모리 복사, 스냅샷, 병합, 권한 설정 등을 수행한다. Put은 자식 생성·초기화·시작을 한 번에 처리하고, Get은 자식이 Ret으로 종료될 때까지 블록한 뒤 메모리 변화를 병합하거나 복사한다. 이러한 “렌더즈부” 방식은 Kahn 프로세스 네트워크와 동등하게 모델링될 수 있어, 모든 동기화가 일대일 채널을 통해 이루어짐을 보장한다. 따라서 실행 순서가 어떠하든 동일한 입력에 대해 동일한 출력이 생성된다.

사용자 레벨 런타임은 파일 복제·버전 관리, 분산 공유 메모리, 결정론적 스케줄러 등을 구현해 POSIX‑유사 인터페이스를 제공한다. 파일 시스템은 복제된 디스크 이미지에 로그를 남겨 일관성을 유지하고, 공유 메모리는 페이지 단위 복사‑쓰기(COW)와 Merge를 이용해 “가상 공유”를 만든다. 스레드 라이브러리는 Determinator의 스케줄링 원칙에 맞춰 작업 큐를 가상 시간 단위로 나누어 실행한다.

성능 평가에서는 코스‑그레인 벤치마크(예: 파라렐 빌드, 행렬 곱)에서 기존 Linux와 비슷하거나 약간 우수한 스루풋을 보였으며, 클러스터 환경에서도 투명하게 작업을 분산시킬 수 있었다. 반면, 미세한 락·세마포어 사용이 잦은 미세‑그레인 어플리케이션에서는 페이지 복제·병합 비용이 크게 늘어나 성능 저하가 관찰되었다. 또한 현재 구현은 루트 space가 I/O 병목이 되며, 영구 저장소 부재·공간 계층 제한 등 실용성에 제약이 있다.

결론적으로 Determinator는 시스템 차원의 결정론을 구현하기 위한 설계 원칙과 최소화된 커널 API를 제시하고, 사용자 레벨에서 기존 프로그래밍 모델을 재현함으로써 “정상적인 경우”에 충분히 실용적인 성능을 달성한다는 점에서 의미가 크다. 향후 연구는 기존 OS에 결정론적 샌드박스를 삽입하거나, I/O·스토리지 지원을 강화해 실제 배포 가능성을 높이는 방향으로 진행될 수 있다.


댓글 및 학술 토론

Loading comments...

의견 남기기