2012-08-10 138 views
3

我想共享多臺計算機的某些內存區域,即C/C++項目。當計算機B上的某些內容訪問當前在計算機A上的某個內存區域時,該內存區域必須在A上鎖定併發送給B.當它唯一的可編譯的Linux時,我很好。跨多臺計算機共享內存?

在此先感謝:d

+1

您應該首先探索一個名爲分佈式共享內存的主題(即https://www.google.com/search?q=distributed+shared+memory&sugexp=chrome,mod=4&sourceid=chrome&ie=UTF-8) – RageD 2012-08-10 13:06:08

+2

閱讀在RDMA上:http://en.wikipedia。org/wiki/Remote_direct_memory_access – 2012-08-10 13:11:23

回答

3

有軟件解決方案,在評論中指出的。它們使用節點中的處理器中的分頁硬件來檢測訪問,並使用本地網絡結構來傳播對內存的更改。一個硬件替代方案是反射內存 - 你可以進一步瞭解它的位置:

https://en.wikipedia.org/wiki/Reflective_memory http://www.ecrin.com/embedded/downloads/reflectiveMemory.pdf http://www.dolphinics.com/solutions/embedded-system-reflective-memory.html

反射內存在任何一個環或樹結構提供低等待時間(每跳約一微秒)。

4

你不能爲簡單的C/C++項目做到這一點。

通用計算機硬件沒有直接支持此功能的物理屬性:一個系統上的內存無法被另一個系統讀取。

爲了讓不同機器上的C/C++程序看起來它們共享內存,必須編寫提供此功能的軟件。通常情況下,您需要這樣做:

  1. 在(每個進程的)虛擬內存地址空間中分配一些頁面。
  2. 將這些頁面標記爲只讀。
  3. 設置處理程序以接收進程嘗試寫入只讀內存時發生的異常。 (此處理程序可能在操作系統中,作爲某種內核擴展,或者它可能是您的進程中的信號處理程序。)
  4. 當收到異常時,請確定進程嘗試寫入內存的內容。將其寫入頁面(可能通過將其通過虛擬內存中的單獨映射寫入相同的物理內存,並將此額外映射標記爲可寫)。
  5. 通過網絡通信向另一臺機器發送一條消息,通知其內存已更改。
  6. 在寫入內存的指令之後的過程中恢復執行。

此外,您需要確定如何處理內存一致性:如果兩個進程幾乎同時寫入內存中的相同地址,會發生什麼情況?如果進程A寫入位置X然後讀取位置Y,則幾乎在同一時間進程B寫入位置Y並讀取X,他們看到了什麼?如果兩個進程看到的數據不可能是單次寫入內存的結果,那麼可以嗎?除此之外,這在時間上非常昂貴:存儲到內存需要異常處理和網絡操作需要數千次,可能數十萬次,正常存儲到內存。無論何時寫入共享內存,您的進程都會慢慢地執行。

+0

這正是我想要做的。你知道更多關於編寫我自己的內核擴展嗎? 另外,我也想通過網絡發送代碼,以便正在操作的代碼和數據將在同一臺計算機上,而且會很快。結果將僅被共享。它關於可能性。 您在syncronisation中看到的問題對我來說很奇怪。在發送之前鎖定頁面? – imacake 2012-08-10 13:52:31

+1

這些都是複雜的問題,需要大量的學習和工作。我只能推薦先分別學習每件作品。如何將系統中的頁面更改爲只讀?你如何創建具有兩組不同虛擬地址的地圖到同一個內存?你如何編寫一個信號處理程序?你如何解碼導致異常的指令?你如何通過網絡發送消息? – 2012-08-10 14:12:56

+1

簡單地鎖定頁面可能不是同步問題的解決方案。如果您鎖定頁面並向其他系統發送更新,如果其他系統同時發送更新會發生什麼情況?你拒絕嗎?那麼其他系統應該做什麼,因爲它已經在本地應用了它的更新並釋放了進程以繼續執行? – 2012-08-10 14:14:29