Auftragsobjekte
Ein Auftragsobjekt ermöglicht die Verwaltung von Prozessgruppen als Einheit. Auftragsobjekte sind namable, sicherungsfähige, teilbare Objekte, die Attribute der ihnen zugeordneten Prozesse steuern. Vorgänge, die für ein Auftragsobjekt ausgeführt werden, wirken sich auf alle Prozesse aus, die dem Auftragsobjekt zugeordnet sind. Beispiele hierfür sind das Erzwingen von Grenzwerten wie Arbeitssatzgröße und Prozesspriorität oder das Beenden aller Prozesse, die einem Auftrag zugeordnet sind.
- Erstellen von Aufträgen
- Verwalten von Prozessen in Aufträgen
- Auftragsbeschränkungen und Benachrichtigungen
- Ressourcenbuchhaltung für Aufträge
- Verwalten von Auftragsobjekten
- Verwalten einer Prozessstruktur, die Auftragsobjekte
Erstellen von Aufträgen
Verwenden Sie zum Erstellen eines Auftragsobjekts die CreateJobObject--Funktion. Wenn der Auftrag erstellt wird, werden dem Auftrag keine Prozesse zugeordnet.
Verwenden Sie zum Zuordnen eines Prozesses zu einem Auftrag die AssignProcessToJobObject--Funktion. Nachdem ein Prozess einem Auftrag zugeordnet ist, kann die Zuordnung nicht unterbrochen werden. Ein Prozess kann mehreren Aufträgen in einer Hierarchie geschachtelter Aufträge zugeordnet werden. Weitere Informationen finden Sie unter Geschachtelte Aufträge.
Windows 7, Windows Server 2008 R2, Windows XP mit SP3, Windows Server 2008, Windows Vista und Windows Server 2003: Ein Prozess kann nur einem Auftrag zugeordnet werden. Aufträge können nicht geschachtelt werden. Die Möglichkeit zum Schachteln von Aufträgen wurde in Windows 8 und Windows Server 2012 hinzugefügt.
Sie können einen Sicherheitsdeskriptor für ein Auftragsobjekt angeben, wenn Sie die CreateJobObject--Funktion aufrufen. Weitere Informationen finden Sie unter Job Object Security and Access Rights.
Verwalten von Prozessen in Aufträgen
Nachdem ein Prozess einem Auftrag zugeordnet ist, werden standardmäßig alle untergeordneten Prozesse, die mit CreateProcess- erstellt werden, ebenfalls dem Auftrag zugeordnet. (Untergeordnete Prozesse, die mit Win32_Process.Create erstellt wurden, sind dem Auftrag nicht zugeordnet.) Dieses Standardverhalten kann durch Festlegen des erweiterten Grenzwerts JOB_OBJECT_LIMIT_BREAKAWAY_OK oder JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK für den Auftrag geändert werden.
- Wenn der Auftrag den erweiterten Grenzwert JOB_OBJECT_LIMIT_BREAKAWAY_OK und der übergeordnete Prozess mit dem CREATE_BREAKAWAY_FROM_JOB Flag erstellt wurde, werden untergeordnete Prozesse des übergeordneten Prozesses nicht mit dem Auftrag verknüpft.
- Wenn der Auftrag den erweiterten Grenzwert JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK hat, werden untergeordnete Prozesse eines übergeordneten Prozesses, der dem Auftrag zugeordnet ist, nicht mit dem Auftrag verknüpft. Es ist nicht erforderlich, dass übergeordnete Prozesse mit dem CREATE_BREAKAWAY_FROM_JOB-Flag erstellt werden.
Wenn der Auftrag geschachtelt ist, wirken sich die Unterbrechungseinstellungen der übergeordneten Aufträge in der Hierarchie darauf aus, ob untergeordnete Prozesse einem anderen Auftrag in der Hierarchie zugeordnet sind. Weitere Informationen finden Sie unter Geschachtelte Aufträge.
Um festzustellen, ob ein Prozess in einem Auftrag ausgeführt wird, verwenden Sie die IsProcessInJob--Funktion.
Verwenden Sie zum Beenden aller Prozesse, die derzeit einem Auftragsobjekt zugeordnet sind, die TerminateJobObject--Funktion.
Auftragsbeschränkungen und Benachrichtigungen
Ein Auftrag kann Grenzwerte wie Arbeitssatzgröße, Prozesspriorität und End-of-Job-Zeitlimit für jeden Prozess erzwingen, der dem Auftrag zugeordnet ist. Wenn ein mit einem Auftrag verknüpfter Prozess versucht, seine Arbeitssatzgröße oder Prozesspriorität von der durch den Auftrag festgelegten Grenze zu erhöhen, wird der Funktionsaufruf erfolgreich ausgeführt, wird jedoch im Hintergrund ignoriert. Ein Auftrag kann auch Grenzwerte festlegen, die eine Benachrichtigung auslösen, wenn sie überschritten werden, aber zulassen, dass der Auftrag weiterhin ausgeführt wird.
Verwenden Sie zum Festlegen von Grenzwerten für einen Auftrag die SetInformationJobObject--Funktion. Eine Liste der möglichen Grenzwerte, die für einen Auftrag festgelegt werden können, finden Sie in den folgenden Themen:
- JOBOBJECT_BASIC_LIMIT_INFORMATION
- JOBOBJECT_BASIC_UI_RESTRICTIONS
- JOBOBJECT_CPU_RATE_CONTROL_INFORMATION
- JOBOBJECT_EXTENDED_LIMIT_INFORMATION
- JOBOBJECT_NOTIFICATION_LIMIT_INFORMATION
Sicherheitsgrenzwerte müssen für jeden Prozess, der einem Auftragsobjekt zugeordnet ist, einzeln festgelegt werden. Weitere Informationen finden Sie unter Prozesssicherheits- und Zugriffsberechtigungen.
Windows XP mit SP3 und Windows Server 2003: Die funktion SetInformationJobObject kann verwendet werden, um Sicherheitsbeschränkungen für alle Prozesse festzulegen, die einem Auftragsobjekt zugeordnet sind. Ab Windows Vista müssen Sicherheitsgrenzwerte für jeden Prozess, der einem Auftragsobjekt zugeordnet ist, einzeln festgelegt werden.
Wenn der Auftrag geschachtelt ist, beeinflussen übergeordnete Aufträge in der Hierarchie den Grenzwert, der für den Auftrag erzwungen wird. Weitere Informationen finden Sie unter Geschachtelte Aufträge.
Wenn der Auftrag über einen zugeordneten E/A-Vervollständigungsport verfügt, kann er Benachrichtigungen empfangen, wenn bestimmte Auftragsgrenzwerte überschritten werden. Das System sendet Nachrichten an den Abschlussport, wenn ein Grenzwert überschritten wird oder bestimmte andere Ereignisse auftreten. Verwenden Sie zum Zuordnen eines Abschlussports zu einem Auftrag die SetInformationJobObject- Funktion der Auftragsobjektinformationsklasse JobObjectAssociateCompletionPortInformation und einen Zeiger auf eine JOBOBJECT_ASSOCIATE_COMPLETION_PORT Struktur. Es empfiehlt sich, dies zu tun, wenn der Auftrag inaktiv ist, um die Wahrscheinlichkeit fehlender Benachrichtigungen für Prozesse zu verringern, deren Status sich während der Zuordnung des Abschlussports ändern.
Alle Nachrichten werden direkt vom Auftrag gesendet, als ob der Auftrag die PostQueuedCompletionStatus- funktion aufgerufen hatte. Ein Thread muss den Abschlussport mithilfe der GetQueuedCompletionStatus- Funktion überwachen, um die Nachrichten aufzunehmen. Beachten Sie, dass die Übermittlung von Nachrichten an den Abschlussport mit ausnahme der JobObjectNotificationLimitInformation Informationsklasse nicht gewährleistet ist; Ein Eintreffen einer Nachricht bedeutet nicht unbedingt, dass das Ereignis nicht aufgetreten ist. Benachrichtigungen für Grenzwerte, die mit JobObjectNotificationLimitInformation festgelegt sind, werden garantiert am Abschlussport ankommen. Eine Liste der möglichen Nachrichten finden Sie unter JOBOBJECT_ASSOCIATE_COMPLETION_PORT.
Ressourcenbuchhaltung für Aufträge
Das Auftragsobjekt zeichnet grundlegende Buchhaltungsinformationen für alle zugehörigen Prozesse auf, einschließlich derjenigen, die beendet wurden. Verwenden Sie zum Abrufen dieser Buchhaltungsinformationen die QueryInformationJobObject--Funktion. Eine Liste der Buchhaltungsinformationen, die für einen Auftrag verwaltet werden, finden Sie in den folgenden Themen:
Wenn das Auftragsobjekt geschachtelt ist, werden die Buchhaltungsinformationen für jeden untergeordneten Auftrag in seinem übergeordneten Auftrag aggregiert. Weitere Informationen finden Sie unter Geschachtelte Aufträge.
Verwalten von Auftragsobjekten
Der Status eines Auftragsobjekts wird so festgelegt, dass er signalisiert wird, wenn alle Prozesse beendet werden, da das angegebene End-of-Job-Zeitlimit überschritten wurde. Verwenden Sie WaitForSingleObject oder WaitForSingleObjectEx-, um das Auftragsobjekt für dieses Ereignis zu überwachen.
Verwenden Sie zum Abrufen eines Handles für ein vorhandenes Auftragsobjekt die OpenJobObject--Funktion, und geben Sie den Namen des Objekts an, wenn es erstellt wurde. Nur benannte Auftragsobjekte können geöffnet werden.
Verwenden Sie zum Schließen eines Auftragsobjekthandles die CloseHandle--Funktion. Der Auftrag wird zerstört, wenn der letzte Handle geschlossen wurde und alle zugehörigen Prozesse beendet wurden. Wenn der Auftrag jedoch das JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE Flag angegeben hat, beendet das Schließen des letzten Auftragsobjekthandle alle zugeordneten Prozesse und zerstört dann das Auftragsobjekt selbst. Wenn ein geschachtelter Auftrag das JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE Flag angegeben hat, beendet das Schließen des letzten Auftragsobjekthandle alle Prozesse, die dem Auftrag zugeordnet sind, und seine untergeordneten Aufträge in der Hierarchie.
Verwalten einer Prozessstruktur, die Auftragsobjekte verwendet
Ab Windows 8 und Windows Server 2012 kann eine Anwendung geschachtelten Aufträge verwenden, um eine Prozessstruktur zu verwalten, die mehrere Auftragsobjekte verwendet. Eine Anwendung, die jedoch unter Windows 7, Windows Server 2008 R2 oder früheren Versionen von Windows ausgeführt werden muss, die keine geschachtelten Aufträge unterstützen, müssen die Prozessstruktur auf andere Weise verwalten.
Wenn ein Tool eine Prozessstruktur verwalten muss, die Auftragsobjekte verwendet, und es ist nicht möglich, geschachtelte Aufträge zu verwenden, müssen sowohl das Tool als auch die Member der Prozessstruktur zusammenarbeiten. Verwenden Sie eine der folgenden Optionen:
Verwenden Sie den Grenzwert für JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK. Wenn das Tool diesen Grenzwert verwendet, kann er keine gesamte Prozessstruktur überwachen. Das Tool kann nur die Prozesse überwachen, die dem Auftrag hinzugefügt werden. Wenn diese Prozesse untergeordnete Prozesse erstellen, sind sie nicht mit dem Auftrag verknüpft. In dieser Option können untergeordnete Prozesse anderen Auftragsobjekten zugeordnet werden.
Verwenden Sie den Grenzwert für JOB_OBJECT_LIMIT_BREAKAWAY_OK. Wenn das Tool diesen Grenzwert verwendet, kann es die gesamte Prozessstruktur überwachen, mit Ausnahme der Prozesse, die ein Element der Struktur explizit von der Struktur abbricht. Ein Element der Struktur kann einen untergeordneten Prozess in einem neuen Auftragsobjekt erstellen, indem die CreateProcess--Funktion mit dem CREATE_BREAKAWAY_FROM_JOB-Flag aufgerufen wird, und anschließend die AssignProcessToJobObject--Funktion aufgerufen wird. Andernfalls muss das Element Fälle behandeln, in denen AssignProcessToJobObject fehlschlägt.
Das flag CREATE_BREAKAWAY_FROM_JOB hat keine Auswirkung, wenn die Struktur nicht vom Tool überwacht wird. Daher ist dies die bevorzugte Option, erfordert aber voraussetzt, dass die Prozesse überwacht werden.
Verhindern Sie Unterbrechungen jeglicher Art, indem Sie weder die JOB_OBJECT_LIMIT_BREAKAWAY_OK noch die JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK Grenze festlegen. In dieser Option kann das Tool die gesamte Prozessstruktur überwachen. Wenn ein untergeordneter Prozess jedoch versucht, sich selbst oder einem anderen untergeordneten Prozess einem Auftrag zuzuordnen, indem AssignProcessToJobObjectaufgerufen wird, schlägt der Aufruf fehl. Wenn der Prozess einem bestimmten Auftrag zugeordnet wurde, kann dieser Fehler verhindern, dass der Prozess ordnungsgemäß funktioniert.