MMap

  1. mmap 是什么?
    本質(zhì)是一種進(jìn)程虛擬內(nèi)存映射的方法,可以將一個(gè)文件、一段物理內(nèi)存或其他對(duì)象映射到進(jìn)程的虛擬內(nèi)存地址空間。實(shí)現(xiàn)這樣的映射關(guān)系后,進(jìn)程就可以采用指針的方式來(lái)讀寫操作這一段內(nèi)存,進(jìn)而完成對(duì)文件的操作,而不必再調(diào)用 read/write 等系統(tǒng)調(diào)用函數(shù)了。

  2. 為什么對(duì)于大文件而言 mmap 的效率要高于 read/write?
    調(diào)用 read/write 進(jìn)行的常規(guī)的文件系統(tǒng)操作中,函數(shù)的調(diào)用過(guò)程:

  • 進(jìn)程發(fā)起讀文件請(qǐng)求。
  • 內(nèi)核通過(guò)查找進(jìn)程文件符表,定位到內(nèi)核已打開文件集上的文件信息,從而找到此文件的 inode。
  • inode 在 address_space 上查找要請(qǐng)求的文件頁(yè)是否已經(jīng)緩存在頁(yè)緩存中。如果存在,則直接返回這片文件頁(yè)的內(nèi)容。
  • 如果不存在,則通過(guò) inode 定位到文件磁盤地址,將數(shù)據(jù)從磁盤復(fù)制到頁(yè)緩存。之后再次發(fā)起讀頁(yè)面過(guò)程,進(jìn)而將頁(yè)緩存中的數(shù)據(jù)發(fā)給用戶進(jìn)程。

    所以,總結(jié)來(lái)說(shuō),常規(guī)的文件操作為了提高讀寫效率和保護(hù)磁盤,使用了頁(yè)緩存機(jī)制。這樣造成讀文件時(shí)需要先將文件頁(yè)從磁盤拷貝到頁(yè)緩存中,由于頁(yè)緩存處在內(nèi)核空間,不能被用戶進(jìn)程直接尋址,所以還需要將頁(yè)緩存中數(shù)據(jù)頁(yè)再次拷貝到內(nèi)存對(duì)應(yīng)的用戶空間中。這樣,通過(guò)了兩次數(shù)據(jù)拷貝過(guò)程,才能完成進(jìn)程對(duì)文件內(nèi)容的獲取任務(wù)。寫操作也是一樣,待寫入的 Buffer 在內(nèi)核空間不能直接訪問(wèn),必須要先拷貝至內(nèi)核空間對(duì)應(yīng)的主存,再寫回磁盤中(延遲寫回),也是需要兩次數(shù)據(jù)拷貝。

而使用 mmap 進(jìn)行的文件操作中,首先會(huì)創(chuàng)建新的虛擬內(nèi)存區(qū)域與文件磁盤地址之間的映射關(guān)系,在之后數(shù)據(jù)訪問(wèn)中,如果發(fā)現(xiàn)內(nèi)存中并無(wú)相應(yīng)的數(shù)據(jù),則發(fā)起缺頁(yè)異常,通過(guò)已經(jīng)建立好的映射關(guān)系,只使用一次數(shù)據(jù)拷貝就將數(shù)據(jù)從磁盤中拷貝到用戶空間中,供用戶態(tài)進(jìn)程使用。

參考

  1. Linux 操作系統(tǒng)原理 — mmap() 進(jìn)程虛擬內(nèi)存映射
  2. Linux內(nèi)存映射mmap原理分析
  3. [原創(chuàng)] 深入剖析mmap原理 - 從三個(gè)關(guān)鍵問(wèn)題說(shuō)起
  4. mmap原理之詳解
  5. mmap機(jī)制初探
  6. 理解inode
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容