Memory-Mapped I/O


  Memory mapped I/O就是把磁盤上的file映射到內存上,當我們從內存上fetch byte時,對應的file就被讀取。同樣的,當我們在內存上存儲字節的時候,對應的file就被寫入。這就讓我們不需通過read和write系統調用而去操作I/O。

  mmap內存映射建立一段可以被多個進程讀寫的內存段。共享內存。

  mmap函數作用是告訴內核把給定的文件file映射到內存的一塊空間,mmap函數原型如下:

#include <sys/mmam.h>
void *mmap(void *addr, size_t len, int prot,
            int flag, int fields, off_t off);

  函數返回值就是the starting address of the mapped area。

  參數addr代表被映射到內存的地址。一般把addr設置成為0,讓操作系統自己去選擇該映射到內存的那個地址上。

  參數fields就是要被映射的文件的文件描述符。在把這個文件映射到內存空間之前,我們必須先open這個文件描述符。

  參數len代表the number of bytes to map。

  參數off is the starting offset in the file of the bytes to map。

  參數prot的值和代表的含義如下表格,prot用於設置內存段的訪問權限

  

PROT_READ Region can be read
PROT_WRITE Region can be write
PROT_EXEC Region can be execute
PROT_NONE Region cannot be accessed

 

 

 

 

  參數flag代表內存映射區的屬性:

MAP_FIXED   內存段必須位於addr指定的位置

MAP_SHARED  內存段是共享的,對內存段的修改保存到磁盤文件中

MAP_PRIVATE  內存段是私有的,對內存段的修改只對本進程內部有效

 

  msync函數的作用:把在內存段的某個部分或整段中的修改寫回到映射的文件中。

int msync(void * addr, size_t len, int flag);

flag控制執行修改的具體方式:

MS_ASYNC  采用異步寫方式

MS_SYNC  采用同步寫方式

MS_INVALIDATE  從文件中讀回數據

 

 

 

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM