ここでの「ダイレクトI/O」と「非同期I/O」は、別の概念です。ダイレクトI/O は質問者さんが書かれているようにバッファー(あるいはキャッシュ)を使わずにより直接的にデバイスへI/O操作を行うことを指しますが、非同期I/Oは、I/O操作のリクエスト発行、リクエストの処理、処理終了の通知受信と結果の取り込みの処理をバラバラ(非同期)に行い、効率的に処理を行えるよう用意された操作を指します。
HDDなどの外部デバイスの操作を例にすると、非同期I/Oの流れとしては(かなりザックリですが)
-
ユーザープログラムがデバイスへデータ読み取りをリクエストする。システムはリクエストを受け付けると、「受け付けました」旨の終了コードなどをレスポンスとしてユーザープログラムに即時に返す。
-
システムは受け付けたリクエストをもってデバイスへ読み取りリクエストを発行する。
-
デバイスがリクエストに応じたデータ読み取りを終えると、レスポンスの送信であったり割り込みでシステムに通知する。
-
システムがリクエストの実行完了をAPI仕様にのってユーザープログラムにコールバックやシグナル、割り込みなどで通知する。
-
実行完了を通知されたユーザープログラムは、リクエスト内容に応じたレスポンス(データ読み取り結果)を取得し、処理を継続する。
とのようなものになります。対して同期I/Oの場合、ユーザープログラムからのデータ読み取りリクエスト後、デバイスがデータ読み取り結果を返すまで戻らないかたちとなり、ユーザープログラムはその間は他の仕事ができません。外部デバイスとのI/O操作はCPU内部やメモリーとのそれとは比べものにならないほど遅いので、これを同期I/Oで処理するとユーザープログラムにとってかなりの不要な時間が費やされます。これを緩和し、最適なタイミングで動作するように処理を組み立てる仕組みが非同期I/Oです。
ですので、ダイレクトI/Oと非同期I/Oを組み合わせることでよりデバイスに対し効率的なI/O操作が期待でき、結果として速くなる(こともある)ということになります。
オライリーのサイトに参考になる記事がありました。こちらを読んでみると本回答より理解が深まるかもしれません。
バッファキャッシュとAIO(3)
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/01/21 14:26