Threadprocs – 共享同一地址空间的可执行程序(零拷贝指针)
该项目将多个独立的程序启动到单个共享的虚拟地址空间中,同时仍保持独立进程的行为(独立的二进制文件、全局变量和生命周期)。当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... >。有一个简单的演示展示了“跨threadproc”内存解引用:< https://github.com/jer-irl/threadprocs/tree/main?tab=readme-... >,包括高层示意图。这与具有共享内存(通常是环形缓冲区或平面表)的多进程系统相关。这些设计通常需要序列化或复制,并且往往偏离惯用的C++或Rust数据结构。基于指针的数据结构无法直接传递。存在显著的限制和边缘情况,尚不清楚这是否是一种实用的模型,但该项目探索了一种在保持系统作为独立启动组件结构的同时,放宽传统进程内存边界的方法。
- 云原生
- 代码生成
- 工作流自动化
✨ AI 摘要
Threadprocs允许多个独立可执行程序在单个共享虚拟地址空间内运行,实现跨程序的直接指针访问,同时保持类似进程的隔离性。这种方法在线程与传统多进程共享内存之间提供了折中方案。
适合谁
探索新型进程间通信方式的系统程序员, 处理跨组件大型互联数据结构的开发者, 研究内存隔离与共享技术的研究人员
为什么值得关注
通过允许独立启动的可执行文件共享单一地址空间,实现基于指针的数据结构在它们之间的直接、零拷贝共享。
核心特性
- 将独立程序启动到单一的共享虚拟地址空间中。
- 保持类似进程的独立行为(二进制文件、全局变量、生命周期)。
- 在Linux上实现跨'线程进程'的零拷贝指针共享。
- 支持直接访问符合C++/Rust惯用法的数据结构(例如std::string)。
使用场景
- 游戏开发者可以利用线程进程将不同游戏模块(如AI、物理引擎、渲染)作为独立的可执行文件加载到同一内存空间中。这样可以在模块间直接、零拷贝地传递复杂数据结构,如场景图或角色状态,相比传统的进程间通信或序列化,简化了模块间通信。
- 系统程序员在构建高性能数据处理流水线时,可以采用线程进程将不同处理阶段(如数据摄入、转换、分析)作为独立的二进制程序运行。这种架构允许直接操作共享数据缓冲区,如大型数组或复杂对象图,无需复制或序列化的开销,从而可能提升吞吐量。
- 研究人员开发复杂仿真环境时,可以借助线程进程将不同仿真组件(如智能体行为、环境交互、数据记录)作为独立编译的程序进行管理。这能实现仿真状态的无缝共享和共享数据结构的直接访问,便于快速原型设计和仿真逻辑迭代。