【问题标题】:Is FlushFileBuffers required to sync file data across many processes?跨多个进程同步文件数据是否需要 FlushFileBuffers?
【发布时间】:2014-09-01 09:50:12
【问题描述】:

我有一个文件可以被许多进程读/写,它们使用互斥锁来序列化读/写。

我是否需要在ProcessA 中的WriteFile 之后调用FlushFileBuffers,以便ProcessB 看到这些变化?或者,假设该文件的 OS 磁盘缓存在所有进程之间共享,是否可以保证 ProcessB 看到 ProcessA 所做的更改?在调用WriteFile 之后,我没有在文件上调用CloseHandle,而是在所有进程中保持打开状态,但它们将FILE_SHARE_READFILE_SHARE_WRITE 标志传递给CreateFile

这是跨 Windows XP 到 Windows 8.1 工作所必需的 - 我发现调用 FlushFileBuffers 会带来不可接受的性能瓶颈。

【问题讨论】:

  • 这听起来不像是最好的 IPC 机制。也许您可能会考虑为您的 IPC 使用磁盘文件以外的其他东西。
  • 不需要,其他进程也从文件系统缓存中读取。程序可以在 CreateFile() 调用中有意使用 FILE_FLAG_NO_BUFFERING 来绕过缓存。它得到了它应得的东西,读取速度非常慢,并且看不到尚未刷新的写入。
  • 你需要假设程序员不是傻瓜。
  • @BenVoigt:我相信他的观点是,当缓存中有更新的信息时,使用FILE_FLAG_NO_BUFFERING 的程序可能会从磁盘读取旧信息(由另一个not 使用标志)。
  • @BenVoigt:这表示缓存管理器和内存管理器不维护一个相互一致的视图,它并没有真正说明每个进程缓存的任何内容(无论哪种方式)。但是在没有关于缓存管理器合同的任何文档的情况下,依赖观察到的行为是不明智的,所以我同意你发布的答案。

标签: windows winapi io


【解决方案1】:

拥有文件内存映射视图的进程可以直接访问磁盘缓存中的页面;访问与同一台机器上的所有其他进程保持一致,并且您的互斥体足以进行同步。

使用文件访问 API 的进程需要调用FlushFileBuffers 以确保一致性。

如果您无法摆脱 IPC 的共享文件(例如,您无法更改其中一个参与者),您至少可以将您控制的文件迁移到内存映射文件视图,以获得更大的性能优势。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-23
    • 1970-01-01
    • 2021-09-22
    • 2019-01-17
    • 1970-01-01
    • 2014-11-12
    • 2012-02-01
    • 1970-01-01
    相关资源
    最近更新 更多