內存映射連續存儲大文件
Ⅰ 為什麼要內存映射
內存映射(mmap)是一種內存映射文件的方法,即將一個文件或者其他對象映射到進程的地址空間,實現文件磁碟地址和應用程序進程虛擬地址空間中一段虛擬地址的一一映射關系。實現這樣的映射關系後,進程就可以採用指針的方式讀寫操作這一段內存,而系統會自動回寫藏頁面到對應的文件磁碟上。應用程序處理映射部分如同訪問主存。(1)線程啟動映射過程,並在虛擬地址空間中為映射創建虛擬映射區域。
先在用戶空間調用庫函數mmap,並在進程當前進程的虛擬地址空間中,尋找一段空閑的滿足要求的連續虛擬地址作為內存虛擬映射區域,對此區域初始化並插入進程的虛擬地址區域鏈表或樹中。
(2)系統在內核空間調用內核函數mmap,實現文件物理地址和進程虛擬地址之間的一一映射關系。
(3)進程發起堆這片映射空間的訪問
進程讀寫操作訪問虛擬地址,查詢頁表,發現這一段地址並不在內存的物理頁面上,因為雖然建立了映射關系,但是還沒有將文件從磁碟移到內存中。由此發生缺頁中斷,內核請求從磁碟調入頁面。調頁過程先在交換緩存空間(swap cache)中查找,若沒有則通過nopage函數把缺失頁從磁碟調入內存。之後進程會對其做讀寫操作,若寫操作改變了頁面內容,一段時間後系統會自動回寫臟頁面到磁碟中。(修改過的臟頁面不會立即更新到文件中,可以調用msync來強制同步,寫入文件)
Ⅱ 內存映射文件是怎麼回事
內存映射文件,一種將磁碟文件與內存空間建立映射的技術,使進程的虛擬地址空間與磁碟文件的部分或全部內容形成關聯。創建映射後,進程可以直接訪問映射區域內的數據,無需執行文件I/O操作或進行緩沖處理。
這種技術就像是整個被映射的文件已載入到內存中,特別適合管理大文件,提升處理效率。內存映射文件技術在處理大文件或頻繁文件讀寫時,能顯著提高程序運行速度。
通過內存映射,磁碟上的文件所在空間被虛擬化為內存區域,程序訪問時採用內存訪問方式,省去了傳統I/O操作的步驟。真正執行讀寫時,會將虛擬內存內容換頁到物理內存中。
簡單來說,內存映射文件利用虛擬內存技術加速處理過程,提供了一種高效訪問和操作大文件的方法,提升了程序性能。