Warnungsfähige E/A

Warnungsfähige E/A ist die Methode, mit der Anwendungsthreads asynchrone E/A-Anforderungen nur dann verarbeiten, wenn sie sich in einem warnbaren Zustand befinden.

Um zu verstehen, wann sich ein Thread in einem warnungsfähigen Zustand befindet, betrachten Sie das folgende Szenario:

  1. Ein Thread initiiert eine asynchrone Leseanforderung, indem ReadFileEx mit einem Zeiger auf eine Rückruffunktion aufgerufen wird.
  2. Der Thread initiiert eine asynchrone Schreibanforderung, indem WriteFileEx mit einem Zeiger auf eine Rückruffunktion aufgerufen wird.
  3. Der Thread ruft eine Funktion auf, die eine Datenzeile von einem Remotedatenbankserver abruft.

In diesem Szenario werden die Aufrufe von ReadFileEx und WriteFileEx höchstwahrscheinlich vor dem Funktionsaufruf in Schritt 3 zurückgegeben. Wenn dies der Fall ist, platziert der Kernel die Zeiger auf die Rückruffunktionen in der APC-Warteschlange (Asynchronous Procedure Call) des Threads. Der Kernel verwaltet diese Warteschlange speziell für zurückgegebene E/A-Anforderungsdaten, bis sie vom entsprechenden Thread verarbeitet werden können.

Wenn der Zeilenabruf abgeschlossen ist und der Thread von der Funktion zurückgibt, besteht seine höchste Priorität darin, die zurückgegebenen E/A-Anforderungen in der Warteschlange zu verarbeiten, indem die Rückruffunktionen aufgerufen werden. Dazu muss er in einen warnbaren Zustand versetzt werden. Ein Thread kann dies nur tun, indem eine der folgenden Funktionen mit den entsprechenden Flags aufgerufen wird:

Wenn der Thread in einen warnbaren Zustand wechselt, treten die folgenden Ereignisse auf:

  1. Der Kernel überprüft die APC-Warteschlange des Threads. Wenn die Warteschlange Rückruffunktionszeiger enthält, entfernt der Kernel den Zeiger aus der Warteschlange und sendet ihn an den Thread.
  2. Der Thread führt die Rückruffunktion aus.
  3. Die Schritte 1 und 2 werden für jeden in der Warteschlange verbleibenden Zeiger wiederholt.
  4. Wenn die Warteschlange leer ist, gibt der Thread von der Funktion zurück, die sie in einen warnbaren Zustand versetzt hat.

Sobald der Thread in einen warnbaren Zustand versetzt wurde, ruft er in diesem Szenario die rückrufbaren Funktionen auf, die an ReadFileEx und WriteFileEx gesendet wurden, und kehrt dann von der Funktion zurück, die ihn in einen warnbaren Zustand versetzt hat.

Wenn ein Thread in einen warnbaren Zustand wechselt, während seine APC-Warteschlange leer ist, wird die Ausführung des Threads vom Kernel angehalten, bis eine der folgenden Aktionen auftritt:

  • Das Kernelobjekt, für das gewartet wird, wird signalisiert.
  • Ein Rückruffunktionszeiger wird in der APC-Warteschlange platziert.

Ein Thread, der warnungsfähige E/A verwendet, verarbeitet asynchrone E/A-Anforderungen effizienter als wenn sie einfach auf das Ereignisflag in der OVERLAPPED-Struktur warten, um festgelegt zu werden, und der warnungsfähige E/A-Mechanismus ist weniger kompliziert als die zu verwendenden E/A-Vervollständigungsports . Die warnungsfähige E/A gibt das Ergebnis der E/A-Anforderung jedoch nur an den Thread zurück, der sie initiiert hat. E/A-Vervollständigungsports weisen diese Einschränkung nicht auf.

Asynchrone Prozeduraufrufe