Show HN: Threadprocs – 可执行文件共享同一地址空间(零拷贝指针)
Source: Hacker News
Overview
Threadprocs 将多个独立的程序加载到同一个共享的虚拟地址空间中,同时保持各自进程的语义——每个程序都有自己的二进制文件、全局变量和生命周期。由于它们共享同一地址空间,指针在不同 threadproc 之间仍然有效,而无需对行为良好的 Linux 二进制文件进行任何代码修改。
- 不同于线程: 每个 threadproc 是一个独立的、半隔离的进程。
- 不同于基于
dlopen的插件: threadproc 运行的是带有main()函数的传统可执行文件。 - 不同于 POSIX 进程: 由于地址空间共享,指针在 threadproc 之间保持有效。
这使得可以直接在 threadproc 之间传递基于指针的数据结构,如 std::string 或 std::unordered_map(仍需考虑常规的数据竞争问题)。该模型介于 pthreads 与多进程共享内存 IPC 之间。
Implementation Details
实现思路依赖于:
- 在加载时控制 ASLR 和虚拟地址布局。
- 实现用户空间的
exec()类似功能。 - 小心地操作 threadproc 的文件描述符、信号以及其他资源。
所有这些都完全在非特权用户空间代码中完成。完整源码请参见实现仓库:
Threadprocs implementation (GitHub)
Demo
一个简单的演示展示了“跨 threadproc”内存解引用:
演示中包含了一个高级别的示意图,说明了指针如何安全共享。
Use Cases
Threadprocs 与需要多个进程共享内存的系统相关(例如环形缓冲区或平面表)。传统设计往往需要序列化或拷贝,这会让开发者远离 C++ 或 Rust 的惯用数据结构。使用 threadproc,基于指针的结构可以直接传递,从而简化架构。
Limitations
- 存在显著的限制和边缘情况(例如 TLS 的处理、信号语义以及某些加载器行为)。
- 目前尚不清楚该模型是否适用于生产工作负载。
- 该项目属于探索性工作,旨在放宽传统进程内存边界,同时仍然允许组件独立启动。
Comments URL:
Points: 37
Comments: 27