![](/img/trans.png)
[英]write file by mmap, but when I use fread, the second time read error data
[英]When to use mmap vs when to use read and write with cache layer?
调查数据库存储引擎时,似乎大多数都使用mmap来保持。 但是,是否存在这样的情况:使用读取和写入操作将数据写入缓存层并将二进制文件写入磁盘?
我想了解的是mmap和unmmap与读写之间有什么区别? 以及何时使用一个或另一个?
如果可以使用mmap()
,通常是更好的方法。 使用read()/write()
,必须为每个操作执行系统调用(尽管stdio
库通过用户模式缓冲将其最小化),并且这些上下文切换非常昂贵。 即使文件块位于缓冲区高速缓存中,您也必须首先切换到内核进行检查。 此外,内核需要将数据从内核缓冲区复制到调用者的内存。
另一方面,当您使用mmap()
,只需在首次打开并映射文件时执行系统调用。 从那时起,虚拟内存子系统使应用程序内存与文件内容保持同步。 仅当您尝试访问尚未从磁盘分页的文件块时,才需要上下文切换,而不是尝试读取或写入的文件的每个部分。 当您修改映射的内存时,它会延迟地写回到文件中。
对于大多数实际应用程序,应使用最适合应用程序逻辑的方法。 两种方法之间的性能差异仅在时间紧迫的应用中才有意义。 在实现库时,您无法说出客户端应用程序的需求,因此,您当然会尽力降低所有性能。 但是对于许多其他应用程序, 过早的优化是万恶之源 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.