如何使用 Boost 的"mapped_file_sink"类刷新内存映射文件?

How to flush memory-mapped files using Boost's `mapped_file_sink` class?

本文关键字:内存 刷新 映射 文件 file Boost 何使用 mapped sink      更新时间:2023-10-16

使用Boost Libraries版本1.62.0和mapped_file_sink类来自 boost.iostreams 。。

我想随意将书面数据冲洗到磁盘,但是没有mapped_file_sink::flush()成员函数。

我的问题是:

  • 使用mapped_file_sink时如何冲洗书面数据?
  • 如果无法完成以上操作,为什么不考虑msync()FlushViewOfFile()可用于便携式实现?

如果您查看了https://ned14.github.io/boost.afio/classboost_1_1_1_1_1_1_1v2__xxxxxx_1_1_1_1_1_1 amap_html,您会注意到https://ned14.github.io/boost.afio/classboost_1map_hhtml,请注意提议的boost.afio v2的映射文件支持。刷新映射的文件视图的能力。

原因是因为它在现代统一的页面缓存内核上是多余的,而映射的视图在各个方面都与该文件的页面缓存缓冲器相同。因此,msync()是此类内核上的一个no-op,因为肮脏的页面已经排队以在系统确定合适时写入存储。您可以阻止您的过程,直到系统使用好的旧fsync()编写该文件的所有肮脏页面。

以上所有内容都不适用(a)您的内核不是统一的页面缓存设计(qnx,netbsd等)或(b)您的文件位于网络文件系统上。如果您处于(a)的情况下,最好只避免将内存映射到I/O,只需执行read()write()即可,如今,它们是OSS的一小部分,让他们的性能差。对于(b)情况,您被高度不适使用网络文件系统使用内存映射的I/O。有一个论点只能读取不可变的文件的图形,否则除非您知道自己在做什么,否则不做。回到read()write(),更安全,不太可能令人惊讶。

最后,您链接到安全文件删除程序。由于范围延迟分配或在写入分配时,这些程序与最近的文件系统不再可靠地工作。换句话说,当您重写现有文件的一部分时,它不会在存储上修改原始数据,而是实际上分配了新的存储,并指出了新链接列表中文件的扩展名列表。这允许在意外数据丢失后恢复一致的文件系统。要安全地删除最近的文件系统数据,您通常需要使用特殊的OS API,尽管删除所有文件,然后填充自由空间随机数据可能会在大多数情况下安全地删除有关的大多数数据。注意在写归档系统上的副本可能不会将释放的范围释放回自由空间池,以进行新的分配,以进行新的分配,直到下次垃圾收集常规射击或快照。在这种情况下,用随机性填充自由空间不会安全地删除相关文件。如果所有这些问题都是一个问题,请使用FAT32作为您的备案系统,它非常简单且重写数据确实确实可以重写相同的存储数据(尽管请注意,某些存储媒体,例如SSD,例如SSD很可能也不重写数据,这些也很可能稍后将修改对新存储和垃圾收集释放)。