何时使用mmap vs何时使用缓存层进行读写?

时间:2016-09-01 20:20:25

标签: c database io mmap

在研究数据库存储引擎时,似乎大多数都使用mmap来保持。但是,是否存在写入缓存层并使用读写将二进制写入磁盘的情况?

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

1 个答案:

答案 0 :(得分:5)

如果您可以切实使用mmap(),通常情况下会更好。当您使用read()/write()时,您必须为每个操作执行系统调用(尽管像stdio这样的库通过用户模式缓冲将其最小化),并且这些上下文切换很昂贵。即使文件块在缓冲区缓存中,您也必须先切换到内核来检查它。此外,内核需要将数据从内核缓冲区复制到调用者的内存中。

另一方面,当您使用mmap()时,您只需在首次打开并映射文件时执行系统调用。从那时起,虚拟内存子系统使应用程序内存与文件内容保持同步。仅当您尝试访问尚未从磁盘分页的文件块时才需要上下文切换,而不是您尝试读取或写入的文件的每个部分。修改映射内存时,它会被懒惰地写回文件。

对于大多数实际应用,您应该使用最适合应用程序逻辑的方法。两种方法之间的性能差异仅在高度时间关键的应用程序中才有意义。在实现库时,您无法告诉客户端应用程序的需求,因此您当然会尝试从中榨取所有性能。但对于许多其他应用程序,premature optimization is the root of all evil