淺談mmap()

原型:

#include <sys/man.h>
void * mmap(void *addr, size_t len, int port, int flag, int fildes)
參數fd爲即將映射到進程空間的文件描述字,一般由open()返回,同時,fd可以指定爲-1,此時須指定flags參數中的MAP_ANON,表明進行的是匿名映射(不涉及具體的文件名,避免了文件的創建及打開) 實際上目前的glibc 對malloc的實現,當malloc分配大於128K的內存時候,就是通過mmap實現匿名映射。
              len是映射到調用進程地址空間的字節數,它從被映射文件開頭offset個字節開始算起。
              prot參數指定共享內存的訪問權限。可取如下幾個值的或:PROT_READ(可讀),PROT_WRITE(可寫),PROT_EXEC(可執行),PROT_NONE(不可訪問)。
             flags由以下幾個常值指定:MAP_SHARED, MAP_PRIVATE, MAP_FIXED。其中,MAP_SHARED,MAP_PRIVATE必選其一,而MAP_FIXED則不推薦使用。
              如果指定爲MAP_SHARED,則對映射的內存所做的修改同樣影響到文件。如果是MAP_PRIVATE,則對映射的內存所做的修改僅對該進程可見,對文件沒有影響。
              offset參數一般設爲0,表示從文件頭開始映射。
              參數addr指定文件應被映射到進程空間的起始地址,一般被指定一個空指針,此時選擇起始地址的任務留給內核來完成。函數的返回值爲最後文件映射到進程空間的地址,進程可直接操作起始地址爲該值的有效地址。

  

APUE中總結了mmap和read/write的性能比較: 顯然,read 要先將磁盤複製到內核 ,再從內核複製到進程緩衝區,兩次複製,  而mmap直接對文件複製的緩衝區進行內存映射,複製只有一次。效率可想而知。

另外實踐證明,當要對一個文件頻繁的進行訪問,並且指針來回移動時,調用mmap比用常規的方法快很多。這一點也好理解,文件的內容很多都在實際的物理內存中。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章