O_DIRECT | O_ASYNCでファイルを開き、その間にfsyncまたはfdatasyncを使用せずに、同じディスクセクタへの2つの同時書き込みを実行すると、Linuxディスクサブシステムまたはハードウェアディスクコントローラは、そのディスクの最終データセクターは2番目の書き込みになりますか?書き込み禁止がない場合、ディスクコントローラは同じセクタへの同時書き込みをどのように処理しますか?
O_DIRECTがOSバッファキャッシュをバイパスしている間は、データは最終的に低レベルIOキュー(ディスクスケジューラキュー、ディスクドライバのキュー、ハードウェアコントローラのキャッシュ/キューなど)で終了します。私はIOスタックをエレベータアルゴリズムまで追跡しました。例えば
要求の以下のシーケンスは、エレベーターのコードは、それぞれのバッファ1,2からsector1,2を合体する「バックマージ」を行うだろう
write sector 1 from buffer 1
write sector 2 from buffer 2
write sector 1 from buffer 3 [Its not buffer 1!!]
ディスクスケジューラキューで終わる場合。そして、ディスク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モードで書き込みを行うときに、明示的な書き込み障壁がない場合、この一連の要求がディスクスケジューラのキューに入り込む可能性がありますか?
"はい"の場合、「同じセクタへの複数回の書き込みにより、最後の書き込みが最終書き込みになります」などの順序保証はありますか?
これは、ディスクコントローラ/そのキャッシュが、バリア内で書き込みを最適化してシーク時間を最適化するキャッシュに残っています。
wrt biosの場合、バッファキャッシュのページ(アプリケーションが所有していないバッファ)の場合、カーネルは分散を収集し、バッファをロックします。また、私は、IOMMUがDMAを使って完了するまで、ページにNO ACCESSを設定するようにCPUに(セマンティック的に)頼むと信じています。さもなければ、通常のmmapedの書き込みのために、たくさんのレースがあります。 – Tautology
mmaped以外の書き込みの場合、カーネル空間へのバッファコピー(dmaバッファ)、とにかくAFAIK – Tautology