RX_CONTEXT- und IRP-Verwaltung
Die RX_CONTEXT-Struktur ist eine der grundlegenden Datenstrukturen, die von RDBSS- und Netzwerkminiumleitungen zum Verwalten eines E/A-Anforderungspakets (IRP) verwendet werden. Eine RX_CONTEXT-Struktur beschreibt eine IRP während der Verarbeitung und enthält Zustandsinformationen, mit denen globale Ressourcen freigegeben werden können, sobald die IRP abgeschlossen ist. Die RX_CONTEXT Datenstruktur kapselt eine IRP für die Verwendung durch RDBSS, Netzwerkminiumleitungen und das Dateisystem. Eine RX_CONTEXT-Struktur enthält einen Zeiger auf eine einzelne IRP und den gesamten Kontext, der zum Verarbeiten des IRP erforderlich ist.
Eine RX_CONTEXT-Struktur wird manchmal als IRP-Kontext oder RxContext in den WDK-Headerdateien (Windows Driver Kit) und anderen Ressourcen bezeichnet, die für die Entwicklung von Netzwerk-Miniumleitungstreibern verwendet werden.
Die RX_CONTEXT ist eine Datenstruktur, an die zusätzliche Informationen der verschiedenen Netzwerkminiumleitungen angefügt sind. Aus Entwurfssicht können diese zusätzlichen Informationen auf verschiedene Arten behandelt werden:
Lassen Sie zu, dass Kontextzeiger als Teil von RX_CONTEXT definiert werden, die Netzwerkminiumleitungen verwenden, um ihre Informationen zu speichern. Dies bedeutet, dass der Netzwerk-Miniumleitungstreiber jedes Mal, wenn eine RX_CONTEXT Struktur zugeordnet und zerstört wird, eine separate zugeordnete Zuordnung oder Zerstörung des Speicherblocks durchführen muss, der die zusätzlichen Netzwerkminiumleitungsinformationen enthält. Da RX_CONTEXT Strukturen in großer Zahl erstellt und zerstört werden, ist dies aus Sicht der Leistung keine akzeptable Lösung.
Ein weiterer Ansatz besteht darin, die Größe jeder RX_CONTEXT-Struktur durch einen vordefinierten Betrag für jeden Netzwerkminiumleitungsor zuzuteilen, der dann für die Verwendung durch den Miniumleitungsor reserviert ist. Ein solcher Ansatz vermeidet die zusätzliche Zuordnung und Zerstörung, erschwert jedoch den RX_CONTEXT Verwaltungscode in RDBSS.
Der dritte Ansatz besteht darin, einen vordefinierten Bereich zuzuweisen, der für alle Netzwerkminiumleitungen als Teil jedes RX_CONTEXT gleich ist. Dies ist ein unformatierter Bereich, auf dem jede gewünschte Struktur von den verschiedenen Netzwerkminiumleitungen aufgezwungen werden kann. Ein solcher Ansatz überwindet die Nachteile, die mit früheren Ansätzen verbunden sind. Dies ist der Ansatz, der derzeit in RDBSS implementiert wird.
Der dritte Ansatz ist das von RDBSS verwendete Schema. Daher sollten Entwickler von Netzwerk-Miniumleitungstreibern versuchen, den zugeordneten privaten Kontext zu definieren, um in diesen vordefinierten Bereich zu passen, der in der RX_CONTEXT Datenstruktur definiert ist. Netzwerk-Miniumleitungstreiber, die gegen diese Regel verstoßen, verursachen eine erhebliche Leistungseinbuße.
Viele RDBSS-Routinen und -Routinen, die von einem Netzwerkminiumleitungsor exportiert werden, verweisen auf RX_CONTEXT Strukturen entweder im initiierenden Thread oder in einem anderen thread, der von der Routine verwendet wird. Daher werden die RX_CONTEXT Strukturen referenziert, um ihre Verwendung für asynchrone Vorgänge zu verwalten. Wenn die Verweisanzahl auf 0 steigt, kann die RX_CONTEXT Struktur abgeschlossen und beim letzten Dereference-Vorgang freigegeben werden.
RDBSS stellt eine Reihe von Routinen bereit, die zum Bearbeiten einer RX_CONTEXT Struktur und der zugehörigen IRP verwendet werden. Diese Routinen werden verwendet, um eine RX_CONTEXT-Struktur zuzuordnen, zu initialisieren und zu löschen. Diese Routinen werden auch verwendet, um die mit einem RX_CONTEXT verknüpfte IRP abzuschließen und eine Abbruchroutine für eine RX_CONTEXT einzurichten.
Die folgenden Routinen bearbeiten RX_CONTEXT Strukturen:
-Routine zurückgegebener Wert | BESCHREIBUNG |
---|---|
Diese Routine wird verwendet, um eine IRP abzuschließen, die einer RX_CONTEXT-Struktur zugeordnet ist. Diese Routine wird intern von RDBSS verwendet und sollte nicht von Netzwerkminiumleitungen verwendet werden. |
|
Diese Routine wird verwendet, um eine IRP abzuschließen, die einer RX_CONTEXT-Struktur zugeordnet ist. Diese Routine wird intern von RDBSS verwendet und sollte nicht von Netzwerkminiumleitungen verwendet werden. |
|
Diese Routine weist eine neue RX_CONTEXT-Struktur zu und initialisiert die Datenstruktur. |
|
Diese Routine leitet eine RX_CONTEXT-Struktur ab, und wenn die Verweisanzahl auf 0 0 geht, wird die Zuordnung aufgehoben und die angegebene RX_CONTEXT-Struktur aus den RDBSS-In-Memory-Datenstrukturen entfernt. |
|
Diese Routine initialisiert eine neu zugeordnete RX_CONTEXT-Struktur. |
|
Diese Routine bereitet eine RX_CONTEXT Struktur für die Wiederverwendung vor, indem alle zuvor vorgenommenen vorgangsspezifischen Zuordnungen und Übernahmen zurückgesetzt werden. Die vom IRP erhaltenen Parameter werden nicht geändert. Diese Routine wird intern von RDBSS verwendet und sollte nicht von Netzwerkminiumleitungen verwendet werden. |
|
Diese Routine aktiviert den nächsten wartenden Thread (falls vorhanden) in der serialisierten blockierenden E/A-Warteschlange. |
|
Die Routine richtet eine Netzwerk-Miniumleitungsroutine für eine RX_CONTEXT-Struktur ein. |
|
__RxSynchronizeBlockingOperations | Diese Routine wird verwendet, um blockierende E/A mit derselben Arbeitswarteschlange zu synchronisieren. Diese Routine wird intern von RDBSS verwendet, um Named Pipe-Vorgänge zu synchronisieren. Diese Routine kann von einem Netzwerkminiumleitungsor verwendet werden, um Vorgänge in einer separaten Warteschlange zu synchronisieren, die vom Netzwerkminiumleitungsor verwaltet wird. Die Routine ist nur unter Windows Server 2003 verfügbar. |
__RxSynchronizeBlockingOperationsMaybeDroppingFcbLock | Diese Routine wird verwendet, um blockierende E/A mit derselben Arbeitswarteschlange zu synchronisieren. Diese Routine wird intern von RDBSS verwendet, um Named Pipe-Vorgänge zu synchronisieren. Diese Routine kann von einem Netzwerkminiumleitungsor verwendet werden, um Vorgänge in einer separaten Warteschlange zu synchronisieren, die vom Netzwerkminiumleitungsor verwaltet wird. Die Routine ist nur unter Windows XP und Windows 2000 verfügbar. |
Die folgenden Makros sind in der Headerdatei rxcontx.h definiert, die die in der vorherigen Tabelle aufgeführten Routinen aufrufen. Diese Makros werden normalerweise verwendet, anstatt diese Routinen direkt aufzurufen.
Makro | Beschreibung |
---|---|
RxSynchronizeBlockingOperations(RXCONTEXT,FCB,IOQUEUE) |
Dieses Makro synchronisiert blockierende E/A-Anforderungen mit derselben Arbeitswarteschlange. Unter Windows Server 2003 ruft dieses Makro die __RxSynchronizeBlockingOperations Routine auf, wobei der DropFcbLock-Parameter auf FALSE festgelegt ist. Unter Windows XP und Windows 2000 ruft dieses Makro die __RxSynchronizeBlockingOperationsMaybeDroppingFcbLock Routine auf, wobei der DropFcbLock-Parameter auf FALSE festgelegt ist. |
RxSynchronizeBlockingOperations(RXCONTEXT,FCB,IOQUEUE) |
Dieses Makro synchronisiert blockierende E/A-Anforderungen mit derselben Arbeitswarteschlange. Unter Windows Server 2003 ruft dieses Makro die __RxSynchronizeBlockingOperations Routine auf, wobei der DropFcbLock-Parameter auf TRUE festgelegt ist. Unter Windows XP und Windows 2000 ruft dieses Makro die __RxSynchronizeBlockingOperationsMaybeDroppingFcbLock Routine auf, wobei der DropFcbLock-Parameter auf TRUE festgelegt ist. |