Auftragsobjekte

Mit einem Auftragsobjekt können Gruppen von Prozessen als Einheit verwaltet werden. Auftragsobjekte sind lesbare, sicherungsfähige, sharable-Objekte, die Attribute der ihnen zugeordneten Prozesse steuern. Vorgänge für ein Auftragsobjekt wirken sich auf alle Prozesse aus, die dem Auftragsobjekt zugeordnet sind. Beispiele hierfür sind das Erzwingen von Grenzwerten wie Workingsetgröße und Prozesspriorität oder das Beenden aller Prozesse, die einem Auftrag zugeordnet sind.

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 die AssignProcessToJobObject-Funktion, um einen Prozess einem Auftrag zu zuordnen. Nachdem ein Prozess einem Auftrag zugeordnet wurde, kann die Zuordnung nicht mehr unterbrochen werden. Ein Prozess kann mehr als einem Auftrag 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.

Sie können eine Sicherheitsbeschreibung für ein Auftragsobjekt angeben, wenn Sie die CreateJobObject-Funktion aufrufen. Weitere Informationen finden Sie unter Auftragsobjektsicherheit und Zugriffsrechte.

Verwalten von Prozessen in Aufträgen

Nachdem ein Prozess einem Auftrag zugeordnet wurde, werden standardmäßig auch alle untergeordneten Prozesse, die er mit CreateProcess erstellt, 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 über den erweiterten Grenzwert JOB OBJECT LIMIT BREAKAWAY OK verfügt und der übergeordnete Prozess mit dem _ _ CREATE _ _ BREAKAWAY FROM JOB-Flag erstellt _ _ wurde, werden untergeordnete Prozesse des _ übergeordneten Prozesses dem Auftrag nicht zugeordnet.
  • Wenn der Auftrag den erweiterten Grenzwert JOB OBJECT LIMIT SILENT BREAKAWAY OK aufwies, werden untergeordnete Prozesse eines übergeordneten Prozesses, der dem Auftrag zugeordnet ist, _ _ nicht dem Auftrag _ _ _ zugeordnet. Übergeordnete Prozesse müssen nicht mit dem Flag CREATE _ BREAKAWAY _ FROM JOB erstellt _ werden.

Wenn der Auftrag geschachtelt ist, wirken sich die Breakawayeinstellungen übergeordneter 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.

Verwenden Sie die IsProcessInJob-Funktion, um zu ermitteln, ob ein Prozess in einem Auftrag ausgeführt wird.

Verwenden Sie die TerminateJobObject-Funktion, um alle Prozesse zu beenden, die derzeit einem Auftragsobjekt zugeordnet sind.

Auftragsgrenzwerte und Benachrichtigungen

Ein Auftrag kann Grenzwerte wie Workingsetgröße, Prozesspriorität und Zeitlimit am Ende des Auftrags für jeden Prozess erzwingen, der dem Auftrag zugeordnet ist. Wenn ein einem Auftrag zugeordneter Prozess versucht, seine Arbeitssatzgröße oder Prozesspriorität von dem vom Auftrag festgelegten Grenzwert zu erhöhen, werden die Funktionsaufrufe erfolgreich, aber im Hintergrund ignoriert. Ein Auftrag kann auch Grenzwerte festlegen, die eine Benachrichtigung auslösen, wenn sie überschritten werden, der Auftrag jedoch weiterhin ausgeführt werden kann.

Verwenden Sie zum Festlegen von Grenzwerten für einen Auftrag die Funktion SetInformationJobObject. Eine Liste der möglichen Grenzwerte, die für einen Auftrag festgelegt werden können, finden Sie in den folgenden Themen:

Sicherheitsgrenzwerte müssen für jeden Prozess, der einem Auftragsobjekt zugeordnet ist, einzeln festgelegt werden. Weitere Informationen finden Sie unter Prozesssicherheit und Zugriffsrechte.

Windows XP mit SP3 und Windows Server 2003: Mit der SetInformationJobObject-Funktion können Sicherheitseinschränkungen für alle Prozesse festgelegt werden, 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 dem Auftrag ein E/A-Abschlussport zugeordnet ist, 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 mit der Auftragsobjekt-Informationsklasse JobObjectAssociateCompletionPortInformation und einem Zeiger auf eine JOBOBJECT _ ASSOCIATE COMPLETION _ _ PORT-Struktur. Es ist am besten, dies zu tun, wenn der Auftrag inaktiv ist, um die Wahrscheinlichkeit zu verringern, dass Benachrichtigungen für Prozesse fehlen, deren Zustände sich während der Zuordnung des Abschlussports ändern.

Alle Nachrichten werden direkt vom Auftrag gesendet, als hätte der Auftrag die PostQueuedCompletionStatus-Funktion aufgerufen. Ein Thread muss den Abschlussport mithilfe der GetQueuedCompletionStatus-Funktion überwachen, um die Nachrichten zu empfangen. Beachten Sie, dass die Übermittlung von Nachrichten an den Vervollständigungsport mit Ausnahme der mit der JobObjectNotificationLimitInformation-Informationsklasse festgelegten Grenzwerte nicht garantiert ist. Wenn eine Nachricht nicht eintrifft, bedeutet dies nicht unbedingt, dass das Ereignis nicht erfolgt ist. Benachrichtigungen für Grenzwerte, die mit JobObjectNotificationLimitInformation festgelegt wurden, werden garantiert am Abschlussport eintreffen. Eine Liste der möglichen Meldungen finden Sie unter JOBOBJECT _ ASSOCIATE COMPLETION _ _ PORT.

