我对存储映射I/O的理解

存储映射,就是讲磁盘文件映射到内存,则对相应内存的操作就相当于对磁盘文件的操作。

和存储映射相关的4个函数:mmap,mprotect,msync,munmap

1.void *mmap(void *addr,size_t len,int pro,int flags,int filedes,off_t offset)  /*建立存储映射*/

作用: 一、就是建立文件filedes中从offset开始起的到内存的映射,映射的长度为len,

 二、映射的地址与flags的值及addr的值有关,如果flag为MAP_FIXED则必须映射到addr指定的内存区;

 如果flag不为MAP_FIXED 且addr不为0,则是推荐给系统,映射到内存addr的位置,系统可接受也可不接受而映射到其他地址

如果flag不问MAP_FIXED且addr为0,则由内核自己分配其地址

最终的地址都将返回

三、pro 就是对存储区的读写执行等的操作。不可和打开原始文件时的操作冲突。

四、flags的值可为MAP_SHARED,MAP_PRIVATE,MAP_FIXED。

1.MAP_SHARED时,对存储区的操作直接影响到源文件

2.MAP_PRIVATE时,相当于进程对映射存储区的一个副本,对该副本的操作不会影响到源文件

3.MAP_FIXED的作用如上

 2.int mprotect(void *addr,size_t len,int pro)

建立好存储映射后,对映射区的读写执行方式进行修改


3.int msync(void *addr,size_t len,int flags)

映射存储区与源文件的同步


4.int munmap(void *addr, size_t len)

关闭映射存储区与源文件的关系,并不是消除掉映射存储区。即映像存储区仍然存在,只是此时对映像存储区的操作不再会映像到源文件。


注意:1.addr ,offset 要是页大小的整数倍。

2.必须先打开文件,放开对其进行存储映射

3.在map时将flag指定为MAP_SHARED的情况下,如果文件中的内容改变,则会自动更新映射区的内容。

 

你可能感兴趣的:(存储,磁盘)