为什么 mmap() (Memory Mapped File) 比 read() 快
我最近在研究Java NIO的MappedByteBuffer。我读过一些关于它的帖子,他们都提到“mmap()比read()快”
结论:
I treat MappedByteBuffer == Memory Mapped File == mmap()
read() 必须通过以下方式读取数据:磁盘文件 -> 内核 -> 应用程序,因此它具有上下文切换和缓冲区复制
他们都说mmap()的复制或系统调用比read()少,但据我所知,它也需要在第一次访问文件数据时从磁盘文件中读取。所以第一次读取:虚拟地址->内存->页错误->磁盘文件->内核->内存。除了你可以随机访问它之外,最后3个步骤(磁盘文件->内核->内存)与read()完全相同,那么mmap()如何比read()更少复制或系统调用?
mmap()和交换文件之间有什么关系,操作系统会将内存中最少使用的文件数据放入交换(LRU)中吗?因此,当您第二次访问这些数据时,操作系统会从交换文件中检索它们,而不是磁盘文件(无需复制到内核缓冲区),这就是为什么mmap()具有较少的复制和系统调用?
在java中,MappedByteBuffer是从堆中分配出来的(它是一个直接缓冲区)。因此,当您从MappedByteBuffer读取时,这是否意味着它需要从java堆外部再有一个额外的内存复制到java堆中?
任何人都可以回答我的问题吗?谢谢:)