为什么mmap()比顺序IO更快?

可能重复:
mmap()与读取块

我听说(在互联网上阅读它), mmap()比顺序IO更快。 它是否正确? 如果是的话为什么它更快?

  • mmap()不是按顺序读取的。
  • mmap()必须从read()中获取磁盘本身
  • 映射区域不是顺序的 – 所以没有DMA(?)。

所以mmap()实际上应该比文件中的read()慢? 我上面哪个假设是错误的?

Solutions Collecting From Web of "为什么mmap()比顺序IO更快?"

我听说(在互联网上阅读它),mmap()比顺序IO更快。 它是否正确? 如果是的话为什么它更快?

它可以是 – 有利弊,列在下面。 当你真的有理由关心,总是基准

除了实际的IO效率之外,应用程序代码在需要执行I / O时需要跟踪的方式以及执行数据处理/生成有时会产生影响,这些数据处理/生成有时会显着影响性能。

1)mmap()不能顺序读取。 2)mmap()必须从磁盘本身读取相同的read()3)映射区域是不连续的 – 所以没有DMA(?)。

所以mmap()实际上应该比文件中的read()慢? 我上面哪个假设是错误的?

1)是错误的… mmap()分配一个与文件内容相对应的虚拟地址空间的区域…每当访问该地址空间中的页面时,发现物理RAM支持虚拟地址,并且相应的磁盘内容发生故障进入那个RAM。 因此,从磁盘读取的顺序与访问顺序相匹配。 这是一个“懒惰”的I / O机制。 例如,如果需要索引一个从磁盘读取的大型哈希表,那么对该文件进行mmap并开始进行访问意味着磁盘I / O不会按顺序进行,因此可能会导致更长的时间直到整个文件被读入内存中,但是当这种情况发生时,查找是成功的,并且可以进行依赖性的工作,如果文件的某些部分从未真正需要,就不会被读取(允许磁盘和内存页的粒度,即使在使用内存映射许多操作系统时,您也可以指定一些关于您的计划访问模式的性能增强/内存效率提示,以便他们可以主动提前读取内存或更积极地释放内存,知道不太可能返回到内存)。

2)绝对正确

3)“映射区域不连续”是模糊的。 内存映射区域在虚拟地址空间中是“连续的”(连续的)。 我们已经讨论过上面顺序的磁盘I / O了。 或者,你在想别的什么吗? 无论如何,当页面出现错误时,它们可能确实是使用DMA进行传输的。

此外,为什么内存映射可能优于通常的I / O还有其他一些原因:

  • 有更少的复制:
    • 通常OS和库级例程在数据到达应用程序指定的缓冲区之前通过一个或多个缓冲区传递数据,应用程序然后动态分配存储,然后从I / O缓冲区复制到该存储区,以便数据在文件读取完成后可用
    • 内存映射允许(但不强制)就地使用(你可以只记录一个指针,可能的长度)
      • 继续访问数据就地风险后来增加了交换:文件/内存映射可能比它可以被解析的数据结构更冗长,所以其中数据的访问模式可能在更多的内存页面上有更多的延迟
  • 内存映射可以通过让应用程序将整个文件内容视为可访问来简化应用程序的分析工作,而不用担心何时读取另一个缓冲区
  • 应用程序更多地依赖于操作系统在任何时间点处于物理RAM中的智慧页数,有效地与应用程序共享直接访问磁盘缓存
  • 下面还有许多评论,“使用内存映射你通常使用较少的系统调用”
  • 如果多个进程访问相同的文件,他们应该能够共享物理支持页面

这也是为什么mmap可能会变慢的原因 – 请阅读Linus Torvald的帖子,里面写着mmap

…页面游戏以及错误(甚至只是TLB错过)​​的开销很容易超过复制页面的流畅方式的成本…

并从他的另一个职位 :

  • 非常明显的设置和拆卸成本。 我的意思是明显的 。 这是像下面的表格来清理干净的一切。 这是保存所有映射列表的簿记。 这是在取消映射东西后需要的TLB刷新。

  • 页面错误是昂贵的。 这就是地图填充的方式,而且速度很慢。

FWIW,这是我工作的最后一次,内存映射输入速度比fread等人在将二进制数据库记录读入专有数据库的64位Linux上大约快170%。

  1. mmap()可以在进程之间共享。
  2. DMA将尽可能使用。 DMA不需要连续的内存 – 许多高端卡支持分散 – 收集DMA。
  3. 如果可能,内存区域可以与内核块缓存共享。 所以有出租人复制。
  4. mmap内存是由内核分配的,它总是对齐的。

绝对的“更快”不存在。 你必须指定约束和情况。

mmap()不能顺序读取。

什么让你有那个想法? 如果您真的按顺序访问映射的内存,系统通常会按照该顺序获取页面。

mmap()必须从read()中获取磁盘本身

当然,但操作系统决定时间和缓冲区大小

映射区域不是顺序的 – 所以没有DMA(?)。

往上看

mmap帮助的是没有涉及额外的用户空间缓冲区,“读取”发生在操作系统内核认为合适的地方,并且可以被优化。 这在速度上可能是一个优势,但首先这只是一个更容易使用的界面。

如果你想了解一个特定的设置(硬件,操作系统,使用模式)的速度,你必须测量。