Teilen über


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 auch 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 einzigen Auftrag zugeordnet werden. Geschachtelte Aufträge wurden in Windows 8 und Windows Server 2012 eingeführt.

Dieses Thema enthält eine Übersicht über das Schachteln von Aufträgen und das Verhalten geschachtelter Aufträge:

Allgemeine Informationen zu Aufträgen und Auftragsobjekten finden Sie unter Auftragsobjekte.

Geschachtelte Auftragshierarchien

Geschachtelte Aufträge haben eine Beziehung zwischen übergeordneten und untergeordneten Elementen, in denen 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 keines 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. Job 1 ist der Übergeordneten Job von Job 2 und Job 4, und es ist ein Vorgänger von Job 3. Job 2 ist die unmittelbaren Eltern von Job 3; Job 3 ist das unmittelbares Kind von Job 2. Aufträge 1, 2 und 3 bilden eine Auftragskette, in der Jobs 1 und 2 die übergeordnete Jobchain von Job 3 sind. Der Endauftrag in einer Auftragskette ist der unmittelbaren Auftrag der Prozesse in diesem Auftrag. In Abbildung 1 ist Auftrag 3 der unmittelbare Auftrag von Prozessen P2, P3 und P4.

Abbildung 1. eine geschachtelte Auftragshierarchie, die eine Prozessstruktur

Geschachtelte Aufträge können auch zum Verwalten von Gruppen von Peerprozessen verwendet werden. In der in Abbildung 2 dargestellten Auftragshierarchie ist Auftrag 1 der übergeordnete Auftrag von Job 2. Beachten Sie, dass eine Auftragshierarchie nur einen Teil einer Prozessstruktur enthalten kann. In Abbildung 2 befindet sich P0 nicht in der Hierarchie, aber seine untergeordneten Prozesse P1 bis P5 sind.

Abbildung 2. eine geschachtelte Auftragshierarchie, die Peerprozesse

Erstellen einer geschachtelten Auftragshierarchie

Prozesse in einer Auftragshierarchie werden entweder explizit einem Auftragsobjekt mithilfe der AssignProcessToJobObject--Funktion zugeordnet oder implizit während der Prozesserstellung zugeordnet, identisch mit 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 mit expliziter Zuordnung zu erstellen, müssen alle Auftragsobjekte mit CreateJobObjecterstellt werden, und AssignProcessToJobObject muss für jeden Prozess mehrmals aufgerufen werden, um den Prozess jedem Auftrag zuzuordnen, zu dem er gehören sollte. Um sicherzustellen, dass die Auftragshierarchie gültig ist, weisen Sie zuerst alle Prozesse dem Auftrag am Stamm der Hierarchie zu, und weisen Sie dann dem unmittelbar untergeordneten Auftragsobjekt eine Teilmenge von Prozessen zu, usw. Wenn Vorgänge aufträgen in dieser Reihenfolge zugewiesen werden, verfügt ein untergeordneter Auftrag immer über eine Teilmenge der Prozesse in seinem übergeordneten Auftrag, während die Hierarchie erstellt wird, die für die Schachtelung erforderlich ist. Wenn Prozessen Aufträgen in zufälliger Reihenfolge zugewiesen werden, verfügt ein untergeordneter Auftrag irgendwann über Prozesse, die sich nicht in seinem übergeordneten Auftrag befinden. Dies ist durch Schachteln nicht zulässig und führt dazu, dass AssignProcessToJobObject fehlschlägt.

Wenn Prozesse implizit einem Auftrag während der Prozesserstellung zugeordnet sind, wird ein untergeordneter Prozess jedem Auftrag in der Auftragskette des übergeordneten Prozesses zugeordnet. Wenn das direkte Auftragsobjekt eine Unterbrechung zulässt, bricht der untergeordnete Prozess vom unmittelbaren Auftragsobjekt und von jedem Auftrag in der übergeordneten Auftragskette ab und bewegt sich nach oben in der Hierarchie, bis er einen Auftrag erreicht, der keine Unterbrechung zulässt. Wenn das direkte Auftragsobjekt keine Unterbrechungen zulässt, wird der untergeordnete Prozess auch dann nicht abgebrochen, wenn Aufträge in der übergeordneten Auftragskette es zulassen.

Auftragsbeschränkungen und Benachrichtigungen für geschachtelte Aufträge

Bei bestimmten Ressourcengrenzwerten bestimmen die für Aufträge in einer übergeordneten Auftragskette festgelegten Grenzwerte die effektive Grenze, die für einen untergeordneten Auftrag erzwungen wird. Der effektive Grenzwert für Kinderjobs kann restriktiver sein als die Grenze seines Elternteils, kann aber nicht weniger restriktiv sein. Wenn z. B. die Prioritätsklasse eines Kindes ABOVE_NORMAL_PRIORITY_CLASS ist und die Prioritätsklasse ihres Elternteils NORMAL_PRIORITY_CLASS ist, wird der effektive Grenzwert für Prozesse im Untergeordneten Job NORMAL_PRIORITY_CLASS. Wenn die Prioritätsklasse des Kindes jedoch BELOW_NORMAL_PRIORITY_CLASS ist, ist die effektive Grenze für Prozesse im untergeordneten Job BELOW_NORMAL_PRIORITY_CLASS. Effektive Grenzwerte werden für Prioritätsklassen, Affinität, Commit-Belastung, Zeitlimit für die Ausführung pro Prozess, Grenzwert für die Terminplanungsklasse und Mindest- und Höchstwerte erzwungen. Weitere Informationen zu bestimmten Ressourcengrenzwerten finden Sie unter SetInformationJobObject.

Wenn bestimmte Ereignisse auftreten, z. B. neue Prozesserstellung oder Ressourcenbeschränkungsverletzung, wird eine Nachricht an den E/A-Vervollständigungsport 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-Vervollständigungsport 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 muss keinen zugeordneten E/A-Vervollständigungsport für Nachrichten haben, die ausgelöst werden, um an die E/A-Vervollständigungsports von übergeordneten Aufträgen weiter oben in der Auftragskette gesendet zu werden. 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 jedes Prozesses, der diesem Auftrag zugeordnet ist, 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 darunter 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, identisch mit eigenständigen Aufträgen.