文件系统核心存储引擎_文件内存映射详解

文件内存映射详解

目录

在这里插入图片描述

文件映射应用场景

  1. 进程间共享信息

  2. 实现文件数据从磁盘到内存的映射,极大的提升应用程序访问文件的速度

进程间通信 - 文件映射原理(mmap函数)

原理:将一个文件或者其它对象映射进内存。
1.使用普通文件提供的内存映射
2.使用特殊文件提供匿名内存映射

在这里插入图片描述

进程间通信 - mmap实现

#include <sys/mman.h>

       void *mmap(void *addr, size_t length, int prot, int flags,
                  int fd, off_t offset);
       int munmap(void *addr, size_t length); 

参数addr:
指向欲映射的内存起始地址,通常设为 NULL,代表让系统自动选定地址,映射成功后返回该地址。

参数length:
代表将文件中多大的部分映射到内存。

参数prot:
映射区域的保护方式。可以为以下几种方式的组合:

      PROT_EXEC       执行    
      PROT_READ       读取    
      PROT_WRITE      写入   
      PROT_NONE       不能存取

进程间通信 - shm实现

参数flags:
影响映射区域的各种特性。必须要指定MAP_SHARED 或MAP_PRIVATE。

 MAP_SHARED     - 映射区域数据与文件对应,允许其他进程共享
 MAP_PRIVATE    - 映射区域生成文件的copy,修改不同步文件
 MAP_ANONYMOUS  - 建立匿名映射。此时会忽略参数fd,不涉及文件,而
                   且映射区域无法和其他进程共享。
 MAP_DENYWRITE  - 允许对映射区域的写入操作,其他对文件直接写入的
                   操作将会被拒绝。
 MAP_LOCKED     - 将映射区域锁定住,这表示该区域不会被置swap

参数fd:
要映射到内存中的文件描述符。如果使用匿名内存映射时,即flags中设置了MAP_ANONYMOUS,fd设为-1。有些系统不支持匿名内存映射,则可以使用fopen打开/dev/zero文件,然后对该文件进行映射,可以同样达到匿名内存映射的效果。

参数offset:
文件映射的偏移量,通常设置为0,代表从文件最前方开始对应,offset必须是分页大小的整数倍。

进程间通信 - mmap之 msync

实现磁盘文件内容于共享内存区中的内容一致,即同步操作。

函数原型

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

头文件

#include<sys/mman.h>   

addr:文件映射到进程空间的地址;
len:映射空间的大小;
flags: 刷新的参数设置,可以取值MS_ASYNC/ MS_SYNC

其中:

  1. 取值为MS_ASYNC(异步)时,调用会立即返回,不等到更新的完成;
  2. 取值为MS_SYNC(同步)时,调用会等到更新完成之后返回;

返回值
成功则返回0;失败则返回-1;

进程间通信 - mmap之 mremap

扩大(或缩小)现有的内存映射

函数原型

void * mremap(void *old_address, size_t old_size , size_t new_size, int flags);

头文件

#include <unistd.h> 
#include <sys/mman.h>

addr: 上一次已映射到进程空间的地址;
old_size: 旧空间的大小;
new_size: 重新映射指定的新空间大小;
flags: 取值可以是0或者MREMAP_MAYMOVE,0代表不允许内核移动映射区域, MREMAP_MAYMOVE则表示内核可以根据实际情况移动映射区域以找到一个符合 new_size大小要求的内存区域

返回值
成功则返回0;失败则返回-1;

结语:

时间: 2020-06-14

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值