mmap和正常檔案操作的差別
對linux檔案系統不了解的朋友,請參閱我之前寫的博文《從核心檔案系統看檔案讀寫過程》,我們首先簡單的回顧一下正常檔案系統操作(調用read/fread等類函數)中,函數的調用過程:
1、程序發起讀檔案請求。
2、核心通過查找程序檔案符表,定位到核心已打開檔案集上的檔案資訊,進而找到此檔案的inode。
3、inode在address_space上查找要請求的檔案頁是否已經緩存在頁緩存中。如果存在,則直接傳回這片檔案頁的内容。
4、如果不存在,則通過inode定位到檔案磁盤位址,将資料從磁盤複制到頁緩存。之後再次發起讀頁面過程,進而将頁緩存中的資料發給使用者程序。
總結來說,正常檔案操作為了提高讀寫效率和保護磁盤,使用了頁緩存機制。這樣造成讀檔案時需要先将檔案頁從磁盤拷貝到頁緩存中,由于頁緩存處在核心空間,不能被使用者程序直接尋址,是以還需要将頁緩存中資料頁再次拷貝到記憶體對應的使用者空間中。這樣,通過了兩次資料拷貝過程,才能完成程序對檔案内容的擷取任務。寫操作也是一樣,待寫入的buffer在核心空間不能直接通路,必須要先拷貝至核心空間對應的主存,再寫回磁盤中(延遲寫回),也是需要兩次資料拷貝。
而使用mmap操作檔案中,建立新的虛拟記憶體區域和建立檔案磁盤位址和虛拟記憶體區域映射這兩步,沒有任何檔案拷貝操作。而之後通路資料時發現記憶體中并無資料而發起的缺頁異常過程,可以通過已經建立好的映射關系,隻使用一次資料拷貝,就從磁盤中将資料傳入記憶體的使用者空間中,供程序使用。
總而言之,正常檔案操作需要從磁盤到頁緩存再到使用者主存的兩次資料拷貝。而mmap操控檔案,隻需要從磁盤到使用者主存的一次資料拷貝過程。說白了,mmap的關鍵點是實作了使用者空間和核心空間的資料直接互動而省去了空間不同資料不通的繁瑣過程。是以mmap效率更高。
mmap優點總結
由上文讨論可知,mmap優點共有一下幾點:
1、對檔案的讀取操作跨過了頁緩存,減少了資料的拷貝次數,用記憶體讀寫取代I/O讀寫,提高了檔案讀取效率。
2、實作了使用者空間和核心空間的高效互動方式。兩空間的各自修改操作可以直接反映在映射的區域内,進而被對方空間及時捕捉。
3、提供程序間共享記憶體及互相通信的方式。不管是父子程序還是無親緣關系的程序,都可以将自身使用者空間映射到同一個檔案或匿名映射到同一片區域。進而通過各自對映射區域的改動,達到程序間通信和程序間共享的目的。
同時,如果程序A和程序B都映射了區域C,當A第一次讀取C時通過缺頁從磁盤複制檔案頁到記憶體中;但當B再讀C的相同頁面時,雖然也會産生缺頁異常,但是不再需要從磁盤中複制檔案過來,而可直接使用已經儲存在記憶體中的檔案資料。
4、可用于實作高效的大規模資料傳輸。記憶體空間不足,是制約大資料操作的一個方面,解決方案往往是借助硬碟空間協助操作,補充記憶體的不足。但是進一步會造成大量的檔案I/O操作,極大影響效率。這個問題可以通過mmap映射很好的解決。換句話說,但凡是需要用磁盤空間代替記憶體的時候,mmap都可以發揮其功效。