磁盘映射MMAP
概述
存储映射
I/O (Memory-mapped I/O)
使一个磁盘文件与存储空间中的一个缓冲区相
映射。于是当从缓冲区中取数据,就相当于读文件中的相应字节。于此类似,将数据存
入缓冲区,则相应的字节就自动写入文件。这样,就可在不适用
read
和
write
函数
的情况下,使用地址(指针)完成
I/O
操作。 使用存储映射这种方法,首先应通知内
核,将一个指定文件映射到存储区域中。这个映射工作可以通过
mmap
函数来实现。

与文件读取的区别(了解)
首先简单的回顾一下常规文件系统操作(调用
read/fread
等类函数)中,函数的调用
过程:
1
、进程发起读文件请求。
2
、内核通过查找进程文件符表,定位到内核已打开文件集上的文件信息,从而找到此
文件的
inode(
存储文件元信息的区域
,
中文名索引节点
)
。
3
、
inode
在
address_space(
地址空间
)
上查找要请求的文件页是否已经缓存在页缓存
中。如果存在,则直接返回这片文件页的内容。
4
、如果不存在,则通过
inode
定位到文件磁盘地址,将数据从磁盘复制到页缓存。之后
再次发起读页面过程,进而将页缓存中的数据发给用户进程。
总结来说,常规文件操作为了提高读写效率和保护磁盘,使用了页缓存机制。这样造成
读文件时需要先将文件页从磁盘拷贝到页缓存中,由于页缓存处在内核空间,不能被用
户进程直接寻址,所以还需要将页缓存中数据页再次拷贝到内存对应的用户空间中。这
样,通过了两次数据拷贝过程,才能完成进程对文件内容的获取任务。写操作也是一
样,待写入的
buffer
在内核空间不能直接访问,必须要先拷贝至内核空间对应的主存,
再写回磁盘中(延迟写回),也是需要两次数据拷贝。
而使用
mmap
操作文件中,创建新的虚拟内存区域和建立文件磁盘地址和虚拟内存区域映
射这两步,没有任何文件拷贝操作。而之后访问数据时发现内存中并无数据而发起的缺
页异常过程,可以通过已经建立好的映射关系,只使用一次数据拷贝,就从磁盘中将数
据传入内存的用户空间中,供进程使用。
总而言之,常规文件操作需要从磁盘到页缓存再到用户主存的两次数据拷贝。而
mmap
操
控文件,只需要从磁盘到用户主存的一次数据拷贝过程。
mmap
效率更高
相关函数
mmap
函数
作用:
建立映射区
语法
所需头文件
#include <sys/mman.h>
函数