什么时候使用 mmap 什么时候使用缓存层读写?
When to use mmap vs when to use read and write with cache layer?
在研究数据库存储引擎时,似乎大多数使用 mmap 来持久化。但是,是否存在写入缓存层和使用读写将二进制文件写入磁盘有意义的情况?
我想了解的是 mmap 和 unmmap 与读写之间的区别是什么?什么时候使用其中之一?
如果您可以切实可行地使用 mmap()
,这通常是更好的方法。当您使用 read()/write()
时,您必须为每个操作执行系统调用(尽管像 stdio
这样的库通过用户模式缓冲将其最小化),并且这些上下文切换非常昂贵。即使文件块在缓冲区缓存中,您也必须首先切换到内核中进行检查。此外,内核需要将数据从内核缓冲区复制到调用者的内存中。
另一方面,当您使用 mmap()
时,您只需在首次打开和映射文件时执行系统调用。从那时起,虚拟内存子系统使应用程序内存与文件内容保持同步。仅当您尝试访问尚未从磁盘分页的文件块时才需要上下文切换,而不是针对您尝试读取或写入的文件的每个部分。当您修改映射内存时,它会延迟写回文件。
对于大多数实际应用程序,您应该使用最适合应用程序逻辑的方法。这两种方法之间的性能差异只会在高度时间关键的应用程序中显着。在实现库时,您无法了解客户端应用程序的需求,因此您当然会尝试从中榨取每一点性能。但对于许多其他应用程序,premature optimization is the root of all evil.
在研究数据库存储引擎时,似乎大多数使用 mmap 来持久化。但是,是否存在写入缓存层和使用读写将二进制文件写入磁盘有意义的情况?
我想了解的是 mmap 和 unmmap 与读写之间的区别是什么?什么时候使用其中之一?
如果您可以切实可行地使用 mmap()
,这通常是更好的方法。当您使用 read()/write()
时,您必须为每个操作执行系统调用(尽管像 stdio
这样的库通过用户模式缓冲将其最小化),并且这些上下文切换非常昂贵。即使文件块在缓冲区缓存中,您也必须首先切换到内核中进行检查。此外,内核需要将数据从内核缓冲区复制到调用者的内存中。
另一方面,当您使用 mmap()
时,您只需在首次打开和映射文件时执行系统调用。从那时起,虚拟内存子系统使应用程序内存与文件内容保持同步。仅当您尝试访问尚未从磁盘分页的文件块时才需要上下文切换,而不是针对您尝试读取或写入的文件的每个部分。当您修改映射内存时,它会延迟写回文件。
对于大多数实际应用程序,您应该使用最适合应用程序逻辑的方法。这两种方法之间的性能差异只会在高度时间关键的应用程序中显着。在实现库时,您无法了解客户端应用程序的需求,因此您当然会尝试从中榨取每一点性能。但对于许多其他应用程序,premature optimization is the root of all evil.