Ressourcenabrechnung für Aufträge

Das Auftragsobjekt zeichnet grundlegende Buchhaltungsinformationen für alle zugehörigen Prozesse auf, einschließlich der prozesse, die beendet wurden. Um diese Buchhaltungsinformationen abzurufen, verwenden Sie 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 Kontoführungsinformationen für jeden untergeordneten Auftrag im übergeordneten Auftrag aggregiert. Weitere Informationen finden Sie unter Geschachtelte Aufträge.

Verwalten von Auftragsobjekten

Der Status eines Auftragsobjekts wird auf signalisiert festgelegt, wenn alle Prozesse beendet werden, weil das angegebene Zeitlimit für das Ende des Auftrags überschritten wurde. Verwenden Sie WaitForSingleObject oder WaitForSingleObjectEx, um das Auftragsobjekt für dieses Ereignis zu überwachen.

Um ein Handle für ein vorhandenes Auftragsobjekt zu erhalten, verwenden Sie die OpenJobObject-Funktion, und geben Sie den Namen an, der dem Objekt beim Erstellen gegeben 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 das letzte Handle geschlossen und alle zugehörigen Prozesse beendet wurden. Wenn für den Auftrag jedoch das Flag JOB OBJECT LIMIT KILL ON JOB CLOSE angegeben ist, beendet das Schließen des letzten Auftragsobjekthandpunkts alle zugeordneten Prozesse und zerstört dann das Auftragsobjekt _ _ _ _ _ _ selbst. Wenn für einen geschachtelten Auftrag das Flag JOB OBJECT LIMIT KILL ON JOB CLOSE angegeben ist, beendet das Schließen des letzten Auftragsobjekthand handles alle Prozesse, die dem Auftrag und seinen untergeordneten Aufträgen in der Hierarchie _ _ zugeordnet _ _ _ _ sind.

Verwalten einer Prozessstruktur, die Auftragsobjekte verwendet

Beginnend mit Windows 8 und Windows Server 2012 kann eine Anwendung geschachtelte Aufträge verwenden, um eine Prozessstruktur zu verwalten, die mehr als ein Auftragsobjekt verwendet. Eine Anwendung, die auf Windows 7, Windows Server 2008 R2 oder früheren Versionen von Windows ausgeführt werden muss, die geschachtelte Aufträge nicht unterstützen, muss die Prozessstruktur jedoch auf andere Weise verwalten.

Wenn ein Tool eine Prozessstruktur verwalten muss, die Auftragsobjekte verwendet, und es nicht möglich ist, geschachtelte Aufträge zu verwenden, müssen sowohl das Tool als auch die Elemente der Prozessstruktur zusammenarbeiten. Nutzen Sie eine der folgenden Optionen:

  • Verwenden Sie das LIMIT JOB _ OBJECT _ LIMIT SILENT _ _ BREAKAWAY _ OK. Wenn das Tool diesen Grenzwert verwendet, kann es keine gesamte Prozessstruktur überwachen. Das Tool kann nur die Prozesse überwachen, die es dem Auftrag hinzufügt. Wenn diese Prozesse untergeordnete Prozesse erstellen, sind sie dem Auftrag nicht zugeordnet. Bei 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 beliebiges Mitglied der Struktur explizit von der Struktur abbricht. Ein Member der Struktur kann einen untergeordneten Prozess in einem neuen Auftragsobjekt erstellen, indem er die CreateProcess-Funktion mit dem CREATE BREAKAWAY FROM JOB-Flag aufruft und dann die _ _ _ AssignProcessToJobObject-Funktion aufruft. Andernfalls muss der Member Fälle behandeln, in denen AssignProcessToJobObject fehlschlägt.

    Das CREATE _ BREAKAWAY _ FROM JOB-Flag hat keine Auswirkungen, wenn die Struktur nicht _ vom Tool überwacht wird. Daher ist dies die bevorzugte Option, erfordert jedoch vorauswissende Informationen zu den überwachten Prozessen.

  • Verhindern Sie Breakaways jeglicher Art, indem Sie weder das LIMIT JOB OBJECT LIMIT BREAKAWAY OK noch das _ LIMIT JOB OBJECT LIMIT SILENT _ _ _ _ _ _ _ BREAKAWAY OK _ festlegen. Bei dieser Option kann das Tool die gesamte Prozessstruktur überwachen. Wenn jedoch ein untergeordneter Prozess versucht, sich selbst oder einen anderen untergeordneten Prozess einem Auftrag durch Aufrufen von AssignProcessToJobObjectzu zuordnen, wird der Aufruf fehlschlagen. Wenn der Prozess so entworfen wurde, dass er einem bestimmten Auftrag zugeordnet wird, kann dieser Fehler verhindern, dass der Prozess ordnungsgemäß funktioniert.