Warnungsfähige E/A
Warnungsfähige E/A ist die Methode, mit der Anwendungsthreads asynchrone E/A-Anforderungen nur verarbeiten, wenn sie sich in einem warnungsfähigen Zustand befinden.
Um zu verstehen, wann sich ein Thread in einem warnungsfähigen Zustand befindet, berücksichtigen Sie das folgende Szenario:
- Ein Thread initiiert eine asynchrone Leseanforderung, indem ReadFileEx- mit einem Zeiger auf eine Rückruffunktion aufgerufen wird.
- Der Thread initiiert eine asynchrone Schreibanforderung, indem WriteFileEx- mit einem Zeiger auf eine Rückruffunktion aufgerufen wird.
- Der Thread ruft eine Funktion auf, die eine Datenzeile von einem Remotedatenbankserver abruft.
In diesem Szenario werden die Aufrufe von ReadFileEx- und WriteFileEx- wahrscheinlich vor dem Funktionsaufruf in Schritt 3 zurückgegeben. In diesem Schritt platziert der Kernel die Zeiger auf die Rückruffunktionen in der APC-Warteschlange (APC). Der Kernel verwaltet diese Warteschlange speziell, um zurückgegebene E/A-Anforderungsdaten zu speichern, bis sie vom entsprechenden Thread verarbeitet werden kann.
Wenn der Zeilenabruf abgeschlossen ist und der Thread von der Funktion zurückgibt, besteht die höchste Priorität darin, die zurückgegebenen E/A-Anforderungen in der Warteschlange durch Aufrufen der Rückruffunktionen zu verarbeiten. Dazu muss er einen warnbaren Zustand eingeben. Ein Thread kann dies nur tun, indem eine der folgenden Funktionen mit den entsprechenden Flags aufgerufen wird:
- SleepEx-
- WaitForSingleObjectEx
- WaitForMultipleObjectsEx
- SignalObjectAndWait
- MsgWaitForMultipleObjectsEx-
Wenn der Thread in einen warnungsfähigen Zustand wechselt, treten die folgenden Ereignisse auf:
- 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.
- Der Thread führt die Rückruffunktion aus.
- Die Schritte 1 und 2 werden für jeden Zeiger wiederholt, der in der Warteschlange verbleibt.
- Wenn die Warteschlange leer ist, gibt der Thread von der Funktion zurück, die sie in einen warnbaren Zustand versetzt hat.
In diesem Szenario ruft der Thread, nachdem der Thread in einen warnbaren Zustand wechselt, die Rückruffunktionen, die an ReadFileEx gesendet werden, und WriteFileEx, und gibt dann von der Funktion zurück, die sie in einem warnbaren Zustand platziert hat.
Wenn ein Thread in einen warnbaren Zustand wechselt, während die APC-Warteschlange leer ist, wird die Ausführung des Threads vom Kernel angehalten, bis einer der folgenden Aktionen auftritt:
- Das Kernelobjekt, auf das gewartet wird, wird signalisiert.
- Ein Rückruffunktionspunkt wird in der APC-Warteschlange platziert.
Ein Thread, der warnungsfähige E/A-Vorgänge verwendet, verarbeitet asynchrone E/A-Anforderungen effizienter, als wenn sie einfach auf das Ereignisflagge in der OVERLAPPED- Struktur warten, die festgelegt werden soll, und der warnungsfähige E/A-Mechanismus ist weniger kompliziert als E/A-Vervollständigungsports zu verwenden. Warnungsfähige E/A gibt jedoch das Ergebnis der E/A-Anforderung nur an den Thread zurück, der sie initiiert hat. E/A-Vervollständigungsports haben diese Einschränkung nicht.
Verwandte Themen