54

私が理解しているように見えること:

POSIX AIOAPI は でプロトタイプ化され<aio.h>、プログラムは librt(-lrt) でリンクされますが、libaioAPI<libaio.h>とプログラムは libaio (-laio) でリンクされます。

私が理解できないこと:

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

2.O_DIRECTどちらかを使用する場合、フラグは必須ですか?

この投稿で述べたように、libaio はO_DIRECT使用しなくても正常に動作しますlibaio

R.Love のLinux System Programming book によると、Linux は通常のファイルでaio (これは POSIX AIO だと思います) をサポートするのは、で開いた場合のみです。フラグなしで開いたファイルは問題なく動作します。O_DIRECTaio_writeO_DIRECT

4

1 に答える 1

74

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() が実際にディスク上でブロックされる可能性があることにも注意してください。

于 2012-01-08T23:21:27.317 に答える