Show HN: Threadprocs – 실행 파일이 하나의 주소 공간을 공유 (0-copy 포인터)
Source: Hacker News
Overview
Threadprocs는 여러 독립적인 프로그램을 하나의 공유 가상 주소 공간에 실행하면서 별도 프로세스의 의미를 유지합니다—각각은 자체 바이너리, 전역 변수, 수명을 가집니다. 같은 주소 공간을 공유하기 때문에, 잘 동작하는 Linux 바이너리의 경우 코드 변경 없이도 threadproc 간에 포인터를 그대로 사용할 수 있습니다.
- 스레드와는 달리: 각 threadproc는 독립적인, 반격리된 프로세스입니다.
dlopen기반 플러그인과는 달리: threadproc는main()함수를 가진 전통적인 실행 파일을 실행합니다.- POSIX 프로세스와는 달리: 주소 공간이 공유되므로 threadproc 간에 포인터가 유효합니다.
이를 통해 std::string이나 std::unordered_map과 같은 관용적인 포인터 기반 데이터 구조를 threadproc 간에 직접 전달할 수 있습니다(일반적인 데이터 레이스 고려는 필요합니다). 이 모델은 pthread와 다중 프로세스 공유 메모리 IPC 사이 어딘가에 위치합니다.
Implementation Details
이 접근 방식은 다음에 의존합니다:
- 로드 시점에 ASLR 및 가상 주소 레이아웃 제어.
exec()의 사용자 공간 유사 구현.- threadproc 파일 디스크립터, 시그널 및 기타 리소스의 신중한 조작.
이 모든 작업은 권한이 없는 사용자 공간 코드만으로 수행됩니다. 전체 소스는 구현 저장소에서 확인할 수 있습니다:
Threadprocs implementation (GitHub)
Demo
간단한 데모는 “cross‑threadproc” 메모리 역참조를 보여줍니다:
데모에는 포인터를 안전하게 공유할 수 있는 방법을 나타내는 고수준 다이어그램이 포함되어 있습니다.
Use Cases
Threadprocs는 메모리를 공유하는 여러 프로세스가 관여하는 시스템에 적합합니다(예: 링 버퍼 또는 플랫 테이블). 전통적인 설계에서는 종종 직렬화나 복사가 필요해 개발자가 관용적인 C++ 또는 Rust 데이터 구조를 사용하기 어렵습니다. Threadprocs를 사용하면 포인터 기반 구조를 직접 전달할 수 있어 아키텍처가 단순해집니다.
Limitations
- TLS 처리, 시그널 의미론, 특정 로더 동작 등 상당한 제한 사항과 경계 사례가 존재합니다.
- 이 모델이 실제 운영 환경에 실용적인지는 아직 명확하지 않습니다.
- 프로젝트는 탐색 단계이며, 전통적인 프로세스 메모리 경계를 완화하면서도 구성 요소를 독립적으로 실행할 수 있게 하는 것을 목표로 합니다.
Comments URL:
Points: 37
Comments: 27