【问题标题】: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文件,你也许可以避免双重复制;但必须处理未公布的文件更改。