![常规读取可以从 mmap 中受益吗?](https://linux22.com/image/105808/%E5%B8%B8%E8%A7%84%E8%AF%BB%E5%8F%96%E5%8F%AF%E4%BB%A5%E4%BB%8E%20mmap%20%E4%B8%AD%E5%8F%97%E7%9B%8A%E5%90%97%EF%BC%9F.png)
如果我在某些文件描述符 fd 上使用 mmap,对 read() 的常规调用是否会“意识到”存在文件的内存映射并直接从内存中读取?
如果在 mmap() 之后使用 mlock() 会怎样。文件上的后续 read() 不需要访问磁盘,这样说是否正确?
答案1
我想这取决于你所说的“意识到”是什么意思。
只要read()
s 系统调用是请求内核将文件的内容从当前位置开始复制到程序指定的内存缓冲区,则read()
无论是否同时存在内存,常规文件都会以相同的方式完成此任务文件的映射。没有“意识”。
现在,如果文件同时是mmap()
ed 和read()
,很可能会实现性能优化。例如,如果文件是read()
第一个,则已读取的文件部分可能已经在页面缓存中,并且随后访问内存映射将不必再次从磁盘访问它们。或者相反,如果存在已分页的内存映射,则后续的内存映射read()
将不必再次访问磁盘。因此,从某种意义上说,您可能会考虑mmap()
并read()
“意识到”彼此。