次のことを行う単純なプログラムがあるとします。
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 でのいくつかの簡単なテストでは、はい、書き込み呼び出しからのダーティ ページが を介して読み取る前にディスクにフラッシュされることが示唆されてO_DIRECT
いるようですが、このシナリオについての言及はどこにも見つからないようです。私が知っている限りでは、それが機能したのは完全な偶然である可能性があり、他の POSIX ライクなプラットフォームで何が起こるかはわかりません。少なくともこれに関する「確固たる証拠」を入手したいと思います。
なぜあなたはこれをやっている?
これは、キャッシュされる大きなファイルを配布するアプリケーションのコンテキストにあります。ファイルの新しい部分を受け取ったら、新しい部分を確認したいと思います。を使用する利点は 2 つあります。1 つO_DIRECT
目は、データが正しく受信されたかどうかを確認するだけでなく、ストレージ メディアから適切に取得できることです。これがなければO_DIRECT
、ページ キャッシュからデータを取得しているだけであることがほぼ保証されます。なしで同じことを達成するには、LinuxO_DIRECT
のような移植性のない呼び出しを使用sync_file_range
してデータをディスクに取得し、ページ キャッシュからフラッシュしてmadvise
、最後に読み戻す必要がありました。(私はかつて、ダーティページでの呼び出しは本質的にヌープであるmadvise
という難しい方法を学んだので).
しかし、誰かがこれについてもっとエレガントな提案を持っているなら、私はすべて耳を傾けます. :-)MADV_DONTNEED