O_DIRECT | O_ASYNCを使用してファイルを開き、fsyncまたはfdatasyncを間にせずに、同じディスクセクターに2つの同時書き込みを行うと、Linuxディスクサブシステムまたはハードウェアディスクコントローラーは、そのディスクセクターの最終データが2番目の書き込みになりますか?
O_DIRECTがOSバッファキャッシュをバイパスするのは事実ですが、データは最終的に低レベルIOキュー(ディスクスケジューラキュー、ディスクドライバのキュー、ハードウェアコントローラのキャッシュ/キューなど)に入れられます。IOスタックをエレベータアルゴリズムまで追跡しました。
たとえば、次の一連の要求が最終的にディスクスケジューラキューに入れられた場合
write sector 1 from buffer 1
write sector 2 from buffer 2
write sector 1 from buffer 3 [Its not buffer 1!!]
エレベータコードは、バッファ1、2からそれぞれセクター1、2を合体させるために「バックマージ」を実行します。次に、ディスクに2つのディスクIOを発行します。しかし、ディスクセクター1の最終データがバッファー1からのものかバッファー3からのものかはわかりません(ドライバー/コントローラーの書き込みの並べ替えのセマンティクスについてはわかりません)。
シナリオ2:
write sector 1 from buffer 1
write sector 500 from buffer 2
write sector 1 from buffer 3
このシナリオはどのように処理されますか?より基本的な質問は、AIOを使用してO_DIRECTモードで書き込みを行う場合、明示的な書き込みバリアがない場合、この一連の要求がディスクスケジューラのキューに入れられる可能性があるかどうかです。
はいの場合、「同じセクターへの複数の書き込みにより、最後の書き込みが最後の書き込みになる」などの順序保証はありますか?
または、その順序付けは非決定論的です[シーク時間を最適化するためにバリア内で書き込みを並べ替えるディスクコントローラー/そのキャッシュに翻弄されます]