Share via


アラート可能な I/O

Alertable I/O は、アプリケーション スレッドが非同期 I/O 要求をアラート可能な状態にある場合にのみ処理する方法です。

スレッドがアラート可能な状態である場合を理解するには、次のシナリオを検討してください。

  1. スレッドは、コールバック関数へのポインターを使用して ReadFileEx を 呼び出すことによって非同期読み取り要求を開始します。
  2. スレッドは、コールバック関数へのポインターを使用して WriteFileEx を 呼び出すことによって、非同期書き込み要求を開始します。
  3. スレッドは、リモート データベース サーバーからデータ行をフェッチする関数を呼び出します。

このシナリオでは、 ReadFileExWriteFileEx の呼び出しは、手順 3 の関数呼び出しの前に返される可能性が高くなります。 その場合、カーネルは、スレッドの非同期プロシージャ呼び出し (APC) キューにコールバック関数へのポインターを配置します。 カーネルは、対応するスレッドで処理できるようになるまで、返された I/O 要求データを保持するためにこのキューを特に保持します。

行フェッチが完了し、スレッドが関数から戻ると、コールバック関数を呼び出して、キューで返された I/O 要求を処理することが最も優先度が高くなります。 これを行うには、アラート可能な状態に入る必要があります。 スレッドは、適切なフラグを使用して次のいずれかの関数を呼び出すことによってのみ、これを行うことができます。

スレッドがアラート可能な状態になると、次のイベントが発生します。

  1. カーネルはスレッドの APC キューをチェックします。 キューにコールバック関数ポインターが含まれている場合、カーネルはキューからポインターを削除し、それをスレッドに送信します。
  2. スレッドはコールバック関数を実行します。
  3. 手順 1 と 2 は、キューに残っているポインターごとに繰り返されます。
  4. キューが空の場合、スレッドは警告可能な状態に配置された関数からを返します。

このシナリオでは、スレッドがアラート可能な状態になると、 ReadFileExWriteFileEx に送信されたコールバック関数を呼び出し、アラート可能な状態にした関数から戻ります。

APC キューが空の間にスレッドがアラート可能な状態になった場合、次のいずれかが発生するまで、スレッドの実行はカーネルによって中断されます。

  • 待機中のカーネル オブジェクトがシグナル通知されます。
  • コールバック関数ポインターは APC キューに配置されます。

アラート可能な I/O を使用するスレッドは、 OVERLAPPED 構造体のイベント フラグが設定されるのを待つだけの場合よりも効率的に非同期 I/O 要求を処理します。また、アラート可能な I/O メカニズムは、使用する I/O 完了ポート よりも複雑ではありません。 ただし、警告可能な I/O は、I/O 要求の結果を開始したスレッドにのみ返します。 I/O 完了ポートには、この制限はありません。

非同期プロシージャ呼び出し