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/028-shared-fixed-program.md | |
| parent | d34f9426d5317a1948f12f229439946728bc342a (diff) | |
| download | pure-b1ce1927022d374198441afafeb27199fc8a052a.tar.gz pure-b1ce1927022d374198441afafeb27199fc8a052a.zip | |
Establish native micro runtime checkpoint
Diffstat (limited to 'docs/research/028-shared-fixed-program.md')
| -rw-r--r-- | docs/research/028-shared-fixed-program.md | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/docs/research/028-shared-fixed-program.md b/docs/research/028-shared-fixed-program.md new file mode 100644 index 0000000..3c48e97 --- /dev/null +++ b/docs/research/028-shared-fixed-program.md @@ -0,0 +1,79 @@ +# 028 — 고정 네이티브 앱의 불변 프로그램 공유 + +2026-09-24. Linux AArch64, Zig 0.15.2, GCC 14.2. 첫 공개 체크포인트의 중간 결과다. +마이크로 런타임의 기본 비용을 지키기 위해, **같은 정의로 실행하는 독립 인스턴스의 반복 +메모리에서 프로그램·교체 공간·선택형 캐시를 제거했다.** 코어의 기능이나 의존성을 늘리지 않았다. + +## 구조와 경계 + +[027의 고정 용량 빌드](027-fixed-native-capacity.md)는 최대 예약을 줄였지만, 한 앱의 +명령·반응·대상 정보와 교체 준비 공간을 인스턴스마다 보유했다. CLI·피어는 정의를 실행 중 +교체하지 않으므로 준비 단계가 만든 동일한 정의를 Zig 빌드의 불변 `Program`으로 한 번 +링크한다. 인스턴스에는 설치 여부, 각자의 상태·진단·평가 기록만 남긴다. 고정 빌드에서 +C의 명령·반응 배열도 다시 링크하지 않는다. + +```text +작성된 .pure → 기존 준비기 → 고정 빌드의 불변 Program (앱마다 한 벌) + ├─ scalar 인스턴스 A: 상태·진단·평가 + └─ scalar 인스턴스 B: 상태·진단·평가 +``` + +설치할 때 준비 정의의 SHA-256 identity와 상태·입력·명령·반응·대상 개수를 빌드 정의와 +대조한다. 복원 값은 모두 유한한지 확인한 뒤에야 상태·버전을 바꾼다. 여기서 identity는 +저장 상태의 **호환성 검사**이며 출처 인증이 아니다. 고정 실행물에서 다른 정의를 쓰려면 +재빌드해야 한다. 정의 staging API와 선택형 평가 캐시는 이 프로필에서 용량 오류를 반환한다. +캐시 없는 평가와 정해진 작업 예산은 계속 사용한다. 정의 교체가 필요한 GTK 작성 창과 +브라우저 Wasm은 일반 프로필을 유지한다. + +초기 버전에는 설치 전의 빈 상태를 표현하려고 2,480 B짜리 빈 `Program`이 실행 파일에 +추가로 들어갔고, 기본 포인터 초기값은 읽기 전용 영역의 동적 재배치도 만들었다. +최종 버전은 인스턴스의 설치 여부로 빈 상태를 표현한다. [실행물 의존성 검사](../../prototypes/workbench/results/2026-09-24-shared-program/dependencies.txt)에서 +CLI·피어 모두 `TEXTREL`이 없고, [심볼 검사](../../prototypes/workbench/results/2026-09-24-shared-program/symbols.txt)에서 +2,480 B `engine.shared_program` 한 벌만 남은 것을 확인했다. + +## 반복 비용과 동작 + +`routed-layout.pure`의 [최종 크기·RSS 원자료](../../prototypes/workbench/results/2026-09-24-shared-program/instance-memory.json): + +| 범위 | 일반 작성 프로필 | 앞선 고정 용량 [027](027-fixed-native-capacity.md) | 공유 고정 프로필 | +|---|---:|---:|---:| +| scalar 인스턴스 요구 저장 공간 | 20,064 B | 5,456 B | **280 B** | +| 같은 scalar 인스턴스 1,000개 초기화의 RSS 증가, 3회 중앙값 | 19,808 KiB | 5,536 KiB | **480 KiB** | + +각 인스턴스를 실제 할당·초기화·설치한 뒤 버전 합을 검사했다. RSS는 Linux의 초기화 +전후 차이이며 allocator·페이지 단위의 영향도 포함한다. 이 값은 **scalar 인스턴스 +반복 비용**이지 사용자 1,000명의 서비스 메모리·처리량이나 전체 피크가 아니다. +고정 프로그램 자체는 앱마다 정적 저장 공간 2,480 B를 한 번 사용한다. 별도의 C 앱 +컨트롤러는 이 사례에서 928 B이고, 저장·입출력·스택·TLS·GTK는 위 280 B에 없다. + +[고정 프로필](../../prototypes/workbench/results/2026-09-24-shared-program/fixed-parity.json)과 +[일반 프로필](../../prototypes/workbench/results/2026-09-24-shared-program/general-parity.json)은 +기존 작성물 11개, 입력 170단계의 상태·출력을 Wasm과 비교했다. 두 C 호스트는 ASan/UBSan, +Zig 모듈은 ReleaseSafe였다. 고정 단위 검사는 독립 상태, 설치 전 빈 상태, 잘못된 정의 +identity·개수 거부, 복원 실패의 원자성, 부호 있는 0과 reset을 확인했다. 일반 프로필의 +정의 staging·교체 검사도 통과했다. Zig 코어 37개와 브라우저/CLI 회귀 87개를 통과했다. + +## 선택한 실행물의 비용 + +같은 `routed-layout.pure`, C `-O2 -g`의 [섹션 크기](../../prototypes/workbench/results/2026-09-24-shared-program/size.txt), +[stripped 파일 크기](../../prototypes/workbench/results/2026-09-24-shared-program/stripped.txt), +[CLI 빌드 식별](../../prototypes/workbench/results/2026-09-24-shared-program/cli-build.json), +[피어 빌드 식별](../../prototypes/workbench/results/2026-09-24-shared-program/peer-build.json). + +| 선택한 범위 | 앞선 고정 용량 [027](027-fixed-native-capacity.md) | 공유 고정 프로필 | +|---|---:|---:| +| scalar 오브젝트 `text` | 18,252 B | **10,396 B** | +| CLI 실행물 `text` | 48,059 B | **37,135 B** | +| CLI stripped ELF | 68,000 B | **68,000 B** | +| TLS 피어 실행물 `text` | 61,201 B | **50,277 B** | +| TLS 피어 stripped ELF | 68,400 B | **68,400 B** | + +이 호스트의 ELF 배치·정렬 때문에 이번에는 **stripped 파일 크기가 줄지 않았다**. +CLI는 libc, 피어는 libc·OpenSSL 동적 라이브러리를 요구한다. 피어의 유휴 RSS는 +[최종 인증·복원·오류 검사](../../prototypes/workbench/results/2026-09-24-shared-program/peer-check.json)에서 +7,856 KiB였다. 공통 저장 실행 코어의 별도 `text` 예산 5,932 B는 그대로 통과했다. + +이제 작은 scalar 인스턴스만 더 줄이는 측정은 우선순위가 아니다. 첫 공개 체크포인트에는 +실제 크기의 작성·저장·원격 작업을 포함한 **앱 전체 비용과 실패 조건**이 필요하다. +이번 결과는 반복 메모리 제거와 기존 동작 유지의 증거이며 큰 서비스의 지연·처리량 우위나 +macOS 메모리 특성에 대한 증거는 아니다. |
