【问题标题】:Virtual memory: does the operating system always load the whole file into physical memory?虚拟内存:操作系统是否总是将整个文件加载到物理内存中?
【发布时间】:2020-07-24 08:42:28
【问题描述】:

我正在研究虚拟内存是如何工作的,但我不确定如果我用fread() 和类似的文件加载一个大文件(不过比物理内存小)会发生什么。

据我了解,操作系统可能不会分配整个相应的物理内存。相反,当我的程序读取文件的特定部分(尚未映射到物理内存的部分)时,它可以等到触发页面错误。

这基本上是内存映射文件的行为。那么,如果我的假设是正确的,那么使用像mmap() 这样的系统调用有什么好处呢?只是为了避免使用 fread() 阅读时通常的 for-loop 舞蹈,也许?

【问题讨论】:

    标签: memory operating-system hardware virtual-memory


    【解决方案1】:

    read(),fread() 会将您指定的数量读取到您提供的缓冲区中。 Mmap 是一个进入内核文件缓存的单独接口。两者相交之处在于内核很可能首先将文件读入缓存缓冲区,然后将这些缓存缓冲区的选择位复制到您的用户缓冲区中。

    这种双重复制通常是必要的,因为您的程序没有提供底层设备所需的必要对齐和阻塞大小,如果数据需要转换(解密、解压缩),它需要一个地方来完成。

    此内核缓存与文件保持一致,因此系统范围内的读取和写入都通过它进行。 如果你mmap文件,你也许可以避免双重复制;但必须处理未公布的文件更改。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-28
      • 2021-05-06
      • 1970-01-01
      • 1970-01-01
      • 2019-08-20
      • 1970-01-01
      相关资源
      最近更新 更多