Linux では、2 つの AIO 実装は根本的に異なります。
POSIX AIO は、複数のスレッドで通常のブロッキング I/O を実行するユーザーレベルの実装であるため、I/O が非同期であるかのように見えます。これを行う主な理由は次のとおりです。
- どんなファイルシステムでも動作します
- それは(本質的に)どのオペレーティングシステムでも動作します(gnuのlibcは移植可能であることに注意してください)
- バッファリングが有効になっているファイルで動作します (つまり、O_DIRECT フラグが設定されていません)。
主な欠点は、キューの深さ (つまり、実際に実行できる未処理の操作の数) が、選択したスレッドの数によって制限されることです。これは、1 つのディスクでの操作が遅いと、別のディスクへの操作がブロックされる可能性があることも意味します。別のディスク。また、カーネルとディスク スケジューラによって認識される I/O (またはその数) にも影響します。
カーネル AIO (つまり io_submit() など) は、非同期 I/O 操作のカーネル サポートです。io 要求は実際にカーネル内でキューに入れられ、使用しているディスク スケジューラによってソートされ、おそらくそれらの一部が転送されます (ある程度最適な順序で) 非同期操作として実際のディスクに (TCQ または NCQ を使用して) 送信します。このアプローチの主な制限は、すべてのファイルシステムが非同期 I/O でうまく機能するわけではない (そしてブロッキング セマンティクスにフォールバックする可能性がある) ことです。ファイルは O_DIRECT で開く必要があります。 I/O 要求。O_DIRECT でファイルを開くことに失敗した場合でも、適切なデータが返されるように「機能する」可能性がありますが、おそらく非同期で行われるのではなく、ブロッキング セマンティクスにフォールバックします。
また、特定の状況下では、io_submit() が実際にディスク上でブロックされる可能性があることにも注意してください。