Geschachtelte Aufträge
Eine Anwendung kann geschachtelte Aufträge verwenden, um Teilmengen von Prozessen zu verwalten. Geschachtelte Aufträge ermöglichen auch eine Anwendung, die Aufträge verwendet, um andere Anwendungen zu hosten, die ebenfalls Aufträge verwenden.
Windows 7, Windows Server 2008 R2, Windows XP mit SP3, Windows Server 2008, Windows Vista und Windows Server 2003: Ein Prozess kann nur einem einzelnen Auftrag zugeordnet werden. Geschachtelte Aufträge wurden in Windows 8 und Windows Server 2012 eingeführt.
Dieses Thema bietet eine Übersicht über die Auftragsschachtelung und das Verhalten geschachtelter Aufträge:
- Geschachtelte Auftragshierarchien
- Erstellen einer geschachtelten Auftragshierarchie
- Auftragslimits und Benachrichtigungen für geschachtelte Aufträge
- Ressourcenbuchhaltung für geschachtelte Aufträge
- Beendigung geschachtelter Aufträge
Allgemeine Informationen zu Aufträgen und Auftragsobjekten finden Sie unter Auftragsobjekte.
Geschachtelte Auftragshierarchien
Geschachtelte Aufträge verfügen über eine beziehung zwischen übergeordnetem und untergeordnetem Element, in der jeder untergeordnete Auftrag eine Teilmenge der Prozesse in seinem übergeordneten Auftrag enthält. Wenn ein Prozess, der sich bereits in einem Auftrag befindet, einem anderen Auftrag hinzugefügt wird, werden die Aufträge standardmäßig geschachtelt, wenn das System eine gültige Auftragshierarchie bilden kann und keiner der Aufträge Ui-Grenzwerte festlegt (SetInformationJobObject mit JobObjectBasicUIRestrictions).
Abbildung 1 zeigt eine Auftragshierarchie, die eine Struktur von Prozessen mit der Bezeichnung P0 bis P7 enthält. Auftrag 1 ist der übergeordnete Auftrag von Job 2 und Job 4 und ist ein Vorgänger von Job 3. Job 2 ist das unmittelbare übergeordnete Element von Job 3. Job 3 ist das unmittelbare Kind von Job 2. Die Aufträge 1, 2 und 3 bilden eine Auftragskette , in der aufträge 1 und 2 die übergeordnete Auftragskette von Job 3 sind. Der Endauftrag in einer Auftragskette ist der unmittelbare Auftrag der Prozesse in diesem Auftrag. In Abbildung 1 ist Auftrag 3 der unmittelbare Auftrag der Prozesse P2, P3 und P4.
Geschachtelte Aufträge können auch zum Verwalten von Gruppen von Peerprozessen verwendet werden. In der Auftragshierarchie in Abbildung 2 ist Auftrag 1 der übergeordnete Auftrag von Auftrag 2. Beachten Sie, dass eine Auftragshierarchie nur einen Teil einer Prozessstruktur enthalten kann. In Abbildung 2 befindet sich P0 nicht in der Hierarchie, aber die untergeordneten Prozesse P1 bis P5 sind.
Erstellen einer geschachtelten Auftragshierarchie
Prozesse in einer Auftragshierarchie werden entweder explizit einem Auftragsobjekt mithilfe der Funktion AssignProcessToJobObject zugeordnet oder implizit während der Prozesserstellung zugeordnet, wie bei eigenständigen Aufträgen. Die Reihenfolge, in der Aufträge erstellt und Prozesse zugewiesen werden, bestimmt, ob eine Hierarchie erstellt werden kann.
Um eine Auftragshierarchie mithilfe einer expliziten Zuordnung zu erstellen, müssen alle Auftragsobjekte mit CreateJobObject erstellt werden. Anschließend muss AssignProcessToJobObject für jeden Prozess mehrmals aufgerufen werden, um den Prozess jedem Auftrag zuzuordnen, zu dem er gehören soll. Um sicherzustellen, dass die Auftragshierarchie gültig ist, weisen Sie zunächst dem Auftrag im Stamm der Hierarchie alle Prozesse zu, und weisen Sie dann dem unmittelbar untergeordneten Auftragsobjekt eine Teilmenge von Prozessen zu usw. Wenn Prozesse Aufträgen in dieser Reihenfolge zugewiesen werden, verfügt ein untergeordneter Auftrag immer über eine Teilmenge von Prozessen in seinem übergeordneten Auftrag, während die Hierarchie erstellt wird, was für die Schachtelung erforderlich ist. Wenn Prozesse Aufträgen in zufälliger Reihenfolge zugewiesen werden, verfügt ein untergeordneter Auftrag irgendwann über Prozesse, die sich nicht im übergeordneten Auftrag befinden. Dies ist durch Schachteln nicht zulässig und führt zu einem Fehler von AssignProcessToJobObject .
Wenn Prozesse während der Prozesserstellung implizit einem Auftrag zugeordnet werden, wird jedem Auftrag in der Auftragskette des übergeordneten Prozesses ein untergeordneter Prozess zugeordnet. Wenn das unmittelbare Auftragsobjekt eine Unterbrechung zulässt, löst sich der untergeordnete Prozess vom unmittelbaren Auftragsobjekt und von jedem Auftrag in der übergeordneten Auftragskette ab und bewegt sich in der Hierarchie nach oben, bis er einen Auftrag erreicht, der keine Unterbrechung zulässt. Wenn das unmittelbare Auftragsobjekt keine Unterbrechung zulässt, bricht der untergeordnete Prozess nicht ab, auch wenn Aufträge in seiner übergeordneten Auftragskette dies zulassen.
Auftragslimits und Benachrichtigungen für geschachtelte Aufträge
Für bestimmte Ressourcengrenzwerte bestimmt das für Aufträge in einer übergeordneten Auftragskette festgelegte Limit den effektiven Grenzwert , der für einen untergeordneten Auftrag erzwungen wird. Der effektive Grenzwert für untergeordnete Aufträge kann restriktiver sein als das Limit des übergeordneten Auftrags, darf aber nicht weniger einschränkend sein. Wenn die Prioritätsklasse eines untergeordneten Auftrags beispielsweise ABOVE_NORMAL_PRIORITY_CLASS ist und die Prioritätsklasse des übergeordneten Auftrags NORMAL_PRIORITY_CLASS ist, ist das effektive Limit für Prozesse im untergeordneten Auftrag NORMAL_PRIORITY_CLASS. Wenn die Prioritätsklasse des untergeordneten Auftrags jedoch BELOW_NORMAL_PRIORITY_CLASS ist, ist der effektive Grenzwert für Prozesse im untergeordneten Auftrag BELOW_NORMAL_PRIORITY_CLASS. Effektive Grenzwerte werden für Prioritätsklasse, Affinität, Commitgebühr, Ausführungszeitlimit pro Prozess, Zeitplanklassenlimit sowie Minimum und Maximum des Arbeitssatzes erzwungen. Weitere Informationen zu bestimmten Ressourcengrenzwerten finden Sie unter SetInformationJobObject.
Wenn bestimmte Ereignisse auftreten, z. B. neue Prozesserstellung oder Eine Verletzung des Ressourcenlimits, wird eine Nachricht an den E/A-Abschlussport gesendet, der einem Auftrag zugeordnet ist. Ein Auftrag kann sich auch registrieren, um Benachrichtigungen zu erhalten, wenn bestimmte Grenzwerte überschritten werden. Bei einem nicht geschachtelten Auftrag wird die Nachricht an den E/A-Abschlussport gesendet, der dem Auftrag zugeordnet ist. Bei einem geschachtelten Auftrag wird die Nachricht an jeden E/A-Vervollständigungsport gesendet, der jedem Auftrag in der übergeordneten Auftragskette des Auftrags zugeordnet ist, der die Nachricht ausgelöst hat. Ein untergeordneter Auftrag benötigt keinen zugeordneten E/A-Vervollständigungsport, damit Nachrichten, die er auslöst, an die E/A-Vervollständigungsports übergeordneter Aufträge gesendet werden, die höher in der Auftragskette liegen. Weitere Informationen zu bestimmten Nachrichten finden Sie unter JOBOBJECT_ASSOCIATE_COMPLETION_PORT.
Ressourcenbuchhaltung für geschachtelte Aufträge
Ressourcenbuchhaltungsinformationen für einen geschachtelten Auftrag beschreiben die Verwendung aller diesem Auftrag zugeordneten Prozesse, einschließlich Der Prozesse in untergeordneten Aufträgen. Jeder Auftrag in einer Auftragskette stellt daher die aggregierten Ressourcen dar, die von seinen eigenen Prozessen und den Prozessen jedes untergeordneten Auftrags unterhalb des Auftrags in der Auftragskette verwendet werden.
Beendigung geschachtelter Aufträge
Wenn ein Auftrag in einer Auftragshierarchie beendet wird, beendet das System Prozesse in diesem Auftrag und alle untergeordneten Aufträge, beginnend mit dem untergeordneten Auftrag am unteren Rand der Hierarchie. Ausstehende Ressourcen, die von jedem beendeten Prozess verwendet werden, werden dem übergeordneten Auftrag in Rechnung gestellt.
Das Auftragshandle muss über das JOB_OBJECT_TERMINATE-Zugriffsrecht verfügen, dasselbe wie für eigenständige Aufträge.