aboutsummaryrefslogtreecommitdiffstats
path: root/docs
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
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')
-rw-r--r--docs/design/009-layout.md36
-rw-r--r--docs/design/011-pure-transport.md5
2 files changed, 38 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, 점수판 앱,
diff --git a/docs/design/011-pure-transport.md b/docs/design/011-pure-transport.md
index 25a3b66..d50b593 100644
--- a/docs/design/011-pure-transport.md
+++ b/docs/design/011-pure-transport.md
@@ -22,6 +22,11 @@ M5는 [096](../research/096-per-delivery-cpu.md)에 있다. 처음에는 작은
25 % 적고, 61 B에서 1.06–1.12배다. 설계가 적은 송수신 경로(GSO, GRO, 묶어 받기)를 이때 넣었고, 작은 기록을 담는 RECORDS 프레임을
더했다.
+2026-09-29에 링크를 `link/`로 뗐다([009](009-layout.md)). 프로토콜은 이제 소켓, 스레드, 시계가 없는 상태이고
+(`link/link-protocol.h`), UDP와 스레드는 그 위의 층이다. 그래서 한 스레드가 링크 여럿을 들 수 있다. M2를 이 보내는 쪽으로
+다시 돌렸더니 결과가 같았다. 다만 재시작 뒤 가장 늦은 저장이 1초였다. 받았다고 했지만 저장 소식이 없는 기록을 1초 기다리기
+때문이다(흉내 낸 기기는 200 ms마다 다시 보냈다).
+
## 첫 판을 버린 까닭
첫 판(1953051)은 QUIC의 층 몇 개를 Pure가 이미 가진 장치로 대신하는 설계였다. 저장소를 재전송 버퍼로 쓰고, 봉인을 한 번만