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ù)了隙畜。為什么對(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)核已打開(kā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ù)拷貝。