1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
# 041 — 유휴 HTTP 호스트의 POSIX 종료 경로
2026-09-24. [039](039-idle-http-wakeups.md)는 50ms 주기 깨움을 없앴지만
Linux `ppoll`에 의존했다. `poll` 대기 직전에 종료 신호가 도착하면 신호
플래그만으로는 무기한 대기 경합을 막을 수 없다. 이번 변경은 HTTP 호스트에
작은 비차단 신호 알림 파이프를 둔다. `SIGINT`·`SIGTERM` 처리기는 종료
플래그를 설정하고 파이프에 한 바이트를 쓴다. `poll`은 그 읽기 끝을
클라이언트 소켓과 함께 감시한다. 신호가 `poll` 전후 어느 때 도착해도
다음 대기가 깨어날 준비를 한다. 대기 전용 스레드나 실행 코어 타입은 없다.
Apple의 [`poll(2)` 매뉴얼](https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/poll.2.html)과
[`sigaction(2)` 매뉴얼](https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/sigaction.2.html)은
이 경계에서 쓰는 API를 문서화하고, 후자는 `write()`를 신호 처리기에서
사용 가능한 함수로 열거한다. 여기서 검증한 것은 **Linux AArch64 실행**이다.
macOS SDK 컴파일·실행과 macOS 저장·패키지 경로는 아직 검증하지 않았다.
[시스템 호출 추적](../../prototypes/connections/results/2026-09-24-posix-idle/reproducible-comparison.json)에서
유휴 1.25초 동안 이전 호스트의 50ms 제한 대기 25회가 현재 호스트의
무기한 대기 1회로 바뀌었다. `SIGTERM` 이후 프로세스는 정상 종료했다.
[HTTP 회귀 검사](../../prototypes/connections/results/2026-09-24-posix-idle/fixed-server-regression.json)는
1 MiB 문서·느린 수신자·예산 회수를 통과했다.
[1,024개 문서·8개 클라이언트 검사](../../prototypes/connections/results/2026-09-24-posix-idle/service-scale.json)도
고정·소스 호스트 각각 4,096 HTTP 작업, 같은 최종 문서 해시, 별도 CLI
복원, 종료 시 보유 0 B를 확인했다. 이 검사는 처리량 비교가 아니다.
Linux AArch64/GCC 14에서 실행 코어 `text` 5,932 B와 고정 CLI 19,244 B는
그대로다. [소스 HTTP 호스트](../../prototypes/connections/results/2026-09-24-posix-idle/source-profile.json)의
`text`는 43,451→43,778 B, [고정 HTTP 호스트](../../prototypes/connections/results/2026-09-24-posix-idle/fixed-profile.json)는
25,790→26,261 B다. 호스트마다 파이프 파일 디스크립터 2개를 더 쓴다.
[CLI+HTTP 묶음](../../prototypes/connections/results/2026-09-24-posix-idle/pure-document-fixed-http-linux-aarch64.tar.gz)은
32,346 B이며 [다른 위치에서 실제 편집·복원](../../prototypes/connections/results/2026-09-24-posix-idle/package.json)을
통과했다. 묶음 크기는 libc나 프로세스 메모리를 포함하지 않는다.
`ppoll` 제거만으로 macOS 지원이 완성되지는 않는다. 현재 저장소,
컴파일러, 창, TLS 경계와 패키지도 macOS에서 각각 빌드·검증해야 한다.
마이크로 기준도 실행 코어만이 아니라 선택한 앱의 전체 메모리와 파일
디스크립터를 포함해 판단해야 한다.
|