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

1 c database io mmap

调查数据库存储引擎时,似乎大多数都使用mmap来保持。但是,是否存在这样的情况:使用读取和写入操作将数据写入缓存层并将二进制文件写入磁盘?

我想了解的是mmap和unmmap与读写之间有什么区别?以及何时使用一个或另一个?

Bar*_*mar 5

如果可以使用mmap(),通常是更好的方法。使用时read()/write(),您必须为每个操作执行系统调用(尽管诸如库之类的库stdio通过用户模式缓冲将其最小化),这些上下文切换非常昂贵。即使文件块位于缓冲区高速缓存中,您也必须首先切换到内核进行检查。此外,内核需要将数据从内核缓冲区复制到调用者的内存。

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

对于大多数实际应用程序,应使用最适合应用程序逻辑的方法。两种方法之间的性能差异仅在时间紧迫的应用中才有意义。在实现库时,您无法说出客户端应用程序的需求,因此,您当然会尽力降低所有性能。但是对于许多其他应用程序,过早的优化是万恶之源。