下面通过mmap函数,分析一下共享映射I\O的过程;
假设这里使用普通文件进行映射,因为现代系统大部分都是采取段页式存储,所以很明显,将普通文件的数据放进映射区的时候,是按照页面大小的整数倍进行分配的,而且文件放在物理内存中也是页的整数倍,那么文件映射的偏移量应该是页面大小整数倍。
#include <sys/mman.h>
void *mmap(void *addr, size_t len, int prot, int flags, int fd, off_t offset);
若成功则返回被映射区的起始地址,若出错则返回MAP_FAILED
addr:指定被映射到进程空间内的起始地址,通常设为 NULL,代表让系统自动选定地址,映射成功后返回该地址。
len:映射到调用进程地址空间中的字节数。
prot:内存映射区域的保护方式。常用 PROT_READ | PROT_WRITE
PROT_EXEC 映射区域可被执行
PROT_READ 映射区域可被读取
PROT_WRITE 映射区域可被写入
PROT_NONE 映射区域不能存取
flags:MAP_SHARED 和 MAP_PRIVATE 必须指定一个,其他可选。
MAP_SHARED 调用进程对被映射数据所作修改对于共享该对象的所有进程可见,并且改变其底层支撑(物理内存) 并不是改变内存数据就马上写回磁盘。这个取决于虚拟存储的实现。
MAP_PRIVAT