共享記憶體的原理 檔案對映

2021-08-25 22:39:38 字數 1355 閱讀 1210

mmap()是將指定的檔案利用虛擬記憶體技術對映到記憶體中去,在記憶體中建立頁表項,但mmap()呼叫建立的頁表項後面位址為空,只有使用到某個位址空間時才給此頁面分配空間,要涉及到頁面置換,因而需要有一定的物理記憶體做支撐,記憶體太小的話剛置入記憶體中的頁面又要被交換到磁碟上,mmap的效能將大打折扣。

mmap的優點主要在為使用者程式隨機的訪問,操作,檔案提供了乙個方便的操作方法;其次就是為不同程序共享大批量資料提供高效的手段;另外就是對特大檔案(無法一次性讀入記憶體)的處理提供了一種有效的方法。

檔案對映的優點:

先說結論:使用記憶體對映檔案來處理大檔案可以提高效率。 

為什麼呢?

我們先來看看如果不使用記憶體對映檔案的處理流程是怎樣的,首先我們得先讀出磁碟檔案的內容到記憶體中,然後修改,最後回寫到磁碟上。第一步讀磁碟檔案是要經過一次系統呼叫的,它首先將檔案內容從磁碟拷貝到核心空間的乙個緩衝區,然後再將這些資料拷貝到使用者空間,實際上是兩次資料拷貝。第三步回寫也一樣也要經過兩次資料拷貝。

所以我們基本上會有四次資料的拷貝了,因為大檔案資料量很大,幾十gb甚至更大,所以拷貝的開銷是非常大的。

而記憶體對映檔案是作業系統的提供的一種機制,可以減少這種不必要的資料拷貝,從而提高效率。它由mmap()將檔案直接對映到使用者空間,mmap()並沒有進行資料拷貝,真正的資料拷貝是在缺頁中斷處理時進行的,由於mmap()將檔案直接對映到使用者空間,所以中斷處理函式根據這個對映關係,直接將檔案從硬碟拷貝到使用者空間,所以只進行了一次資料拷貝 ,比read進行兩次資料拷貝要好上一倍,因此,記憶體對映的效率要比read/write效率高。

一般來說,read write操作可以滿足大多數檔案操作的要求,但是對於某些特殊應用領域所需要的幾十gb甚至更大的儲存,這種通常的檔案處理方法進行處理顯然是行不通的。

mmap將乙個檔案或者其它物件對映進記憶體。檔案被對映到多個頁上,如果檔案的大小不是所有頁的大小之和,最後乙個頁不被使用的空間將會清零。munmap執行相反的操作,刪除特定位址區域的物件對映。

當使用mmap對映檔案到程序後,就可以直接操作這段虛擬位址進行檔案的讀寫等操作,不必再呼叫read,write等系統呼叫.但需注意,直接對該段記憶體寫時不會寫入超過當前檔案大小的內容.

採用共享記憶體通訊的乙個顯而易見的好處是效率高,因為程序可以直接讀寫記憶體,而不需要任何資料的拷貝。對於像管道和訊息佇列等通訊方式,則需要在核心和使用者空間進行四次的資料拷貝,而共享記憶體則只拷貝兩次資料:一次從輸入檔案到共享記憶體區,另一次從共享記憶體區到輸出檔案。實際上,程序之間在共享記憶體時,並不總是讀寫少量資料後就解除對映,有新的通訊時,再重新建立共享記憶體區域。而是保持共享區域,直到通訊完畢為止,這樣,資料內容一直儲存在共享記憶體中,並沒有寫回檔案。共享記憶體中的內容往往是在解除對映時才寫回檔案的。因此,採用共享記憶體的通訊方式效率是非常高的。  

記憶體對映檔案實現共享記憶體

記憶體對映檔案程序間共享記憶體 記憶體對映檔案的另乙個功能是在程序間共享資料,它提供了不同程序共享記憶體的乙個有效 且簡單的方法。後面的許多例子都要用到共享記憶體。共享記憶體主要是通過對映機制實現的。windows 下程序的位址空間在邏輯上是相互隔離的,但在物理上卻是重疊的。所謂的重 對映檔案物件時...

記憶體對映檔案原理

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

記憶體對映檔案原理

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