深入理解内存映射:原理、操作与应用
1. 内存映射概述
内存映射是一种将内存区域与磁盘文件系统中的常规文件或块设备文件的某部分相关联的技术。当访问内存区域页面内的某个字节时,内核会将其转换为对文件中相应字节的操作。内存映射主要分为两种类型:
-共享映射(Shared):对内存区域页面的每次写操作都会改变磁盘上的文件。若一个进程向共享内存映射的页面写入数据,这些更改对所有映射同一文件的其他进程都是可见的。
-私有映射(Private):通常用于进程仅为读取文件而创建映射的情况,在这种场景下,私有映射比共享映射更高效。对私有映射页面的写操作会使其停止映射文件中的该页面,写操作既不会改变磁盘上的文件,也不会让其他访问同一文件的进程看到这些更改。不过,未被进程修改的私有内存映射页面会受到其他进程对文件更新的影响。
进程可以通过mmap()系统调用创建新的内存映射,程序员需要在系统调用参数中明确指定MAP_SHARED或MAP_PRIVATE标志来确定映射类型。创建映射后,进程可以通过读取新内存区域的内存位置来读取文件存储的数据;若为共享内存映射,进程还能通过向相同内存位置写入数据来修改相应文件。若要销毁或缩小内存映射,进程可使用munmap()系统调用。一般来说,共享内存映射对应的内存区域会设置VM_SHARED标志,私有内存映射则会清除该标志,但只读共享内存映射存在例外情况。