aboutsummaryrefslogtreecommitdiffstats
path: root/docs/design/009-layout.md
diff options
context:
space:
mode:
authoreunhhu <[email protected]>2026-09-29 07:23:01 +0100
committereunhhu <[email protected]>2026-09-29 07:23:01 +0100
commit9c5471471711d904363de28827417da8836b8431 (patch)
tree98ef0d53b9649069d5caeaa271b389c813929647 /docs/design/009-layout.md
parent5dbf6a536627f9a29f7358c547426218aa6f23c1 (diff)
downloadpure-9c5471471711d904363de28827417da8836b8431.tar.gz
pure-9c5471471711d904363de28827417da8836b8431.zip
Say why the links became a part, and not a repository (009, 011)
Diffstat (limited to 'docs/design/009-layout.md')
-rw-r--r--docs/design/009-layout.md36
1 files changed, 33 insertions, 3 deletions
diff --git a/docs/design/009-layout.md b/docs/design/009-layout.md
index de5563d..3c36194 100644
--- a/docs/design/009-layout.md
+++ b/docs/design/009-layout.md
@@ -29,14 +29,15 @@
|---|---|---|
| `core/` | 실행·소유권·한도·완료(`runtime.c`, `flow.c`), 앱 모델(`module*.c`: 실행 전에 검증한 모듈, 트랜잭션인 이벤트, draft인 상태), 코어가 저장소에 요구하는 것(`state.h`, `store.h`) | `build/libpure.a`(저장소와 함께) |
| `store/` | 트리 저장소. 한 파일, 커밋은 한 연속 쓰기와 동기화 한 번 | `libpure.a` 안 |
-| `serve/` | `pure-serve`: HTTP 호스트, 나가는 전달, 제자리 JSON, 노드 안에서 도는 사람을 위한 표면([010](010-surfaces.md)). OpenSSL을 쓰는 부분(https 수신자로의 TLS, 봉인한 전달)은 따로 두어 쓰는 서버만 매핑한다 | `build/pure-serve`, `build/pure-crypto.so` |
+| `link/` | 연결 없는 링크([011](011-pure-transport.md))와 그것과 봉인한 전달이 쓰는 암호. OpenSSL을 쓰는 부분(https 수신자로의 TLS, 봉인)은 따로 두어 쓰는 프로세스만 매핑한다. 2026-09-29에 `serve/`에서 뗐다(아래) | `build/libpure-link.a`, `build/pure-crypto.so` |
+| `serve/` | `pure-serve`: HTTP 호스트, 나가는 전달, 제자리 JSON, 노드 안에서 도는 사람을 위한 표면([010](010-surfaces.md)) | `build/pure-serve` |
| `cli/` | 명령행 호스트 | `build/pure-run`, `build/pure-edit-module` |
| `prototypes/` | 이전 문서 런타임. `core/`와 `store/`를 가져다 빌드한다 | `make -C prototypes/connections` |
OpenSSL은 pure-serve가 쓰는 것 중 가장 크다. 링크만 해도 아무 일도 하지 않는 프로세스의 상주 메모리가 2.3 MiB 늘고,
-그중 0.66 MiB는 그 프로세스만의 것(재배치한 데이터)이다. 그래서 OpenSSL을 쓰는 코드(`serve/crypto-openssl.c`)는
+그중 0.66 MiB는 그 프로세스만의 것(재배치한 데이터)이다. 그래서 OpenSSL을 쓰는 코드(지금은 `link/crypto-openssl.c`)는
`pure-crypto.so`로 따로 빌드하고, pure-serve는 https 수신자나 봉인을 처음 쓸 때 실행 파일 옆의 그것을 연다
-(`serve/crypto.c`). 쓰지 않는 서버는 유휴 RSS가 4.5 → 2.3 MiB, 자기만의 메모리가 1.3 → 0.86 MiB다. 정적 링크는 RSS가 조금
+(`link/crypto.c`). 쓰지 않는 서버는 유휴 RSS가 4.5 → 2.3 MiB, 자기만의 메모리가 1.3 → 0.86 MiB다. 정적 링크는 RSS가 조금
줄지만(3.8 MiB) 자기만의 메모리가 2.3 MiB로 는다. OpenSSL의 표를 모두 재배치하기 때문이다.
검사도 부품을 따른다. 부품의 단위 검사는 그 옆에(`core/test-module.c`, `store/test-tree-store.c`), 저장소 전체를 끝에서
@@ -65,6 +66,35 @@ GET, 입력이 POST)에는 어휘가 필요 없기 때문이다. 모듈 형식�
`java.net`과 HTTP 서버를 담고 JavaFX를 따로 두는 것과 같은 선이다. `pure-ui`라는 이름은 UI가 런타임의 일부라는 뜻이
되어, 런타임이 화면을 모른다는 분리와 어긋난다.
+## 링크를 부품으로 뗐다
+
+2026-09-29. 연결 없는 전송(011)을 만드는 동안 링크와 암호가 `serve/` 안에 쌓였다. "Vega처럼 레이어로 빼는 것을
+고려했는가"라는 물음에 다시 쟀다.
+
+- **코어와 닿는 곳이 셋뿐이었다.**
+ - 이름으로 입력 찾기, 입력 모양의 해시, 이름 길이 한도다.
+ - 셋 모두 호스트가 넘겨주게 했다. 입력 모양은 코어가 준다(`pure_module_shape`).
+ - `link/`는 이제 코어 헤더 없이 빌드된다. Makefile이 그것을 지킨다.
+- **따로 바뀌었다.** 링크를 바꾼 커밋 12개 가운데 코어를 같이 바꾼 것은 첫 커밋 하나였다.
+- **두 번째 사용자가 숨어 있었다.**
+ - M1·M2의 부하 생성기는 보내는 쪽 프로토콜을 624줄로 따로 구현했다.
+ - 보내는 쪽이 모듈을 요구하고 링크마다 스레드를 띄워서, 한 프로세스에 기기 1만 개를 둘 수 없었기 때문이다.
+ - 실제 기기도 Pure 노드가 아닐 것이다.
+- **층을 둘로 나눴다.**
+ - `link/link-protocol.h`는 소켓, 스레드, 시계가 없는 상태다. 패킷과 시각이 들어가고 패킷이 나온다.
+ - `link/link.h`는 그것을 UDP(GSO, GRO)와 스레드로 나른다.
+ - 부하 생성기의 기기는 이제 진짜 보내는 쪽이다. 1만 개가 한 스레드에 있다.
+ - `link/test-link.c`는 두 쪽을 검사가 만든 네트워크로 잇는다. 가상 시간에서 손실, 재정렬, 중복, 저장 실패, 쉬는 쪽 정리,
+ 양쪽 재시작을 겪고도 모든 기록이 보낸 그대로 한 번 적용되는지 본다.
+- **값.** 전송이 기록 하나에 쓰는 CPU는 나누기 전과 2 % 안에서 같다. 61 B, 1 KiB, 16 KiB에서 번갈아 다섯 라운드씩 쟀다.
+
+git 저장소로는 떼지 않았다. 저장소를 나눈 비용은 경계를 넘는 변경에서만 든다. 경계를 넘은 커밋의 비율은 트리 저장소가 75 %,
+링크가 33 %, Vega가 6 %다.
+
+- Vega는 C 3만 3천 줄 가운데 Pure 헤더를 쓰는 곳이 3개 파일(4.7 %)이다. 따로 두는 편이 싸다.
+- 링크의 전선 형식은 011의 남은 단계(에폭, 경로, 보안, M6)에서 더 바뀐다.
+- 명세를 쓰고 Pure 밖의 구현이 생기면 `git subtree split`으로 그대로 뗀다.
+
## 비용
같은 소스를 옮기기 전(`5239052`)처럼 한 명령으로 빌드한 것과 라이브러리로 링크한 것을 번갈아 쟀다(Pi 5, 점수판 앱,