gpt4 book ai didi

c - 同时使用 Direct-IO 写入和页面缓存读取是否安全?

转载 作者:行者123 更新时间:2023-11-30 14:32:46 25 4
gpt4 key购买 nike

例如,打开一个文件两次,direct-io 使用一个 fd 进行写入,而页面缓存则使用另一个进行读取?

如何定义安全:从 direct-io fd 写入一些数据,然后期望立即从页面缓存 fd 读取它们

最佳答案

我认为 directIO 写入文件对于以后对该文件的缓存读取来说应该相当安全,但读取性能可能较低(写入的数据未保存在页面缓存中,必须从实际存储中读取)。但确切的代码路径可能取决于所使用的文件系统。

这篇文章https://lwn.net/Articles/776801/提到直接 IO 具有失效语义:

with some filesystems at least, performing a direct-I/O read on a page will force that page out of the cache

book在“写缓存”部分列出了 3 种写入策略:不写、直写、回写。直接 I/O 可能是 write() 的“无写”变体系统调用。

对单个文件使用多个 fd 是安全的,因为数据是由使用 inode 的 FS 代码管理的。两个 fd 将指向同一个 inode。

2013 年,邮件列表中有一个线程 https://lists.kernelnewbies.org/pipermail/kernelnewbies/2013-July/008660.html TLDR 是:

From a kernel developer's perspective : The kernel driver guarantees coherency between then page-cache and data transferred using O_DIRECT. ...

  1. 不用担心页面缓存和数据之间的一致性 使用 O_DIRECT 传输。内核将使缓存失效 O_DIRECT 写入并在 O_DIRECT 读取之前刷新缓存。
  2. 使用互斥体或信号量(或任何众多选项 [1])来 防止使用共享IPC期间常见的同步问题 文件。

因此,虽然直接写入会从页面缓存中清除文件的写入部分,但写入器和读取器之间存在竞争的可能性。因此,如果您的读者想要获取更新的数据,则需要互斥或其他同步。只有直接IO write()系统调用结束后,页面缓存才会被清除。

有时不建议混合:https://medium.com/databasss/on-disk-io-part-1-flavours-of-io-8e1ace1de017不鼓励同时使用 Direct IO 和 Page Cache 打开同一个文件,因为即使数据位于 Page Cache 中,也会对磁盘设备执行直接操作,这可能会导致不良结果。

关于c - 同时使用 Direct-IO 写入和页面缓存读取是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59678339/

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