原理記憶體對映,是把檔案中資料全部對映到記憶體中的嗎?還是只是對映一部分內容,那麼這部門內容又是如何確定呢?看這張圖
映**就不需要讀磁碟嗎,沒有磁碟io嗎? 沒有記憶體對映會怎麼樣 程序呼叫read,write的系統呼叫函式,核心程序把磁碟的資料讀到核心空間,然後在copy到使用者程序空間。沒錯,就是兩次複製。
而有了記憶體對映之後,使用者程序就可以採用指標的方式讀寫操作這一段記憶體,而系統會自動回寫髒頁面到對應的檔案磁碟上,即完成了對檔案的操作而不必再呼叫read,write等系統呼叫函式。
總而言之,常規檔案操作需要從磁碟到頁快取再到使用者主存的兩次資料拷貝。而mmap操控檔案,只需要從磁碟到使用者主存的一次資料拷貝過程。說白了,mmap的關鍵點是實現了使用者空間和核心空間的資料直接互動而省去了空間不同資料不通的繁瑣過程。因此mmap效率更高。
兩步走記憶體對映
在記憶體對映的過程中,並沒有實際的資料拷貝,檔案沒有被載入記憶體,只是邏輯上被放入了記憶體,這個過程由系統呼叫mmap()實現,所以建立記憶體對映的效率很高。
缺頁中斷
既然建立記憶體對映沒有進行實際的資料拷貝,那麼程序又怎麼能最終直接通過記憶體操作訪問到硬碟上的檔案呢?那就要看記憶體對映之後的幾個相關的過程了。
mmap()會返回乙個指標ptr,它指向程序邏輯位址空間中的乙個位址,這樣以後,程序無需再呼叫read或write對檔案進行讀寫,而只需要通過ptr就能夠操作檔案。但是ptr所指向的是乙個邏輯位址,要操作其中的資料,必須通過記憶體管理單元mmu將邏輯位址轉換成實體地址,如圖1中過程2所示。這個過程與記憶體對映無關。
前面講過,建立記憶體對映並沒有實際拷貝資料,這時,mmu在位址對映表中是無法找到與ptr相對應的實體地址的,也就是mmu失敗,將產生乙個缺頁中斷,缺頁中斷的中斷響應函式會在swap中尋找相對應的頁面,如果找不到(也就是該檔案從來沒有被讀入記憶體的情況),則會通過mmap()建立的對映關係,從硬碟上將檔案讀取到物理記憶體中,如圖1中過程3所示。這個過程與記憶體對映無關。
如果在拷貝資料時,發現物理記憶體不夠用,則會通過虛擬記憶體機制(swap)將暫時不用的物理頁面交換到硬碟上,如圖1中過程4所示。這個過程也與記憶體對映無關。
所以當mongodb讀取資料庫檔案的時候,首先做記憶體對映,讀取檔案變成了讀取記憶體操作,所以mongodb的查詢效率相當高,當然,如果你的記憶體不夠大,經常發生缺頁中斷,那麼效率會大打折扣了
mongodb學習整理之記憶體對映機制
認真分析mmap:是什麼 為什麼 怎麼用
記憶體對映檔案原理
首先,對映 這個詞,就和數學課上說的 一一對映 是乙個意思,就是建立一種一一對應關係,在這裡主要是只 硬碟上檔案 的位置與程序 邏輯位址空間 中一塊大小相同的區域之間的一一對應,如圖1中過程1所示。這種對應關係純屬是邏輯上的概念,物理上是不存在的,原因是程序的邏輯位址空間本身就是不存在的。在記憶體對...
記憶體對映檔案原理
目錄 一直都對記憶體對映檔案這個概念很模糊,不知道它和虛擬記憶體有什麼區別,而且對映這個詞也很讓人迷茫,今天終於搞清楚了。下面,我先解釋一下我對對映這個詞的理解,再區分一下幾個容易混淆的概念,之後,什麼是記憶體對映就很明朗了。首先,對映 這個詞,就和數學課上說的 一一對映 是乙個意思,就是建立一種一...
記憶體對映檔案原理
一直都對記憶體對映檔案這個概念很模糊,不知道它和虛擬記憶體有什麼區別,而且對映這個詞也很讓人迷茫,今天終於搞清楚了。下面,我先解釋一下我對對映這個詞的理解,再區分一下幾個容易混淆的概念,之後,什麼是記憶體對映就很明朗了。原理 首先,對映 這個詞,就和數學課上說的 一一對映 是乙個意思,就是建立一種一...