rokdocs
v0.1

7. 런타임 개요

본 블록은 rok 런타임 시스템 (GC, 작업 스케줄러, 코루틴) 의 구현 사양을 정의합니다. 이 시스템은 실행 엔진과 사용자 표면 의 두 엔진 (JIT / AOT) 양쪽에서 동일하게 작동합니다.

목차

본 장의 세부 절은 다음과 같이 구성됩니다.

핵심 결정

런타임의 핵심 구성 요소에 대한 결정은 다음과 같이 요약됩니다.

GC          자체 Immix + Sticky Mark-Bit 세대
Scheduler   M:N work-stealing
Coroutine   컴파일러가 만든 상태 기계 (stackless)

세 부분 모두 자체 구현이며, 외부 라이브러리에 대한 의존은 0 입니다.

의존성 0 원칙

런타임은 외부 라이브러리에 의존하지 않습니다. 구체적으로 다음과 같은 외부 구성 요소를 사용하지 않습니다.

  • 외부 GC 라이브러리 (Boehm GC, MMTk 등) 를 사용하지 않습니다.
  • 외부 비동기 런타임을 사용하지 않습니다.
  • 외부 코루틴 라이브러리를 사용하지 않습니다.

다만 플랫폼 시스템 인터페이스 (libc, OS 헤더 등) 는 의존성으로 치지 않습니다. 이는 OS 인터페이스의 필수 부분이기 때문입니다.

M:N 모델

스케줄러는 M:N 하이브리드 방식을 따릅니다.

OS Thread (worker) x N  ──── rok task / coroutine x M
                                   (typically M >> N)

이 모델의 운용 방식은 다음과 같습니다. 기본 N 은 CPU 코어 수이며, 런타임 설정으로 조정할 수 있습니다. 또한 한 OS thread 가 여러 역할을 동시에 수행하는데, 그 역할은 Scheduler Worker, Mutator, I/O Driver, GC Worker 입니다. 다만 I/O driver 는 현재 별도의 reactor thread 하나가 맡습니다 (7.7).

이러한 통합으로 추가 thread 분리 비용 없이 모든 런타임 활동이 한 스레드 풀에서 처리됩니다.

단일 .a 산출물

런타임은 단일 staticlib librokr.a 한 개로 배포됩니다. 사용자 패키지를 빌드하면 librokr.a 가 링크되어 추가 외부 의존 없이 실행 가능한 바이너리가 나옵니다.

런타임 오류: 스택 오버플로

스레드의 스택이 넘치면 런타임은 stdout 을 (가능하면) flush 하고 stderr 에 다음을 출력한 뒤 abort (SIGABRT) 합니다. panic 과 달리 unwind 나 finally 실행은 없습니다.

thread '<name>' has overflowed its stack

<name> 은 그 스레드의 이름입니다. thread::Builder::name (stdlib 3.4) 으로 준 이름이며, 그 이름은 OS 스레드 이름으로도 설정됩니다. main 스레드는 main, 이름이 없는 스레드는 <unnamed> 입니다. main 스레드, thread::spawn 스레드, executor worker (깊은 await 사슬 포함) 가 모두 대상입니다. 검출 방식 (guard 범위와 sigaltstack) 과 TLS 슬롯은 8.5.7 에 있습니다. wasm 에서는 모듈이 trap 을 잡을 수 없으며 host 가 보고합니다 (함께 제공되는 JS host 는 위 메시지를 출력).

컴파일러와의 인터페이스

런타임은 컴파일러가 생성한 코드와 정해진 ABI 로 통신합니다. 인터페이스는 다음 세 가지 요소로 구성됩니다.

  • 객체 레이아웃 (16 바이트 헤더 + payload) 입니다.
  • extern "C" 함수로는 rok_gc_alloc_slow, rok_runtime_yield, rok_thread_spawn 등이 있습니다.
  • 코루틴은 컴파일러가 만든 상태 기계이며 llvm.coro.* 를 쓰지 않습니다 (7.8). GC 루트는 intrinsic 없이 컴파일러가 shadow stack frame 을 직접 emit 합니다 (7.4.1).

이 ABI 는 8. 런타임 ABI / MLIR lowering 에서 자세히 정의되며, 본 7 장은 내부 동작만을 다룹니다.

GitHub에서 이 페이지 고치기