我們會閱讀每一條反饋,並非常重視您的意見。
此倉庫包含實驗性代碼,用於實現線程類進程(thread-like processes),即多個程序在共享的地址空間中運行。每個 threadproc 行為類似一個擁有自己可執行檔、全局變量、libc 實例等的進程,但指標在不同 threadproc 間是有效的。這種設計融合了 Posix 進程模型與 Posix 多線程編程模型,並支持對基於指標的數據結構進行零拷貝訪問。
所有 Markdown 文件均為手寫。
可參考 tproc-actors 作為基於 threadprocs 的應用框架示例。
示範程序的代碼位於 example/sharedstr/allocstr.cpp 和 example/sharedstr/printstr.cpp,這些程序不包含任何魔法操作(如 /proc/[pid]/mem 等),也不需要知道服務器和啟動器的存在。
服務器工具“承載”一個虛擬地址空間,通過使用啟動器啟動程序,這些程序共存於該承載的地址空間中。
應用程序可以通過某些帶外機制共享虛擬地址空間中的指標(示範使用複製/粘貼,dummy_server/client 使用套接字,libtproc 提供服務器全局緩衝區),然後直接解引用這些指標,因為它們在共享地址空間中是有效的。
libtproc 提供基本的執行檢測功能,判斷是否作為 threadproc 運行,並允許被承載的 threadprocs 訪問“服務器全局”緩衝區。應用程序可以利用這個空間構建工具,實現服務發現和基於共享內存的 IPC 引導。
這是通過向 threadproc 的 auxv 添加另一個條目來實現的。
tproc-actors 使用該空間來發布每個 threadproc 的 actor 註冊表。
請使用 Linux 系統,架構為 aarch64 或 x86_64;其他架構不支持。該項目在運行 Debian 的 Macbook Air M1 虛擬機中開發,並在 Debian x86_64 的 Github Codespace(使用 .devcontainer/ 配置)中測試。
值得注意的是,除了 Linux 系統頭文件外,沒有依賴任何 ELF 庫,儘管這些庫可能會使代碼更優雅。
或者您也可以在共享地址空間中運行自己的程序:
請閱讀項目概述或實現細節,了解更多信息,或參考與現有工作的比較。我也在結論中收集了一些經驗教訓。
在邊緣還存在一些不太重要的限制。例如,threadprocs 的 /proc/[pid]/comm 值反映其啟動的二進制文件,但 cmdline 無法設置。exec() 系統調用也會“逃逸” threadproc 機制,這可能是預期行為,但可能引發細微問題。
我最初的設想是讓 threadprocs 之間傳遞 std::unique_ptr,並支持帶有嵌套數據的 IPC。除 ABI 外,主要問題是即使 threadproc 1 釋放了一個指標,threadproc 2 用 std::unique_ptr 包裝它,當析構函數被調用並需要釋放內存時,threadproc 2 無法完成釋放操作。
每個 threadproc 擁有獨立的 libc、libstdc++ 和 rust libstd 實例,這大大減少了對啟動程序的技術依賴,但也意味著一個 threadproc 不能釋放另一個 threadproc 分配的內存。
開發者可以圍繞這一限制設計應用,確保內存總是交還給分配它的 threadproc 以正確釋放。我已經構思了一個應用框架,能自動將對象傳回其分配的 threadproc,類似自定義的 unique_ptr,詳見 tproc-actors。
這是一個有趣的方向,並引發了可進一步探討的問題,但我認為這並非任何嚴肅軟件的實用模型。Pthreads 雖然是一個有些停滯的抽象,但它擁有數十年工具和語言發展的支持。我還未完全解決這個問題,未來或許會探索用自定義分配器、固定映射等方式增強共享內存區域。
實驗性線程類進程,多個可執行檔共享一個地址空間。