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 從文件中讀回數據