我在下面的链接中读到了关于内存映射的内容
https://en.wikipedia.org/wiki/Memory-mapped_file
http://en.wikipedia.org/wiki/Memory-mapped_I/O
用于映射文件和设备。它说文件映射的优势在于它比从磁盘/闪存直接读取更快。但是为什么花费相同的时间将数据从磁盘/闪存复制到虚拟内存?
但无法找到使用内存映射I / O的优势。与直接阅读相比有什么好处?
由于内存映射在虚拟内存中具有特定区域,因此它位于堆内存之上且位于堆栈空间之下。因为我们可以控制进程的堆和堆栈空间。如何控制(即增加/减少)虚拟内存中的内存映射区域?
答案 0 :(得分:1)
首先要了解堆和堆栈本身由内存映射组成。每个userland进程都有一个内存映射表,这就是它与内核内存管理器交互的方式。内存映射具有不同的配置和功能。有关设置列表,请参阅mmap(2)
手册页。
使用文件支持的mmap,内核以高度优化的方式以页面大小(4096字节)为单位管理文件的缓存。
如果要按顺序读取文件,那么内存映射没有任何优势。
如果您要以随机访问方式读取文件,那么内存映射文件可能会更高效(通常是),因为内核会自动为您应用缓存策略,并且在大多数平台上都支持CPU。
粗略地说,该文件被分为4096个字节块(页面)。当从存储器读取一个字节(使用存储器映射中存储的变量)时,CPU将计算它所在的块(页),然后查询其页表以查看该页是否在物理存储器中。如果不是,则发生页面错误,并将页面加载到文件的物理内存(全部4096个字节)中。然后将访问转换为物理内存访问。
通过以这种方式按需加载文件,对于许多访问模式,它会更快。
将文件作为内存区域(使用指针算法),然后通过文件接口(搜索)访问也更加方便。
答案 1 :(得分:0)
但为什么花费相同的时间将数据从磁盘/闪存复制到虚拟内存?
使用read()系统调用的传统文件io有两个数据副本。 +从磁盘复制到缓冲区缓存中 +从缓冲区缓存中复制一个到read()调用提供的用户缓冲区。
使用mmap()我们可以直接将数据复制到用户缓冲区&& pagecache,是mmap()s版本的缓冲区缓存。
但是,mmap()和read()/ write()模型都有优点和缺点,大多数现代操作系统都将页面缓存和缓冲区缓存统一到一个统一缓存中。所以,不确定两者之间有多大的性能优势......
read()call =>系统调用。因此,除了上述内容之外,我们还缓存了读取,即fread(),其中我们将一些文件数据缓存在libc中的流中。这降低了系统调用更多数据的成本,但对于新数据,我们需要一个系统调用。对于mmap区域,访问新数据的成本是系统调用转换的故障成本。 IO费用仍然与你提示的相同。