2014-03-04 60 views
7

內存映射文件(根據規範)在很大程度上取決於操作系統的實際實現,並且一些這些未知方面已經在javadoc中進行了解釋。不過,我還有一些其他問題,不知道在哪裏尋求答案。java中的內存映射文件:太多的問題?

假設application A將文件映射到內存從position=0size=10

我會假設操作系統需要一個連續的內存映射它?或者這是依賴於實現?

現在假設我們有一個application B,其映射從position=0size=11。 是前10個字節共享還是完全不同的映射?這涉及到連續記憶問題。

如果我們想爲IPC使用映射文件,我們需要知道數據如何反映在其他應用程序中,所以如果B寫入內存,請問A看到了嗎?

但是,當我閱讀規範,這取決於操作系統。這對於通用IPC來說很危險,因爲它破壞了可移植性嗎?

另外假設OS不支持它,所以B寫入內存,A看到的變化,如果我們這樣做會發生什麼:

B.write("something"); 
A.write("stuff"); 
A.read(); 

究竟會A讀?
或換句話說:

如何管理文件指針?
它是如何工作的併發性,有跨應用程序鎖定?

回答

1

您可以假設每個操作系統都會根據塊大小來執行內存映射,這些塊的大小通常爲2的冪的2的冪,2的冪的倍數並且顯着大於11字節。

所以無論是否映射從0到10或1到11,底層系統將有可能從0建立映射到BLOCKSIZE邏輯地址X將被完全隱藏到Java編程爲返回ByteBuffer有它自己的地址指針和容量,因此它可以隨時調整,例如的位置 0收益率爲地址X + 1.但是底層系統還是Java的MappedByteBuffer執行必要的轉換並不重要。

通常,操作系統最終會使用相同的物理內存塊映射到相同文件的同一區域,因此這是建立IPC的合理方式,但正如您已經猜到的那樣,這確實是取決於操作系統的操作系統而不是便攜式。儘管如此,它可能是有用的,如果你使它可選並讓知道他的系統支持它的用戶可以啓用它。

關於您關於這兩個寫入的問題,當然,如果兩個應用程序同時寫入相同的位置,結果是完全不可預知的。

映射文件區域與鎖定無關,但您可以使用文件通道API來鎖定要映射的區域以獲得獨佔訪問權限。