如何使用 Boost 的"mapped_file_sink"类刷新内存映射文件?
How to flush memory-mapped files using Boost's `mapped_file_sink` class?
使用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很可能也不重写数据,这些也很可能稍后将修改对新存储和垃圾收集释放)。
- 将字符串存储在c++中的稳定内存中
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- Win32编译器选项和内存分配
- 当vector是tje全局变量时,c++中vector的内存管理
- 带内存和隔离功能的SQLite
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 迭代时从向量和内存中删除对象
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 为什么示例代码访问IUnknown中已删除的内存
- 如何在C++类内存结构中创建"spacer"?
- 从构造函数抛出异常时如何克服内存泄漏
- malloc() 可能出现内存泄漏
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 如何针对特定情况调试和修复此双自由内存损坏问题
- 如何使用 Boost 的"mapped_file_sink"类刷新内存映射文件?
- 如何防止操作系统刷新视频内存
- 当列表重新分配内存时,我应该刷新list::迭代器吗