私が理解すべきことseem:
POSIX AIO
APIは<aio.h>
でプロトタイプ化され、プログラムをlibrt(-lrt)にリンクしますが、<libaio.h>
のlibaio
APIとプログラムはlibaio(-ライオ)。
私が理解できないもの:
1.カーネルはこれらのメソッドのいずれかを異なる方法で処理しますか?
2. O_DIRECT
フラグはいずれかを使用するために必須ですか?
この投稿 で述べたように、libaio
を使用する場合、libaioはO_DIRECT
なしでも正常に動作します。
R.LoveのLinux System Programming本によると、Linuxはaio( O_DIRECT
で開いた場合、通常のファイルonlyでPOSIX AIOと仮定しますが、私が書いた小さなプログラム(aio.hを使用) -lrtとリンクされています)aio_write
フラグなしで開かれたファイルでO_DIRECT
を呼び出しますが、問題なく機能します。
Linuxでは、2つのAIO実装は根本的に異なります。
POSIX AIOは、複数のスレッドで通常のブロッキングI/Oを実行するユーザーレベルの実装であるため、I/Oが非同期であるように見えます。これを行う主な理由は次のとおりです。
主な欠点は、キューの深さ(つまり、実際に実行できる未処理の操作の数)が、選択するスレッドの数によって制限されることです。これは、1つのディスクでの遅い操作が、別のディスク。また、カーネルとディスクスケジューラから見られるI/O(またはその数)にも影響します。
カーネルAIO(つまりio_submit()など)は、非同期I/O操作のカーネルサポートです。ここでは、io要求は実際にカーネルでキューに入れられ、所有するディスクスケジューラーによって並べ替えられ、おそらくそれらの一部が転送されます( (TCQまたはNCQを使用して)非同期操作として実際のディスクにいくぶん最適な順序で期待します)。このアプローチの主な制限は、すべてのファイルシステムが非同期I/Oで適切に機能しない、またはまったく機能しない(およびブロックセマンティクスに戻る可能性がある)ことです。ファイルはO_DIRECTで開く必要があります。 I/O要求。 O_DIRECTでファイルを開くことに失敗した場合、正しいデータを取得するように「動作」する可能性がありますが、おそらく非同期に行われず、セマンティクスのブロックに戻ります。
また、io_submit()は特定の状況下でディスク上で実際にブロックできることに注意してください。