据说mmap()将文件映射到内存,并且它花费在调用进程的虚拟地址空间内存中.它是否真的将数据复制到内存中,或者数据是否仍存在于磁盘中?是mmap()不是更快read()?
Die*_*Epp 26
该mmap函数唯一真正做的是更改一些内核数据结构,可能还有页表.它根本没有把任何东西放到物理内存中.在您调用之后mmap,分配的区域可能甚至没有指向物理内存:访问它将导致页面错误.这种页面错误由内核透明处理,实际上,这是内核的主要职责之一.
发生的事情mmap是数据保留在磁盘上,并在进程读取时从磁盘复制到内存.它也可以推测性地复制到物理内存.当您的进程被换出时,mmap区域中的页面不必写入交换,因为它们已经被长期存储支持 - 当然,除非您已经修改过它们.
但是,mmap会消耗虚拟地址空间,就像malloc和其他类似的功能一样(主要是mmap在幕后使用,或者sbrk,基本上是特殊版本mmap).使用mmap读取文件和read读取文件之间的主要区别在于,mmap区域中未修改的页面不会对整体内存压力产生影响,只要它们没有被使用,它们几乎是"免费的",内存方式.相反,使用该read功能读取的文件无论是否正在使用,都将导致内存压力,以及它们是否已被修改.
最后,mmap它比read仅在其有利的用例中更快- 随机访问和页面重用.对于线性遍历文件(尤其是小文件),read通常会更快,因为它不需要修改页表,并且它需要较少的系统调用.
作为建议,我可以说,您将要扫描的任何大型文件通常应该mmap在64位系统上完整地读取,并且您可以mmap在虚拟内存不太可用的32位系统上进行整理.
另请参阅:mmap()与读取块
另请参阅(感谢James):我应该何时使用mmap进行文件访问?
| 归档时间: |
|
| 查看次数: |
9718 次 |
| 最近记录: |