所以,檔案對映進行了兩次對映,一次對映是將屬於磁碟檔案的部分或全部資料塊對映到物理記憶體頁中,另一次對映是將物理記憶體頁對映到程序的虛擬頁上。
如圖,圖中假設磁碟資料塊大小和記憶體頁大小相同,將某檔案中的6個資料塊(可能只是該檔案的一部分資料)對映到物理記憶體的頁1、2、3、4、5、6中,並且兩個程序都對映該磁碟檔案相同的資料區域,所以兩個程序都指向相同的物理記憶體頁。
使用檔案對映時,最開始該記憶體區是空的。當訪問這段記憶體時,如果訪問的資料不在記憶體中(例如第一次訪問),將出現page fault,於是會從磁碟中讀取相應的資料塊拷貝到這段記憶體(基於作業系統提供的預讀優化,可能一次性會多讀一些資料到對映的記憶體中)。當向此記憶體區寫資料時,會自動寫入到磁碟檔案對應的資料塊中(可以設定為其它寫方式)。
此外,通過設定檔案對映方式,還支援寫時複製。某程序要向該對映區的某記憶體頁寫資料時,會拷貝該頁到自己的虛擬記憶體中,然後寫資料到該副本頁,而不會影響對映區的資料,而且以後該程序對該頁的操作都將使用該副本。
既然每個程序都能訪問到檔案對映的物理記憶體,那麼這段物理記憶體分配在程序虛擬記憶體布局的哪一部分呢?這個簡單思考下即可得知答案,程序的虛擬記憶體中,只有堆記憶體和堆疊中間的未分配位址空間是可以由使用者程序自由使用的位址區域,如果將檔案對映到堆中,假如對映的檔案資料較大,已分配的堆記憶體中空閒頁很可能不足以對映該檔案,作業系統需要為其分配更多的堆記憶體,另一方面,就算當前堆記憶體能放下檔案對映,但也很可能因此而導致空閒頁所剩不多,程序之後的執行很可能還是要請求分配新的堆記憶體,如此看來,倒不如直接對映在堆疊中間那片未分配的位址空間,並且為堆和棧都預留一段未分配空間。圖中給出檔案對映在程序記憶體布局中的位置。
共享記憶體(shared memory)是直接從核心維護的記憶體中劃分一片記憶體,並將該記憶體對映到乙個或多個程序中。
因為可能多個程序對映到同一共享記憶體,所以某程序對此記憶體資料的修改會直接影響其它程序,這樣就能在程序之間傳遞訊息。但也正因為如此,在使用共享記憶體時,應當保證沒有兩個或以上的程序同時修改共享記憶體資料。
共享記憶體是效率最高的程序間通訊方式,它完全記憶體化操作,且沒有任何記憶體拷貝行為,此外,記憶體對映到不同程序之後,作業系統就不再參與該片記憶體的操作,使用者程序可以有權訪問這段記憶體。
記憶體共享和檔案對映非常像,不同之處就在於共享記憶體沒有對具體的磁碟檔案進行對映,而是直接對映物理記憶體到程序中。所以,它也對映在程序堆疊中間的那片未分配記憶體上。如圖。
Ubuntu下Linux程序間通訊 共享記憶體
linux提供了多種程序間通訊的方法,常見有管道 匿名 fifo 有名管道 訊息佇列 訊號量 共享記憶體,socket通訊。linux程序間通訊 匿名管道 linux程序間通訊 fifo 有名管道 linux程序間通訊 訊息佇列 linux程序間通訊 訊號量 linux程序間通訊 共享記憶體 5.共...
記憶體檔案對映 程序間通訊
記憶體對映檔案可以分為兩種 一種是普通的檔案,它需要乙個普通的檔案控制代碼,用於快速的讀寫檔案,這種檔案的資料在程序退出後會儲存在硬碟上,所以程序在下次執行時可以得到之前的資料 另一種是頁檔案,當建立記憶體對映檔案的時候傳入無效的控制代碼,這時會把頁檔案當作臨時的共享儲存空間,當程序退出後這些資料是...
程序間通訊的方式 二 共享對映區
共享對映區 一 通訊方式 程序間通訊又稱ipc inter process communication 它可以通過檔案 管道 有名管道 共享記憶體 訊息佇列 訊號量 套接字這幾個方式進行通訊,但是檔案這種以及訊息佇列基本已被淘汰。所以常用的通訊方式有 1.管道 2.訊號 3.共享對映區 4.本地套接...