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

 

 

 

 

 

 

 

 

 

 

 

posted @ 2012-07-01 13:47  鼻子很帅的猪  阅读(4773)  评论(0编辑  收藏  举报