web-dev-qa-db-ja.com

LinuxでのPOSIX AIOとlibaioの違いは?

私が理解すべきことseem

POSIX AIO AP​​Iは<aio.h>でプロトタイプ化され、プログラムをlibrt(-lrt)にリンクしますが、<libaio.h>libaio AP​​Iとプログラムはlibaio(-ライオ)。

私が理解できないもの:

1.カーネルはこれらのメソッドのいずれかを異なる方法で処理しますか?

2. O_DIRECTフラグはいずれかを使用するために必須ですか?

この投稿 で述べたように、libaioを使用する場合、libaioはO_DIRECTなしでも正常に動作します。

R.LoveのLinux System Programming本によると、LinuxはaioO_DIRECTで開いた場合、通常のファイルonlyでPOSIX AIOと仮定しますが、私が書いた小さなプログラム(aio.hを使用) -lrtとリンクされています)aio_writeフラグなしで開かれたファイルでO_DIRECTを呼び出しますが、問題なく機能します。

50
itisravi

Linuxでは、2つのAIO実装は根本的に異なります。

POSIX AIOは、複数のスレッドで通常のブロッキングI/Oを実行するユーザーレベルの実装であるため、I/Oが非同期であるように見えます。これを行う主な理由は次のとおりです。

  1. 任意のファイルシステムで動作します
  2. どのオペレーティングシステムでも(本質的に)動作します(gnuのlibcは移植可能であることに注意してください)
  3. バッファリングが有効になっているファイルで機能します(つまり、O_DIRECTフラグが設定されていません)

主な欠点は、キューの深さ(つまり、実際に実行できる未処理の操作の数)が、選択するスレッドの数によって制限されることです。これは、1つのディスクでの遅い操作が、別のディスク。また、カーネルとディスクスケジューラから見られるI/O(またはその数)にも影響します。

カーネルAIO(つまりio_submit()など)は、非同期I/O操作のカーネルサポートです。ここでは、io要求は実際にカーネルでキューに入れられ、所有するディスクスケジューラーによって並べ替えられ、おそらくそれらの一部が転送されます( (TCQまたはNCQを使用して)非同期操作として実際のディスクにいくぶん最適な順序で期待します)。このアプローチの主な制限は、すべてのファイルシステムが非同期I/Oで適切に機能しない、またはまったく機能しない(およびブロックセマンティクスに戻る可能性がある)ことです。ファイルはO_DIRECTで開く必要があります。 I/O要求。 O_DIRECTでファイルを開くことに失敗した場合、正しいデータを取得するように「動作」する可能性がありますが、おそらく非同期に行われず、セマンティクスのブロックに戻ります。

また、io_submit()は特定の状況下でディスク上で実際にブロックできることに注意してください。

63
Arvid