在研究数据库存储引擎时,似乎大多数使用mmap进行持久化。但是,在什么情况下,通过写入缓存层并使用读取和写入将二进制数据写入磁盘是有意义的呢?
我想要理解的是mmap和unmmap与读取和写入之间的区别是什么?何时使用其中一个或另一个?
在研究数据库存储引擎时,似乎大多数使用mmap进行持久化。但是,在什么情况下,通过写入缓存层并使用读取和写入将二进制数据写入磁盘是有意义的呢?
我想要理解的是mmap和unmmap与读取和写入之间的区别是什么?何时使用其中一个或另一个?
mmap()
,通常这是更好的方法。当您使用read()/write()
时,您必须为每个操作执行系统调用(尽管像stdio
这样的库通过用户模式缓冲最小化了这一点),并且这些上下文切换很昂贵。即使文件块在缓冲区高速缓存中,您也必须首先切换到内核以进行检查。此外,内核需要将数据从内核缓冲区复制到调用者的内存中。mmap()
时,您只需要在第一次打开和映射文件时执行系统调用。此后,虚拟内存子系统将应用程序内存与文件内容同步。仅当您尝试访问尚未从磁盘分页的文件块时,才需要上下文切换,而不是每个尝试读取或写入文件的部分都需要。当您修改映射的内存时,它会惰性地写回文件。