gpt4 book ai didi

c++ - 如何使用 Boost 的 `mapped_file_sink` 类刷新内存映射文件?

转载 作者:搜寻专家 更新时间:2023-10-31 01:33:41 24 4
gpt4 key购买 nike

使用 Boost 库 version 1.62.0mapped_file_sink来自 Boost.IOStreams 的类(class).

我想将写入的数据刷新到磁盘at will , 但没有 mapped_file_sink::flush() 成员函数。

我的问题是:

  • 如何在使用 mapped_file_sink 时刷新写入的数据?
  • 如果以上无法完成,为什么不呢,考虑到 msync()FlushViewOfFile()可用于可移植实现?

最佳答案

如果您在 https://ned14.github.io/boost.afio/classboost_1_1afio_1_1v2__xxx_1_1map__handle.html 查看对提议的 Boost.AFIO v2 的映射文件支持,您会注意到也缺乏刷新映射文件 View 的能力。

原因是当映射 View 在所有方面都与该文件的页面缓存缓冲区相同时,它在现代统一页面缓存内核上是多余的。 msync() 因此在此类内核上是空操作,因为脏页已经排队等候在系统决定合适时写入存储。您可以阻塞您的进程,直到系统使用旧的 fsync() 写完该文件的所有脏页。

上述所有内容不适用于 (a) 您的内核不是统一页面缓存设计(QNX、NetBSD 等)或 (b) 您的文件驻留在网络文件系统上的情况。如果您处于 (a) 情况,最好完全避免内存映射 i/o,只需执行 read()write(),它们是如此之小现在的操作系统百分比让他们遭受性能不佳的困扰。对于 (b) 情况,强烈建议您在网络文件系统中使用内存映射 i/o。只对不可变文件的只读映射存在争论,否则就不要这样做,除非你知道你在做什么。回退到 read()write(),它更安全并且不太可能出人意料。

最后,您链接到一个安全的文件删除程序。由于延迟的盘区分配或写时复制分配,这些程序不再可靠地与最近的文件系统一起工作。换句话说,当您重写现有文件的一部分时,它不会修改存储上的原始数据,而是实际分配新的存储并将该文件的扩展列表指向新的链表。这允许在意外数据丢失后轻松恢复一致的文件系统。要安全地删除最近文件系统上的数据,您通常需要使用特殊的操作系统 API,尽管删除所有文件然后用随机数据填充可用空间可能会在大多数情况下安全地删除大部分有问题的数据。注意写文件系统上的拷贝可能不会将释放的范围释放回空闲空间池以供新分配许多天或数周,直到下一次垃圾收集例程触发或快照被删除。在这种情况下,随机填充可用空间不会安全地删除有问题的文件。如果这一切都是一个问题,请使用 FAT32 作为您的文件系统,它非常简单并且在其上重写数据确实会在存储上重写相同的数据(但请注意,某些存储介质(例如 SSD)很可能也不会重写数据,这些也将修改写入新存储,稍后垃圾收集释放的范围)。

关于c++ - 如何使用 Boost 的 `mapped_file_sink` 类刷新内存映射文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40972420/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com