mmap和常規檔案操作的區別

2021-08-20 06:11:41 字數 1387 閱讀 6316

對linux檔案系統不了解的朋友,請參閱我之前寫的博文《從核心檔案系統看檔案讀寫過程》,我們首先簡單的回顧一下常規檔案系統操作(呼叫read/fread等類函式)中,函式的呼叫過程:

1、程序發起讀檔案請求。

2、核心通過查詢程序檔案符表,定位到核心已開啟檔案集上的檔案資訊,從而找到此檔案的inode。

3、inode在address_space上查詢要請求的檔案頁是否已經快取在頁快取中。如果存在,則直接返回這片檔案頁的內容。

4、如果不存在,則通過inode定位到檔案磁碟位址,將資料從磁碟複製到頁快取。之後再次發起讀頁面過程,進而將頁快取中的資料發給使用者程序。

總結來說,常規檔案操作為了提高讀寫效率和保護磁碟,使用了頁快取機制。這樣造成讀檔案時需要先將檔案頁從磁碟拷貝到頁快取中,由於頁快取處在核心空間,不能被使用者程序直接定址,所以還需要將頁快取中資料頁再次拷貝到記憶體對應的使用者空間中。這樣,通過了兩次資料拷貝過程,才能完成程序對檔案內容的獲取任務。寫操作也是一樣,待寫入的buffer在核心空間不能直接訪問,必須要先拷貝至核心空間對應的主存,再寫回磁碟中(延遲寫回),也是需要兩次資料拷貝。

而使用mmap操作檔案中,建立新的虛擬記憶體區域和建立檔案磁碟位址和虛擬記憶體區域對映這兩步,沒有任何檔案拷貝操作。而之後訪問資料時發現記憶體中並無資料而發起的缺頁異常過程,可以通過已經建立好的對映關係,只使用一次資料拷貝,就從磁碟中將資料傳入記憶體的使用者空間中,供程序使用。

總而言之,常規檔案操作需要從磁碟到頁快取再到使用者主存的兩次資料拷貝。而mmap操控檔案,只需要從磁碟到使用者主存的一次資料拷貝過程。

說白了,mmap的關鍵點是實現了使用者空間和核心空間的資料直接互動而省去了空間不同資料不通的繁瑣過程。因此mmap效率更高。

回到頂部

由上文討論可知,mmap優點共有一下幾點:

1、對檔案的讀取操作跨過了頁快取,減少了資料的拷貝次數,用記憶體讀寫取代i/o讀寫,提高了檔案讀取效率。

2、實現了使用者空間和核心空間的高效互動方式。兩空間的各自修改操作可以直接反映在對映的區域內,從而被對方空間及時捕捉。

3、提供程序間共享記憶體及相互通訊的方式。不管是父子程序還是無親緣關係的程序,都可以將自身使用者空間對映到同乙個檔案或匿名對映到同一片區域。從而通過各自對對映區域的改動,達到程序間通訊和程序間共享的目的。

同時,如果程序a和程序b都映**區域c,當a第一次讀取c時通過缺頁從磁碟複製檔案頁到記憶體中;但當b再讀c的相同頁面時,雖然也會產生缺頁異常,但是不再需要從磁碟中複製檔案過來,而可直接使用已經儲存在記憶體中的檔案資料。

4、可用於實現高效的大規模資料傳輸。記憶體空間不足,是制約大資料操作的乙個方面,解決方案往往是借助硬碟空間協助操作,補充記憶體的不足。但是進一步會造成大量的檔案i/o操作,極大影響效率。這個問題可以通過mmap對映很好的解決。換句話說,但凡是需要用磁碟空間代替記憶體的時候,

mmap

都可以發揮其功效。

MMAP和read的區別

mmap操作提供了一種機制,讓使用者程式直接訪問裝置記憶體,這種機制,相比較在使用者空間和核心空間互相拷貝資料,效率更高。在要求高效能的應用中比較常用。mmap對映記憶體必須是頁面大小的整數倍,面向流的裝置不能進行mmap,mmap的實現和硬體有關。mmap 系統呼叫使得程序之間通過對映同乙個普通檔...

JBPM的常規操作

1.撤回到上乙個節點 刪除高經理審批之後所有的節點的審批意見 如果流程已經結束,需要處理流程例項表 delete fw wf course c where f.course id in 227072 and f.process instance id 2262335 1654048 將流程回滾到系統...

Git的常規操作

這裡記錄一些常用的git操作,以備不時之需 清除沒有執行add操作的檔案 git clean f 清除沒有執行add操作的資料夾 git clean df 丟棄沒有被commit的檔案的更改 git checkout filename 丟棄所有沒有被commit操作的問價的更改 git checko...