内存映射文件

  

内存映射文件的概念:

通过内存映射函数,可以将磁盘文件全部或者部分映射到虚拟地址空间,一旦完成,对磁盘文件的访问,就可以像对内存文件一样便捷。通过该区域可以直接对被映射的磁盘文件进行访问.而不必执行文件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.

  在内存映射中存盘

    int msync(void *start, size_t length, int flags);
     msync是不用解除内存映射的情况下,把内存文件保存到磁盘上。
 
 
 
 
 
原文地址:https://www.cnblogs.com/Huayuan/p/2458596.html