diff options
| author | eunhhu <[email protected]> | 2026-09-29 07:23:01 +0100 |
|---|---|---|
| committer | eunhhu <[email protected]> | 2026-09-29 07:23:01 +0100 |
| commit | 9c5471471711d904363de28827417da8836b8431 (patch) | |
| tree | 98ef0d53b9649069d5caeaa271b389c813929647 /docs/design | |
| parent | 5dbf6a536627f9a29f7358c547426218aa6f23c1 (diff) | |
| download | pure-9c5471471711d904363de28827417da8836b8431.tar.gz pure-9c5471471711d904363de28827417da8836b8431.zip | |
Say why the links became a part, and not a repository (009, 011)
Diffstat (limited to 'docs/design')
| -rw-r--r-- | docs/design/009-layout.md | 36 | ||||
| -rw-r--r-- | docs/design/011-pure-transport.md | 5 |
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가 이미 가진 장치로 대신하는 설계였다. 저장소를 재전송 버퍼로 쓰고, 봉인을 한 번만 |
