2015-06-13 54 views
3

我想實現一個JIT編譯器(我有非常令人討厭的愛好)。共享內存的性能和保護從其他進程

我想有一個主進程保留一些持久變量,第二個進程(即時編譯)執行一些計算並可以訪問和寫入持久變量。

第二個進程可以更改並重新編譯,但持久變量必須在第二個進程的兩次執行之間保持不變。

我的第一個問題是:共享內存是正確的工具嗎? (同樣在性能方面,因爲我希望執行儘可能快)。

我的第二個問題是:如果我使用共享內存,如shm_overview.7中所述,在我看來,任何其他進程使用相同uid可以訪問它。我怎樣才能防止它?我只想要上述兩個進程能夠訪問這個共享內存。

回答

6

您可能會考慮的替代體系結構是動態加載。而不是2個過程,你只有第一個;它使用dlopen()加載您最近編譯的代碼。它調用這個「庫」的入口點,代碼可以訪問包括持久變量在內的所有空間。返回時,您卸載庫,準備下一個「運行」。

創建這樣一個可加載的庫並調用它非常簡單,而且比執行一個新的進程更快。權限沒有問題,因爲您唯一的進程決定要加載和運行的內容。

3
  1. 是的,共享內存是一個合適的工具。 它將作用(看大圖)有點像文件 ,該進程可以讀出和寫入,同的差異是:

    • 共享存儲器將是更有效的,並且
    • 共享存儲器將無法在重新啓動後存活。
  2. 不知的限制的共享存儲器段 的任何鐵定方式僅選擇工藝中,具有相同的UID排除其它的。 一般來說,如果你擁有一些東西,你可以完全控制它, 和具有相同UID的進程具有相同的訪問權限*。 但是,如果您使用​​3210作爲關鍵字創建shmget 的共享內存段,那麼對於不相關的進程來說找到它將會有點困難。 只能通過其id(標識符), ,其中shmget返回。對於一些其他進程找到id, 它將需要運行ipcs並解析輸出。但是, 您需要一種方法使id可用於您的第二個進程 (即時編譯的進程)。 也許作爲參數或環境變量。
    _______________
    *除了不同造成的GID或組中的接入差異成員資格

2

我想僅在兩個以上的處理,以便能夠訪問此 共享內存。

這是不可能的。除非您使用一些額外的安全框架(grsecurity,SELinux及其朋友),否則由標準UNIX環境定義的權限使得使用相同UID運行的另一個進程可以完全控制您的進程,包括停止/重新啓動,查殺, 跟蹤,檢查和修改全過程內存。因此,即使您設法以某種方式隱藏共享內存與標準SHM訪問,您也無法完全防止其他進程受到干擾。