mmap真的会将数据复制到内存中吗?
据说mmap()将文件映射到内存,并且它花费在调用进程的虚拟地址空间内存中.它是否真的将数据复制到内存中,或者数据是否仍存在于磁盘中? mmap()比read()更快吗?
解决方法
mmap函数唯一真正做的就是更改一些内核数据结构,可能还有页表.它根本没有把任何东西放到物理内存中.调用mmap后,分配的区域可能甚至没有指向物理内存:访问它会导致页面错误.这种页面错误由内核透明处理,实际上,这是内核的主要职责之一.
mmap的作用是数据保留在磁盘上,并在进程读取时从磁盘复制到内存.它也可以推测性地复制到物理内存.当你的进程被换出时,mmap区域中的页面不必写入swap,因为它们已经被长期存储支持 – 当然,除非你已经修改了它们. 但是,mmap将消耗虚拟地址空间,就像malloc和其他类似的函数(大多数在幕后使用mmap,或sbrk,它基本上是mmap的特殊版本).使用mmap读取文件和读取读取文件之间的主要区别在于,mmap区域中未修改的页面不会对整体内存压力产生影响,只要它们没有被使用,它们几乎是“免费”的,内存方面的. .相比之下,使用读取功能读取的文件无论是否正在使用,都将导致内存压力,以及它们是否已被修改. 最后,mmap比它所支持的用例中的读取更快 – 随机访问和页面重用.对于线性遍历文件,尤其是小文件,读取通常会更快,因为它不需要修改页表,并且它需要较少的系统调用. 作为建议,我可以说你要扫描的任何大文件通常应该在64位系统上使用mmap完整读取,并且你可以在32位系统上以块的形式对其进行mmap,其中虚拟内存不太可用. 另见:mmap() vs. reading blocks 另见(感谢詹姆斯):When should I use mmap for file access? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |