3

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モードで書き込みを行う場合、明示的な書き込みバリアがない場合、この一連の要求がディスクスケジューラのキューに入れられる可能性があるかどうかです。
はいの場合、「同じセクターへの複数の書き込みにより、最後の書き込みが最後の書き込みになる」などの順序保証はありますか?
または、その順序付けは非決定論的です[シーク時間を最適化するためにバリア内で書き込みを並べ替えるディスクコントローラー/そのキャッシュに翻弄されます]

4

2 に答える 2

4

障壁はなくなりつつあります。重複する書き込み間で順序付けが必要な場合は、最初の書き込みが完了するまで待ってから、2 番目の書き込みを発行する必要があります。(障壁はなくなります。)

一般的な場合、保証はないと思います。最終結果は、タイミング、ホストおよびストレージ デバイスの状態などに応じて、アプリケーションの観点からは非決定的です。

要求キューは予測可能な方法で要求をマージしますが、同時にドライブのキューにある書き込みに対して一貫した結果を提供するためにハードウェアは必要ありません。

ストレージ デバイスの速度とホスト CPU の速度によっては、コマンドがストレージ デバイスに送信される前に要求キューでマージが行われるとは限りません。

残念ながら、O_DIRECT を使用するアプリケーション (bios を直接構築するファイルシステムとは対照的に) がどのように完了を待つべきかは、私にはわかりません。

于 2010-11-30T22:41:16.990 に答える
0

OK、書き込みリクエストは線形エレベータキューに入れられます。この時点では、それらが異なるスレッドからのものであるかどうかは関係ありません。同じ配置は、単一のスレッドが3つの連続した書き込みを発行した結果である可能性があります。では、ファイルをOSまたはコントローラーに信頼して、同じセクターへの順次書き込みを任意の方法で並べ替えますか?私はそうしませんが、もちろん間違っているかもしれません:)

于 2010-11-30T21:32:46.920 に答える