【问题标题】:Memory mapping and file I/O内存映射和文件 I/O
【发布时间】:2011-01-19 09:39:15
【问题描述】:

如果我在 1GB 的机器上内存映射了一个大小为 10GB 的文件,并且如果我触发了文件 i/o,在确保请求的数据不在物理内存中之后,获取的数据是否会映射到相应的虚拟内存mmap 中的地址?

当我使用 mmap 访问同一个位置时,它会再次执行 i/o(还是会利用使用文件 i/o 获取的数据)

提前致谢,

悟空。

【问题讨论】:

  • 什么操作系统?什么硬件?什么语言平台?
  • 我实际上正在寻找一种适用于 Windows、Linux 和 Open Solaris 的通用解决方案。

标签: mmap


【解决方案1】:

这取决于平台,但通常它会像其他内存一样被处理(不使用时换出,需要时换入),除了它不是使用普通交换文件/分区而是从原始交换文件/分区磁盘上的文件。

【讨论】:

  • 假设我使用文件 i/o 读取文件的一部分,我可以将该内存分配到 mmap 中的一个地址范围吗?
  • 不,你不使用文件 i/o - 你映射文件,然后像访问内存一样访问它。
  • 好的。谢谢。我实际上打算将异步 i/o 与 mmap 结合起来,但似乎不可能。
  • @Gokul - 内存映射 IO 本质上是同步操作。当您的线程遇到需要从磁盘加载的页面时,这是因为 CPU 在尝试访问某些内存时出现页面错误。在检索到该页面或 IO 以错误结束之前,线程无法执行任何其他操作。它不像你可以返回并稍后返回的异步操作 - 线程隐含地需要该数据才能继续。
  • @Gokul - 通常是的,因为现在页面将被缓存;假设您不进行无缓冲 IO 并且操作系统实现了统一的缓冲区缓存(大多数都这样做)。为了完成同样的事情并为自己节省读取缓冲区,您不妨让另一个线程提前读取每个页面的第一个字节并首先引发页面错误。
猜你喜欢
  • 2016-05-27
  • 2017-06-08
  • 1970-01-01
  • 2017-05-17
  • 2011-10-11
  • 1970-01-01
  • 2011-12-15
  • 2016-11-16
  • 2015-09-11
相关资源
最近更新 更多