何时使用mmap,何时使用带缓存层的读写?(针对IT技术相关问题)

3

在研究数据库存储引擎时,似乎大多数使用mmap进行持久化。但是,在什么情况下,通过写入缓存层并使用读取和写入将二进制数据写入磁盘是有意义的呢?

我想要理解的是mmap和unmmap与读取和写入之间的区别是什么?何时使用其中一个或另一个?


系统调用是昂贵的。虚拟内存通常更快,因为它只需要在页面不在RAM中时执行上下文切换。 - undefined
这是唯一的区别吗? - user6157733
请记住,与实际磁盘I/O相比,系统调用的开销可能微不足道(假设您的缓存设计不会为每个字节进行读写!)。内存映射文件本质上只是将缓存行为委托给内核(这非常简单,但如果您想在性能/延迟权衡方面达到极致,它最终会变得不太灵活)。 - undefined
1个回答

10
如果您可以使用mmap(),通常这是更好的方法。当您使用read()/write()时,您必须为每个操作执行系统调用(尽管像stdio这样的库通过用户模式缓冲最小化了这一点),并且这些上下文切换很昂贵。即使文件块在缓冲区高速缓存中,您也必须首先切换到内核以进行检查。此外,内核需要将数据从内核缓冲区复制到调用者的内存中。
另一方面,当您使用mmap()时,您只需要在第一次打开和映射文件时执行系统调用。此后,虚拟内存子系统将应用程序内存与文件内容同步。仅当您尝试访问尚未从磁盘分页的文件块时,才需要上下文切换,而不是每个尝试读取或写入文件的部分都需要。当您修改映射的内存时,它会惰性地写回文件。
对于大多数实际应用程序,您应该使用最适合应用程序逻辑的方法。两种方法之间的性能差异仅在高度时间关键的应用程序中才会显着。当实现一个库时,您不能告诉客户端应用程序的需求,因此当然要尽力提高其性能。但对于许多其他应用程序来说,过早优化是万恶之源

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接