跳到主要内容

Linux 内存映射

Linux 提供了 mmap 系统调用实现内存映射(Memory Map)。内存映射的意思是将一个文件映射到内存中,映射后可以大大加快文件的访问速度,从而提高程序的运行性能。

另外,进程之间也可以通过映射同一个普通文件实现共享内存。普通文件被映射到进程地址空间后,进程可以像访问普通内存一样对文件进行访问,不需要再调用 readwrite 等操作。

函数原型

头文件

要使用内存映射相关接口函数,需要引入以下头文件。

#include <sys/mman.h>

mmap 函数

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

参数说明:

  • addr:指定文件应被映射到进程空间的起始地址,一般被指定一个空指针(NULL),将选择起始地址的任务留给内核来完成。
  • length:映射到调用进程地址空间的字节数,它从被映射文件开头 offset 个字节开始算起。
  • prot:指定共享内存的访问权限。可选值有 PROT_READ(可读)、PROT_WRITE(可写)、PROT_EXEC(可执行)、PROT_NONE(不可访问)。
  • flags:用于设定映射的更新是否对映射同一区域的其他进程可见,以及是否将更新传递到底层文件。常用值有 MAP_SHAREDMAP_PRIVATEMAP_FIXED,其中 MAP_SHAREDMAP_PRIVATE 必选其一,而 MAP_FIXED 则不推荐使用。
  • fd:即将映射到进程空间的文件描述字,一般由 open() 返回。也可以指定为 -1,但此时必须指定 flags 参数中的MAP_ANON,表明进行的是匿名映射(不涉及具体的文件名,避免了文件的创建及打开,这种方式只能用于具有亲缘关系的进程间进行通信)。
  • offset:一般设为0,表示从文件头开始映射。

munmap 函数

int munmap(void *addr, size_t length);