Linux 内存映射
Linux 提供了 mmap 系统调用实现内存映射(Memory Map)。内存映射的意思是将一个文件映射到内存中,映射后可以大大加快文件的访问速度,从而提高程序的运行性能。
另外,进程之间也可以通过映射同一个普通文件实现共享内存。普通文件被映射到进程地址空间后,进程可以像访问普通内存一样对文件进行访问,不需要再调用 read
和 write
等操作。
函数原型
头文件
要使用内存映射相关接口函数,需要引入以下头文件。
#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_SHARED
、MAP_PRIVATE
、MAP_FIXED
,其中MAP_SHARED
和MAP_PRIVATE
必选其一,而MAP_FIXED
则不推荐使用。fd
:即将映射到进程空间的文件描述字,一般由open()
返回。也可以指定为 -1,但此时必须指定 flags 参数中的MAP_ANON
,表明进行的是匿名映射(不涉及具体的文件名,避免了文件的创建及打开,这种方式只能用于具有亲缘关系的进程间进行通信)。offset
:一般设为0,表示从文件头开始映射。
munmap 函数
int munmap(void *addr, size_t length);