我想共享多臺計算機的某些內存區域,即C/C++項目。當計算機B上的某些內容訪問當前在計算機A上的某個內存區域時,該內存區域必須在A上鎖定併發送給B.當它唯一的可編譯的Linux時,我很好。跨多臺計算機共享內存?
在此先感謝:d
我想共享多臺計算機的某些內存區域,即C/C++項目。當計算機B上的某些內容訪問當前在計算機A上的某個內存區域時,該內存區域必須在A上鎖定併發送給B.當它唯一的可編譯的Linux時,我很好。跨多臺計算機共享內存?
在此先感謝:d
有軟件解決方案,在評論中指出的。它們使用節點中的處理器中的分頁硬件來檢測訪問,並使用本地網絡結構來傳播對內存的更改。一個硬件替代方案是反射內存 - 你可以進一步瞭解它的位置:
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
反射內存在任何一個環或樹結構提供低等待時間(每跳約一微秒)。
你不能爲簡單的C/C++項目做到這一點。
通用計算機硬件沒有直接支持此功能的物理屬性:一個系統上的內存無法被另一個系統讀取。
爲了讓不同機器上的C/C++程序看起來它們共享內存,必須編寫提供此功能的軟件。通常情況下,您需要這樣做:
此外,您需要確定如何處理內存一致性:如果兩個進程幾乎同時寫入內存中的相同地址,會發生什麼情況?如果進程A寫入位置X然後讀取位置Y,則幾乎在同一時間進程B寫入位置Y並讀取X,他們看到了什麼?如果兩個進程看到的數據不可能是單次寫入內存的結果,那麼可以嗎?除此之外,這在時間上非常昂貴:存儲到內存需要異常處理和網絡操作需要數千次,可能數十萬次,正常存儲到內存。無論何時寫入共享內存,您的進程都會慢慢地執行。
這正是我想要做的。你知道更多關於編寫我自己的內核擴展嗎? 另外,我也想通過網絡發送代碼,以便正在操作的代碼和數據將在同一臺計算機上,而且會很快。結果將僅被共享。它關於可能性。 您在syncronisation中看到的問題對我來說很奇怪。在發送之前鎖定頁面? – imacake 2012-08-10 13:52:31
這些都是複雜的問題,需要大量的學習和工作。我只能推薦先分別學習每件作品。如何將系統中的頁面更改爲只讀?你如何創建具有兩組不同虛擬地址的地圖到同一個內存?你如何編寫一個信號處理程序?你如何解碼導致異常的指令?你如何通過網絡發送消息? – 2012-08-10 14:12:56
簡單地鎖定頁面可能不是同步問題的解決方案。如果您鎖定頁面並向其他系統發送更新,如果其他系統同時發送更新會發生什麼情況?你拒絕嗎?那麼其他系統應該做什麼,因爲它已經在本地應用了它的更新並釋放了進程以繼續執行? – 2012-08-10 14:14:29
您應該首先探索一個名爲分佈式共享內存的主題(即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
閱讀在RDMA上:http://en.wikipedia。org/wiki/Remote_direct_memory_access – 2012-08-10 13:11:23