記憶體對映是虛擬記憶體系統的重要特性,即虛擬記憶體中的虛擬頁(virtual page)總是對應於磁碟上的物理頁(physical page)。
記憶體對映技術,可以使得使用檔案來初始化虛擬記憶體的內容(只在第一次引用到相應記憶體時,才會快取進主存):
linux程序中可以使用mmap函式,建立乙個虛擬記憶體對映區域,將相應的檔案物件對映到此區域。
void* mmap(void* start,size_t length,int prot,int flags,int fd,off_t offset)
fd:檔案描述符,fd指定的物件將被對映到虛擬記憶體相應區域
offset:用距離檔案開始處偏移量的offset位元組處開始
length:對映的檔案內容大小(位元組)通常設定為4096整數倍,以提高訪問效率
prot:指定虛擬記憶體對映區域的訪問許可權,可讀|可寫|
基於對映是否共享可以分為以下兩種:
私有對映map_private
多程序間共享資料,修改不會寫會磁碟,但是會觸發寫時複製copy on write
共享對映map_shared
多程序間共享資料,修改會寫回磁碟
例如讓核心建立乙個包含size位元組,唯讀,私有,請求二進位制0的虛擬記憶體頁面:
buf_ptr=mmap(null,size,prot_read|map_private,0,0)
其中map_private指明是私有對映,也就是一旦有程序修改資料,那麼觸發寫時複製,以確保程序之間的私有要求。
另外fd=0 指明這是乙個請求二進位制0的匿名檔案。(不會在磁碟上建立,只是常駐記憶體)
通過記憶體對映技術,可以很好的在多個程序之間實現資料共享:
共享庫clib
多個程序虛擬位址空間的共享庫區域都對映到同乙份物理儲存的庫檔案
核心**段
多個程序執行相應的核心呼叫時,都會對映到同一片核心唯讀**區
ipc共享記憶體
多個程序之間虛擬共享記憶體區域對映到相同的物理記憶體區域,非常高效實現共享
另外,基於記憶體共享技術,可以實現檔案《=》記憶體的快速拷貝以實現快速檔案io
【傳統系統呼叫讀取檔案】
首先程序執行系統呼叫read,核心首先檢查檔案頁快取區是否有請求的內容,如果沒有(第一次開啟)那麼核心將磁碟上檔案拷貝到核心的檔案快取區中,接著從檔案快取區拷貝內容到user space。需要執行兩次拷貝。
而下一次請求相同的檔案內容時,直接從核心檔案快取區中返回即可,執行一次拷貝。
【採取mmap讀取檔案】
而採取mmap技術,直接將磁碟上的檔案對映為程序虛擬位址空間下的虛擬頁,(被快取進主記憶體時,發生一次拷貝)
程序對檔案的訪問就像訪問本地記憶體一樣簡單高效。只進行一次拷貝。
由此可見,基於mmap記憶體檔案對映技術,對檔案的訪問,可以避免一次流經頁快取。
即 : 記憶體的讀寫《=》檔案的讀寫
【實驗與演示】
....省略標頭檔案
#define bufsize 4096
using namespace std;
int main()
{ int fd;//檔案描述符
執行結果:
該檔案初始化只有7個字元,但被對映為4096的虛擬記憶體頁後,其它剩餘內容為空。
通過memcpy寫入4096個『a』字元後,檢視檔案內容:
發現只寫入了7個字元,也就是虛擬記憶體頁寫會到磁碟檔案時,不會額外的增加檔案的長度。
由此可見,基於記憶體對映技術,其主要特點如下:
優點缺點
對檔案的讀取,採取mmap方式,相較於read系統呼叫,減少了一次頁快取到使用者空間的拷貝,提高了讀取效率
但由於mmap方式是一頁一頁的對映,因此在讀取小檔案時會造成更大的空間浪費和效能開銷
提供了一種多個程序共享記憶體的方式,將被共享的檔案對映到不同程序的虛擬位址空間中,實現記憶體共享。
無法應對變長檔案的寫入,只能在原始檔案大小的範圍內寫入
對於大規模的檔案讀取,採取mmap可以提高效率
頻繁的更新對映記憶體,會造成虛擬頁=》磁碟的大量寫回
記憶體對映檔案 虛擬記憶體
windows提供了3種進行記憶體管理的方法 虛擬記憶體,最適合用來管理大型物件或結構陣列。記憶體對映檔案,最適合用來管理大型資料流 通常來自檔案 以及在單個計算機上執行的多個程序之間共享資料。記憶體堆疊,最適合用來管理大量的小物件。再通俗點,就是比如 要讀取乙個檔案裡的東西 這時候你就得去硬碟讀,...
對映虛擬記憶體
沒有任何額外維護資料的記憶體分配 mmap 分配 munmap 釋放 分配空間大小 4k length 4k 1 以頁為單位,每頁通常為4k 函式說明 void mmap void start,指定對映的虛擬位址 0由系統指定開始位置 size t length,對映空間大小 pagesize倍數 ...
記憶體對映檔案mmap
一 簡介 記憶體對映檔案,是由乙個檔案到一塊記憶體的對映。記憶體對映檔案與虛擬記憶體有些類似,通過記憶體對映檔案可以保留乙個位址空間的區域,同時將物理儲存器提交給此區域,記憶體檔案對映的物理儲存器來自乙個已經存在於磁碟上的檔案,而且在對該檔案進行操作之前必須首先對檔案進行對映。使用記憶體對映檔案處理...