記憶體檔案對映原理和簡單應用

2021-08-05 19:13:16 字數 2471 閱讀 7606

參考部落格:

參考部落格:

記憶體對映檔案原理**

硬碟上檔案 

的位置與程序 

邏輯位址空間 

中一塊大小相同的區域之間的一一對應,

這種對應關係純屬是邏輯上的概念,物理上是不存在的,原因是程序的邏輯位址空間本身就是不存在的,

在記憶體對映的過程中,並沒有實際的資料拷貝,檔案沒有被載入記憶體

,只是邏輯上被放入了記憶體,具體到**,就是建立並初始化了相關的

資料結構

(struct address_space),這個過程有系統呼叫

mmap()

實現,所以建立記憶體對映的效率很高。

mmap將乙個檔案或者其它物件對映進記憶體,mmap必須以page_size為單位進行對映,而記憶體也只能以頁為單位進行

對映,若要對映非page_size整數倍的位址範圍,要先進行記憶體對齊,強行以page_size的倍數大小進行對映。

mmap()會返回乙個指標ptr

,它指向程序邏輯位址空間中的乙個位址,這樣以後,程序

無需再呼叫read或write

對檔案進行讀寫,而只需要通過ptr就能夠操作檔案。但是ptr所指向的是乙個邏輯位址,要操作其中的資料,必須通過mmu(記憶體管理單元)將邏輯位址轉換成實體地址,這個過程與記憶體對映無關。

前面講過,

建立記憶體對映並沒有實際拷貝資料

,這時,mmu在位址對映表中是無法找到與ptr相對應的實體地址的,也就是mmu失敗,將產生乙個缺頁中斷,缺頁中斷的中斷響應函式會在swap中尋找相對應的頁面,如果

找不到(也就是該檔案從來沒有被讀入記憶體的情況),則

會通過mmap()建立的對映關係,從硬碟上將檔案讀取到物理記憶體中

,這個過程與記憶體對映無關。

如果在拷貝資料時,發現物理記憶體不夠用,則會通過虛擬記憶體機制(swap)將暫時不用的物理頁面交換到硬碟上,如圖1中過程4所示。這個過程也與記憶體對映無關。

效率:從**層面上看,從硬碟上將檔案讀入記憶體,都要經過檔案系統進行資料拷貝,並且資料拷貝操作是由檔案系統和硬體驅動實現的,理論上來說,拷貝資料的效率是一樣的。但是通過記憶體對映的方法訪問硬碟上的檔案,效率要比read和write系統呼叫高,這是為什麼呢?原因是

read()是系統呼叫

,其中進行了資料拷貝,它首先將檔案內容從硬碟拷貝到核心空間的乙個緩衝區,

然後再將這些資料拷貝到使用者空間

,在這個過程中,實際上完成了 

兩次資料拷貝 

;而mmap()也是系統呼叫,如前所述,mmap()中沒有進行資料拷貝,

真正的資料拷貝是在缺頁中斷處理時進行的

,由於mmap()將檔案直接對映到使用者空間,所以中斷處理函式根據這個對映關係,

直接將檔案從硬碟拷貝到使用者空間

,只進行了 

一次資料拷貝 

。因此,記憶體對映的效率要比read/write效率高。

建立檔案對映示例:

#include 

#include 

#include 

#include 

using

namespace

std;  

intmain()  

//3.把檔案資料對映到程序的位址空間

void

* pvfile=

mapviewoffile

(       //失敗返回null

hmapfile,                     //檔案對映的控制代碼

file_map_read|file_map_write, //許可權

0,                            //高位偏移

0,                            //低位偏移    

0);                           //一次對映多少 64k,如果是0,則對映從偏移量到檔案末尾。

unsigned char

*p=(unsigned 

char

*)pvfile;   

//至此,就獲得了外部檔案test.dat在記憶體位址空間的對映,

//4.用指標p"折磨"這個檔案了

cstring s;  

p[size_low-1]='!'

;   

p[size_low-2]='x'

; //修改該檔案的最後兩個位元組(檔案大小<4gb高32位為0)

s.format("%s"

,p);  

//讀檔案的最後3個位元組

afxmessagebox(s);  

//5.結束

//unmapviewoffile(pvfile); //撤銷對映

//closehandle(hfile); //關閉檔案

return

0;  

}開啟檔案對映示例:

#include

#include

using namespace std;

int main()

記憶體對映檔案原理

首先,對映 這個詞,就和數學課上說的 一一對映 是乙個意思,就是建立一種一一對應關係,在這裡主要是只 硬碟上檔案 的位置與程序 邏輯位址空間 中一塊大小相同的區域之間的一一對應,如圖1中過程1所示。這種對應關係純屬是邏輯上的概念,物理上是不存在的,原因是程序的邏輯位址空間本身就是不存在的。在記憶體對...

記憶體對映檔案原理

目錄 一直都對記憶體對映檔案這個概念很模糊,不知道它和虛擬記憶體有什麼區別,而且對映這個詞也很讓人迷茫,今天終於搞清楚了。下面,我先解釋一下我對對映這個詞的理解,再區分一下幾個容易混淆的概念,之後,什麼是記憶體對映就很明朗了。首先,對映 這個詞,就和數學課上說的 一一對映 是乙個意思,就是建立一種一...

記憶體對映檔案原理

一直都對記憶體對映檔案這個概念很模糊,不知道它和虛擬記憶體有什麼區別,而且對映這個詞也很讓人迷茫,今天終於搞清楚了。下面,我先解釋一下我對對映這個詞的理解,再區分一下幾個容易混淆的概念,之後,什麼是記憶體對映就很明朗了。原理 首先,對映 這個詞,就和數學課上說的 一一對映 是乙個意思,就是建立一種一...