如何使用 Boost 的 `mapped_file_sink` class 刷新内存映射文件?
How to flush memory-mapped files using Boost's `mapped_file_sink` class?
使用 Boost 库 version 1.62.0 and the mapped_file_sink
class from Boost.IOStreams。
我想把写入的数据刷新到磁盘at will,但是没有mapped_file_sink::flush()
成员函数
我的问题是:
- 使用
mapped_file_sink
时如何刷新写入的数据?
- 如果以上无法完成,考虑到
msync()
and FlushViewOfFile()
可用于便携式实施,为什么不呢?
如果您在 https://ned14.github.io/boost.afio/classboost_1_1afio_1_1v2__xxx_1_1map__handle.html 查看对提议的 Boost.AFIO v2 的映射文件支持,您会发现也缺乏刷新映射文件视图的能力。
原因是当映射视图在所有方面都与该文件的页面缓存缓冲区相同时,它在现代统一页面缓存内核上是多余的。 msync()
因此在这样的内核上是一个空操作,因为脏页已经在系统决定合适的时候排队等待写入存储。您可以阻止您的进程,直到系统使用旧 fsync()
.
写完该文件的所有脏页
以上所有不适用于 (a) 您的内核不是统一页面缓存设计(QNX、NetBSD 等)或 (b) 您的文件驻留在网络文件系统上的情况。如果您处于 (a) 情况,最好完全避免内存映射 i/o,只需执行 read()
和 write()
,它们只占 OS 的一小部分现在让他们因表现不佳而受苦。对于 (b) 情况,强烈建议您对网络文件系统使用内存映射 i/o。只有不可变文件的只读映射存在争论,否则 就不要这样做 除非你知道你在做什么。回到 read()
和 write()
,它更安全,也不太可能出人意料。
最后,您链接到一个安全的文件删除程序。由于延迟的盘区分配或写时复制分配,这些程序不再可靠地与最近的文件系统一起工作。换句话说,当您重写现有文件的一部分时,它不会修改存储上的原始数据,而是实际分配新的存储并将该文件的扩展列表指向新的链表。这允许在意外数据丢失后轻松恢复一致的文件系统。要安全地删除最近文件系统上的数据,您通常需要使用特殊的 OS API,尽管删除所有文件然后用随机数据填充空闲 space 可能会安全地删除大部分有问题的数据时间。注意写文件系统上的副本可能不会将释放的范围释放回空闲 space 池以供新分配许多天或数周,直到下一次垃圾收集例程触发或快照被删除。在这种情况下,随机填充 free space 将无法安全地删除有问题的文件。如果这一切都是一个问题,请使用 FAT32 作为您的文件系统,它非常简单并且在其上重写数据确实会在存储上重写相同的数据(但请注意,某些存储介质(例如 SSD)很可能也不会重写数据,这些也将修改写入新存储并稍后收集释放的区段的垃圾)。
使用 Boost 库 version 1.62.0 and the mapped_file_sink
class from Boost.IOStreams。
我想把写入的数据刷新到磁盘at will,但是没有mapped_file_sink::flush()
成员函数
我的问题是:
- 使用
mapped_file_sink
时如何刷新写入的数据? - 如果以上无法完成,考虑到
msync()
andFlushViewOfFile()
可用于便携式实施,为什么不呢?
如果您在 https://ned14.github.io/boost.afio/classboost_1_1afio_1_1v2__xxx_1_1map__handle.html 查看对提议的 Boost.AFIO v2 的映射文件支持,您会发现也缺乏刷新映射文件视图的能力。
原因是当映射视图在所有方面都与该文件的页面缓存缓冲区相同时,它在现代统一页面缓存内核上是多余的。 msync()
因此在这样的内核上是一个空操作,因为脏页已经在系统决定合适的时候排队等待写入存储。您可以阻止您的进程,直到系统使用旧 fsync()
.
以上所有不适用于 (a) 您的内核不是统一页面缓存设计(QNX、NetBSD 等)或 (b) 您的文件驻留在网络文件系统上的情况。如果您处于 (a) 情况,最好完全避免内存映射 i/o,只需执行 read()
和 write()
,它们只占 OS 的一小部分现在让他们因表现不佳而受苦。对于 (b) 情况,强烈建议您对网络文件系统使用内存映射 i/o。只有不可变文件的只读映射存在争论,否则 就不要这样做 除非你知道你在做什么。回到 read()
和 write()
,它更安全,也不太可能出人意料。
最后,您链接到一个安全的文件删除程序。由于延迟的盘区分配或写时复制分配,这些程序不再可靠地与最近的文件系统一起工作。换句话说,当您重写现有文件的一部分时,它不会修改存储上的原始数据,而是实际分配新的存储并将该文件的扩展列表指向新的链表。这允许在意外数据丢失后轻松恢复一致的文件系统。要安全地删除最近文件系统上的数据,您通常需要使用特殊的 OS API,尽管删除所有文件然后用随机数据填充空闲 space 可能会安全地删除大部分有问题的数据时间。注意写文件系统上的副本可能不会将释放的范围释放回空闲 space 池以供新分配许多天或数周,直到下一次垃圾收集例程触发或快照被删除。在这种情况下,随机填充 free space 将无法安全地删除有问题的文件。如果这一切都是一个问题,请使用 FAT32 作为您的文件系统,它非常简单并且在其上重写数据确实会在存储上重写相同的数据(但请注意,某些存储介质(例如 SSD)很可能也不会重写数据,这些也将修改写入新存储并稍后收集释放的区段的垃圾)。