aboutsummaryrefslogtreecommitdiffstats
path: root/docs/research/045-owner-thread-async-effects.md
diff options
context:
space:
mode:
Diffstat (limited to 'docs/research/045-owner-thread-async-effects.md')
-rw-r--r--docs/research/045-owner-thread-async-effects.md51
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)에서 확인했다. 인증 피어와 동등 서버의
+지연 비교는 남아 있다.