2

假设我有一个执行以下操作的简单程序:

fdWrite = open("file", O_WRONLY);
fdRead = open("file", O_RDONLY | O_DIRECT);
writeBuffer = <some data>;
write(fdWrite, writeBuffer);
readBuffer = read(fdRead, sizeof(writeBuffer));

我会得到保证readBuffer == writeBuffer吗?(显然,鉴于此文件的其他 fd 目前没有打开)

在 Linux 上进行的一些简单测试似乎表明,是的,来自 write 调用的脏页将在通过读取之前刷新到磁盘O_DIRECT,但我似乎在任何地方都找不到关于这种情况的任何提及。据我所知,它的工作可能完全是巧合,而且我不知道在其他类似 POSIX 的平台上会发生什么。至少我想得到一些“确凿的证据”。

你为什么做这个?

它是在应用程序分发被缓存的大文件的上下文中。收到文件的新部分后,我想验证新部分。我看到使用的两个优点O_DIRECT:首先,我不仅检查数据是否已正确接收,而且可以从存储介质中正确检索。如果没有O_DIRECT,我几乎可以保证我只是从页面缓存中获取数据。为了在O_DIRECT没有. (因为我曾经了解到在脏页上调用with本质上是一个无用的方法)。 但是,如果有人对此有更优雅的建议,我会全力以赴。:-)sync_file_rangemadvisemadviseMADV_DONTNEED

4

1 回答 1

0

我不仅检查数据是否已正确接收,而且可以从存储介质中正确检索。

为此,您需要取消设备完成的缓存。

大多数设备数据缓存都比较小——兆字节而不是千兆字节。[*] 如果你的大文件足够大,你可以执行 write()+fsync(),你会溢出设备缓存。然后使用您的 DONTNEED 将其从 Linux 页面缓存中删除。然后您可以从设备中重新读取()文件。

[*] 一些虚拟化环境打破了这种期望。 https://unix.stackexchange.com/questions/420299/why-is-sync-drop-caches-not-dropping-caches/

于 2018-11-18T20:54:49.783 回答