mmap 是什么?
本質是一種進程虛擬內存映射的方法,可以將一個文件、一段物理內存或其他對象映射到進程的虛擬內存地址空間。實現這樣的映射關系后,進程就可以采用指針的方式來讀寫操作這一段內存,進而完成對文件的操作,而不必再調用 read/write 等系統調用函數了。為什么對于大文件而言 mmap 的效率要高于 read/write?
調用 read/write 進行的常規的文件系統操作中,函數的調用過程:
- 進程發起讀文件請求。
- 內核通過查找進程文件符表,定位到內核已打開文件集上的文件信息,從而找到此文件的 inode。
- inode 在 address_space 上查找要請求的文件頁是否已經緩存在頁緩存中。如果存在,則直接返回這片文件頁的內容。
-
如果不存在,則通過 inode 定位到文件磁盤地址,將數據從磁盤復制到頁緩存。之后再次發起讀頁面過程,進而將頁緩存中的數據發給用戶進程。
所以,總結來說,常規的文件操作為了提高讀寫效率和保護磁盤,使用了頁緩存機制。這樣造成讀文件時需要先將文件頁從磁盤拷貝到頁緩存中,由于頁緩存處在內核空間,不能被用戶進程直接尋址,所以還需要將頁緩存中數據頁再次拷貝到內存對應的用戶空間中。這樣,通過了兩次數據拷貝過程,才能完成進程對文件內容的獲取任務。寫操作也是一樣,待寫入的 Buffer 在內核空間不能直接訪問,必須要先拷貝至內核空間對應的主存,再寫回磁盤中(延遲寫回),也是需要兩次數據拷貝。