記憶體對映檔案 虛擬記憶體

2021-10-07 07:35:30 字數 1554 閱讀 8853

windows提供了3種進行記憶體管理的方法: 

• 虛擬記憶體,最適合用來管理大型物件或結構陣列。 

• 記憶體對映檔案,最適合用來管理大型資料流(通常來自檔案)以及在單個計算機上執行的多個程序之間共享資料。 

• 記憶體堆疊,最適合用來管理大量的小物件。

再通俗點,就是比如 要讀取乙個檔案裡的東西 這時候你就得去硬碟讀,但是對映到記憶體後 就可以直接對這塊記憶體操作了;寫操作也乙個意思。。。。。就是把要在硬碟上搞的東西 弄到記憶體搞 搞起來方便

首先,「對映」這個詞,就和數學課上說的「一一對映」是乙個意思,就是建立一種一一對應關係,在這裡主要是指硬碟上檔案的位置與程序邏輯位址空間中一塊大小相同的區域之間的一一對應,如圖1中過程1所示。這種對應關係純屬是邏輯上的概念,物理上是不存在的,原因是程序的邏輯位址空間本身就是不存在的。在記憶體對映的過程中,並沒有實際的資料拷貝,檔案沒有被載入記憶體,只是邏輯上被放入了記憶體,具體到**,就是建立並初始化了相關的資料結構(struct address_space),這個過程有系統呼叫mmap()實現,所以建立記憶體對映的效率很高。

既然建立記憶體對映沒有進行實際的資料拷貝,那麼程序又怎麼能最終直接通過記憶體操作訪問到硬碟上的檔案呢?那就要看記憶體對映之後的幾個相關的過程了。

mmap()會返回乙個指標ptr,它指向程序邏輯位址空間中的乙個位址,這樣以後,程序無需再呼叫read或write對檔案進行讀寫,而只需要通過ptr就能夠操作檔案。但是ptr所指向的是乙個邏輯位址,要操作其中的資料,必須通過mmu將邏輯位址轉換成實體地址,如圖1中過程2所示。這個過程與記憶體對映無關。

前面講過,建立記憶體對映並沒有實際拷貝資料,這時,mmu在位址對映表中是無法找到與ptr相對應的實體地址的,也就是mmu失敗,將產生乙個缺頁中斷,缺頁中斷的中斷響應函式會在swap中尋找相對應的頁面,如果找不到(也就是該檔案從來沒有被讀入記憶體的情況),則會通過mmap()建立的對映關係,從硬碟上將檔案讀取到物理記憶體中,如圖1中過程3所示。這個過程與記憶體對映無關。

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

從**層面上看,從硬碟上將檔案讀入記憶體,都要經過檔案系統進行資料拷貝,並且資料拷貝操作是由檔案系統和硬體驅動實現的,理論上來說,拷貝資料的效率是一樣的。但是通過記憶體對映的方法訪問硬碟上的檔案,效率要比read和write系統呼叫高,這是為什麼呢?原因是read()是系統呼叫,其中進行了資料拷貝,它首先將檔案內容從硬碟拷貝到核心空間的乙個緩衝區,如圖2中過程1,然後再將這些資料拷貝到使用者空間,如圖2中過程2,在這個過程中,實際上完成了兩次資料拷貝;而mmap()也是系統呼叫,如前所述,mmap()中沒有進行資料拷貝,真正的資料拷貝是在缺頁中斷處理時進行的,由於mmap()將檔案直接對映到使用者空間,所以中斷處理函式根據這個對映關係,直接將檔案從硬碟拷貝到使用者空間,只進行了一次資料拷貝。因此,記憶體對映的效率要比read/write效率高。

虛擬記憶體 mmap檔案記憶體對映

記憶體對映是虛擬記憶體系統的重要特性,即虛擬記憶體中的虛擬頁 virtual page 總是對應於磁碟上的物理頁 physical page 記憶體對映技術,可以使得使用檔案來初始化虛擬記憶體的內容 只在第一次引用到相應記憶體時,才會快取進主存 linux程序中可以使用mmap函式,建立乙個虛擬記憶...

對映虛擬記憶體

沒有任何額外維護資料的記憶體分配 mmap 分配 munmap 釋放 分配空間大小 4k length 4k 1 以頁為單位,每頁通常為4k 函式說明 void mmap void start,指定對映的虛擬位址 0由系統指定開始位置 size t length,對映空間大小 pagesize倍數 ...

Linux 檔案對映虛擬記憶體操作

目錄 把硬碟資料搬到記憶體中去操作的方式被稱為檔案對映虛擬記憶體,由於記憶體訪問的特殊性,資料到了記憶體後可提高訪問和操作的速率。標頭檔案 函式原型 void mmap void start,size t length,int prot,int flags,int fd,off t offset i...