内存映射文件
内存映射文件的概念:
通过内存映射函数,可以将磁盘文件全部或者部分映射到虚拟地址空间,一旦完成,对磁盘文件的访问,就可以像对内存文件一样便捷。通过该区域可以直接对被映射的磁盘文件进行访问.而不必执行文件I/O操作也无需对文件内容进行缓冲处理。就好像整个被映射的文件都加载到了内存一样,因此内存文件映射非常适合于用来管理大文件。
内存映射文件的用途:
系统用内存映射文件加载和执行EXE,DLL文件,既节省了page file的空间,又加快了程序的执行。
用内存映射文件机制访问文件遮蔽了对文件I/O操作和文件内容的缓存操作。
它是最有效的进程通信机制,其他的进程通信都基于内存文件映射。
原型: void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offsize);
内存映射的步骤:
用open系统调用打开文件, 并返回描述符fd.
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
name是文件名字,可以是绝对路径,也可是相对路径
flag,文件属性.O_RDONLY,O_WRONLY ,O_RDWR,O_CREAT,O_EXCL
mode 权限码
int fstat(int filedes, struct stat *buf);
fstat执行成功后,stat.st_size即是文件尺寸.
用mmap建立内存映射, 并返回映射首地址指针start.
void *mmap(void *start, size_t length, int prot, int flags,
int fd, off_t offset);
start是表示开始映射的物理地址,如果为NULL表示由内核自行选择合适空间来分配。
length是内存的大小,一般是和第二步的同一大小。
prot 是共享内存属性。它有如下值
PROT_EXEC 分配空间可执行
PROT_READ 分配空间可读
PROT_WRITE 可写
PROT_NONE 禁止访问,一般为省事,都设为 PROT_READ|PROT_WRITE
flags 是共享内存的标志位,它有如下取值
MAP_FIXED ,内存固定大小,不能超过一页。如果超过将mmap失败.
MAP_SHARED ,在多个进程间共享这一内存
MAP_PRIVATE, 只供本进程使用。
对映射(文件)进行各种操作, 显示(printf), 修改(sprintf).
用munmap(void *start, size_t lenght)关闭内存映射.
int munmap(void *start, size_t length);
用close系统调用关闭文件fd.
在内存映射中存盘
msync是不用解除内存映射的情况下,把内存文件保存到磁盘上。