Threadprocs – 하나의 주소 공간을 공유하는 실행 파일들 (0-복사 포인터)
이 프로젝트는 여러 독립적인 프로그램을 하나의 공유 가상 주소 공간에 실행시키면서도 별도의 프로세스처럼 동작합니다(독립적인 바이너리, 전역 변수, 수명). Threadprocs가 주소 공간을 공유할 때, 포인터는 잘 동작하는 Linux 바이너리에 대해 코드 변경 없이도 유효합니다. 스레드와 달리 각 threadproc은 독립적이고 반격리된 프로세스입니다. dlopen 기반 플러그인 시스템과 달리, threadprocs는 `main()` 함수를 가진 전통적인 실행 파일을 실행합니다. POSIX 프로세스와 달리, 포인터는 같은 주소 공간을 공유하기 때문에 threadprocs 간에 유효합니다. 이는 `std::string`이나 `std::unordered_map`과 같은 관용적인 포인터 기반 데이터 구조가 threadprocs 간에 전달되고 직접 접근될 수 있음을 의미합니다(일반적인 데이터 경쟁 고려 사항 포함). 이는 pthreads와 다중 프로세스 공유 메모리 IPC 사이의 프로그래밍 모델을 구현합니다. 구현은 로드 시 ASLR과 가상 주소 레이아웃을 조정하고 `exec()`의 사용자 공간 유사체를 구현하며, threadproc 파일 디스크립터, 시그널 등을 신중하게 조작하는 데 의존합니다. 이는 완전히 권한 없는 사용자 공간 코드로 구현되었습니다: <https://github.com/jer-irl/threadprocs/blob/main/docs/02-imp...>. <https://github.com/jer-irl/threadprocs/tree/main?tab=readme-...>에는 간단한 데모와 함께 '교차 threadproc' 메모리 역참조를 보여주는 고수준 다이어그램이 포함되어 있습니다. 이는 공유 메모리(종종 링 버퍼나 플랫 테이블)를 가진 다중 프로세스 시스템과 관련이 있습니다. 이러한 설계는 종종 직렬화나 복사를 필요로 하며, 관용적인 C++이나 Rust 데이터 구조에서 멀어지는 경향이 있습니다. 포인터 기반 데이터 구조는 직접 전달될 수 없습니다. 상당한 제한 사항과 경계 사례가 있으며, 이것이 실용적인 모델인지는 명확하지 않지만, 이 프로젝트는 시스템을 독립적으로 실행되는 구성 요소로 구조화하면서도 전통적인 프로세스 메모리 경계를 완화하는 방법을 탐구합니다.
- 오픈 소스
- 워크플로우 자동화
- 코드 생성
✨ AI 요약
Threadprocs는 여러 독립 실행 파일이 하나의 공유 가상 주소 공간 내에서 실행될 수 있도록 하여, 프로세스와 유사한 격리를 유지하면서도 직접적인 포인터 접근을 가능하게 합니다. 이 접근 방식은 스레드와 기존의 다중 프로세스 공유 메모리 사이의 중간 지점을 제공합니다.
추천 대상
새로운 프로세스 간 통신 방법을 탐구하는 시스템 프로그래머, 컴포넌트 간 대규모, 연결된 데이터 구조를 작업하는 개발자, 메모리 격리 및 공유 기술을 연구하는 연구자
중요한 이유
독립적으로 실행된 실행 파일들이 하나의 주소 공간을 공유할 수 있도록 하여, 포인터 기반 데이터 구조의 직접적인 제로-복사 공유를 가능하게 합니다.
주요 기능
- 독립적인 프로그램을 단일 공유 가상 주소 공간으로 실행합니다.
- 별도의 프로세스와 유사한 동작(바이너리, 전역 변수, 수명)을 유지합니다.
- Linux에서 '스레드프로세스' 간에 0-복사 포인터 공유를 가능하게 합니다.
- 직접적인 C++/Rust 관용적 데이터 구조(예: std::string) 접근을 지원합니다.
사용 사례
- 게임 개발자는 스레드프로세스를 사용하여 AI, 물리, 렌더링과 같은 다양한 게임 모듈을 동일한 메모리 공간을 공유하는 독립 실행 파일로 로드할 수 있습니다. 이를 통해 장면 그래프나 캐릭터 상태와 같은 복잡한 데이터 구조를 모듈 간에 직접적이고 제로 카피 방식으로 전달할 수 있어, 기존의 IPC나 직렬화 방식에 비해 모듈 간 통신을 단순화할 수 있습니다.
- 고성능 데이터 처리 파이프라인을 구축하는 시스템 프로그래머는 수집, 변환, 분석과 같은 별도의 처리 단계를 개별 바이너리로 실행하기 위해 스레드프로세스를 활용할 수 있습니다. 이러한 아키텍처는 복사나 직렬화의 오버헤드 없이 대규모 배열이나 복잡한 객체 그래프와 같은 공유 데이터 버퍼를 직접 조작할 수 있게 하여 처리량을 향상시킬 수 있습니다.
- 복잡한 시뮬레이션 환경을 개발하는 연구자는 에이전트 행동, 환경 상호작용, 데이터 로깅과 같은 다양한 시뮬레이션 구성 요소를 독립적으로 컴파일된 프로그램으로 관리하기 위해 스레드프로세스를 활용할 수 있습니다. 이를 통해 시뮬레이션 상태를 원활하게 공유하고 공유 데이터 구조에 직접 접근할 수 있어, 시뮬레이션 로직의 신속한 프로토타이핑과 반복 작업을 용이하게 할 수 있습니다.