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 从文件中读回数据