diff options
| author | eunhhu <[email protected]> | 2026-09-24 17:14:54 +0100 |
|---|---|---|
| committer | eunhhu <[email protected]> | 2026-09-24 17:14:54 +0100 |
| commit | b1ce1927022d374198441afafeb27199fc8a052a (patch) | |
| tree | 6021f175f4c67ed03b44240eaa2f90d846f12f6f /docs/research/045-owner-thread-async-effects.md | |
| parent | d34f9426d5317a1948f12f229439946728bc342a (diff) | |
| download | pure-b1ce1927022d374198441afafeb27199fc8a052a.tar.gz pure-b1ce1927022d374198441afafeb27199fc8a052a.zip | |
Establish native micro runtime checkpoint
Diffstat (limited to 'docs/research/045-owner-thread-async-effects.md')
| -rw-r--r-- | docs/research/045-owner-thread-async-effects.md | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/docs/research/045-owner-thread-async-effects.md b/docs/research/045-owner-thread-async-effects.md new file mode 100644 index 0000000..f866f5f --- /dev/null +++ b/docs/research/045-owner-thread-async-effects.md @@ -0,0 +1,51 @@ +# 045 — 코어가 효과의 완료를 기다리지 않는 선택형 경로 + +현재 문서 서비스의 `pure_runtime_step()`은 저장소 호스트 콜백이 반환할 때까지 +실행 영역을 붙잡는다. 큰 저장 작업이나 원격 효과가 생기면 요청 슬롯의 수명· +본문 예산을 유지하면서 다른 작업을 진행할 길이 필요하다. 이 단계에서는 +**선택형 비동기 효과 계약**을 실행 코어에 붙였다. 기본 CLI·HTTP·TUI는 기존 +동기 경로를 그대로 링크한다. + +`PURE_ASYNC_EFFECTS` 빌드에서 `pure_runtime_take()`는 준비된 READ·WRITE·SPLICE +효과와 세대가 있는 티켓을 호스트에 넘긴다. 효과에는 저장 키, 조건부 버전, +선택된 본문, 읽기 범위와 가용 예산이 포함된다. 호스트가 파일·네트워크 작업을 +마친 후 **소유 스레드에서** `pure_runtime_complete()`를 호출한다. 완료 순서는 +자유지만 저장 효과의 버전 조건은 여전히 해당 호스트에서 원자적으로 검사한다. +준비 중 범위가 유효하지 않은 입력은 호스트에 전달하기 전에 완료된다. + +호출자가 진행 중 티켓을 놓아도 입력은 작업이 완료될 때까지 남는다. 읽기 본문을 +다른 영역으로 전달하면 소비자가 완료·해제될 때까지 원본 매핑을 유지한다. +동시에 여러 READ가 완료되면 **완료 시점의 남은 예산**으로 다시 검사한다. +예산을 넘은 결과는 소비자에게 공개하지 않고 호스트 자원을 회수한다. 호스트가 +잘못된 소유 자원을 넘긴 완료 호출은 거절하고 자원과 작업을 그대로 둔다. + +[실제 저장소 검사](../../prototypes/connections/test-async.c)는 대기 중인 파일 쓰기의 +티켓을 먼저 놓고, 다른 문서를 먼저 저장한 뒤 첫 작업을 완료한다. 종료 요청 +중에는 재시작을 막고, 마지막 완료 후에만 허용한다. 저장된 값의 READ→다른 +영역 WRITE도 같은 매핑을 복사 없이 전달한다. 추가로 기존 +[`editor.pure`](../../prototypes/connections/examples/editor.pure)의 SPLICE 생성·추가· +낡은 버전 충돌·GET을 이 경로로 실행한다. 이 검사는 실제 파일과 한 작업자 +스레드를 사용하지만 HTTP 처리량을 측정하는 실험은 아니다. + +| 선택한 범위 | `text` | 영역 기록 | 작업 슬롯 | 효과 값 | +|---|---:|---:|---:|---:| +| 기본 실행 코어 | 5,932 B | 200 B | 224 B | 없음 | +| 비동기 완료 선택 코어 | 7,312 B | 200 B | 224 B | 호출자 저장 공간 128 B | + +[기본 코어 원자료](../../prototypes/connections/results/2026-09-24-async-effects/default-core.json), +[선택 코어 원자료](../../prototypes/connections/results/2026-09-24-async-effects/async-core.json). +두 아카이브 모두 파서·저장소·소켓·스레드 라이브러리를 포함하지 않는다. +선택 코어 증가량은 1,380 B이며 인스턴스·슬롯 반복 메모리는 증가하지 않았다. +실제 작업자 스택, 저장소, 호스트의 완료 큐는 이 수치에 **포함되지 않는다**. +[`make check-async`](../../prototypes/connections/Makefile)와 +[ASan·UBSan 실행](../../prototypes/connections/results/2026-09-24-async-effects/sanitized.json), +기존 `make check-release`가 통과했다. 검사 환경의 ptrace 제약 때문에 +LeakSanitizer는 껐다. + +이것은 **비동기 호스트를 위한 수명·완료 원시 기능**이다. 기본 HTTP·TLS 피어는 +동기 효과를 호출하며, 선택형 HTTP 호스트의 실제 연결은 [046](046-optional-async-document-http.md)에 기록했다. 시작한 효과의 취소도 호스트가 I/O 중단을 확인한 뒤 +완료로 돌려줘야 하며, 코어가 강제로 외부 효과를 되감지 않는다. 같은 저장 키의 +순서가 필요한 호스트는 키별 큐나 조건부 버전으로 이를 보장해야 한다. 실제 +HTTP 호스트의 완료 신호·연결 종료·기한·프로세스 종료와 **전체 앱** 메모리는 +[046](046-optional-async-document-http.md)에서 확인했다. 인증 피어와 동등 서버의 +지연 비교는 남아 있다. |
