Udostępnij za pośrednictwem


Zagnieżdżone zadania

Aplikacja może używać zagnieżdżonych zadań do zarządzania podzestawami procesów. Zagnieżdżone zadania umożliwiają również aplikację, która używa zadań do hostowania innych aplikacji, które również używają zadań.

Windows 7, Windows Server 2008 R2, Windows XP z dodatkiem SP3, Windows Server 2008, Windows Vista i Windows Server 2003: Proces może być skojarzony tylko z jednym zadaniem. Zagnieżdżone zadania zostały wprowadzone w systemach Windows 8 i Windows Server 2012.

Ten temat zawiera omówienie zagnieżdżania zadań i zachowania zagnieżdżonych zadań:

Aby uzyskać ogólne informacje o zadaniach i obiektach zadań, zobacz Obiekty zadań.

Zagnieżdżone hierarchie zadań

Zagnieżdżone zadania mają relację nadrzędny-podrzędny, w której każde zadanie podrzędne zawiera podzestaw procesów w zadaniu nadrzędnym. Jeśli proces, który znajduje się już w zadaniu, jest dodawany do innego zadania, zadania są domyślnie zagnieżdżone, jeśli system może utworzyć prawidłową hierarchię zadań, a żadne z nich nie ustawia limitów interfejsu użytkownika (SetInformationJobObject z JobObjectBasicUIRestrictions).

Rysunek 1 przedstawia hierarchię zadań zawierającą drzewo procesów oznaczonych etykietą P0 do P7. Zadanie 1 to zadanie nadrzędne zadania 2 i zadanie 4. Jest to przodkiem zadania 3. Zadanie 2 jest bezpośrednim nadrzędnym zadania 3; Zadanie 3 to natychmiastowego podrzędnego zadania 2. Zadania 1, 2 i 3 tworzą łańcuch zadań , w którym zadania 1 i 2 są nadrzędnym łańcuchem zadań zadania 3. Zadanie końcowe w łańcuchu zadań to natychmiastowe zadanie procesów w tym zadaniu. Na rysunku 1 zadanie 3 jest bezpośrednim zadaniem procesów P2, P3 i P4.

rysunek 1. hierarchia zagnieżdżonych zadań zawierająca drzewo procesów

Zagnieżdżone zadania mogą również służyć do zarządzania grupami procesów równorzędnych. W hierarchii zadań pokazanej na rysunku 2 zadanie 1 jest zadaniem nadrzędnym zadania zadania 2. Należy pamiętać, że hierarchia zadań może zawierać tylko część drzewa procesów. Na rysunku 2 P0 nie znajduje się w hierarchii, ale jego podrzędne procesy P1 do P5 są.

rysunek 2. hierarchia zagnieżdżonych zadań zawierająca procesy równorzędne

Tworzenie zagnieżdżonej hierarchii zadań

Procesy w hierarchii zadań są jawnie skojarzone z obiektem zadania przy użyciu funkcji AssignProcessToJobObject lub niejawnie skojarzonej podczas tworzenia procesu, tak samo jak w przypadku zadań autonomicznych. Kolejność tworzenia zadań i przypisywania procesów określa, czy można utworzyć hierarchię.

Aby utworzyć hierarchię zadań przy użyciu jawnego skojarzenia, wszystkie obiekty zadań muszą być tworzone przy użyciu CreateJobObject, a następnie AssignProcessToJobObject muszą być wywoływane wiele razy, aby każdy proces skojarzył proces z każdym zadaniem, do którego powinien należeć. Aby upewnić się, że hierarchia zadań jest prawidłowa, najpierw przypisz wszystkie procesy do zadania w katalogu głównym hierarchii, a następnie przypisz podzestaw procesów do obiektu zadania bezpośredniego podrzędnego itd. Jeśli procesy są przypisywane do zadań w tej kolejności, zadanie podrzędne zawsze będzie mieć podzbiór procesów w zadaniu nadrzędnym podczas tworzenia hierarchii, która jest wymagana do zagnieżdżania. Jeśli procesy są przypisywane do zadań w losowej kolejności, w pewnym momencie zadanie podrzędne będzie zawierać procesy, które nie znajdują się w zadaniu nadrzędnym. Nie jest to dozwolone przez zagnieżdżanie i spowoduje to niepowodzenie AssignProcessToJobObject.

Gdy procesy są niejawnie skojarzone z zadaniem podczas tworzenia procesu, proces podrzędny jest skojarzony z każdym zadaniem w łańcuchu zadań jego procesu nadrzędnego. Jeśli obiekt zadania bezpośredniego zezwala na przerwanie, proces podrzędny odłamuje się od obiektu zadania bezpośredniego i z każdego zadania w nadrzędnym łańcuchu zadań, przenosząc hierarchię do momentu osiągnięcia zadania, które nie zezwala na przerwanie. Jeśli obiekt zadania bezpośredniego nie zezwala na przerwanie, proces podrzędny nie przerywa się nawet wtedy, gdy zadania w nadrzędnym łańcuchu zadań zezwalają na to.

Limity zadań i powiadomienia dotyczące zagnieżdżonych zadań

W przypadku niektórych limitów zasobów limit ustawiony dla zadań w nadrzędnym łańcuchu zadań określa obowiązujący limit, który jest wymuszany dla zadania podrzędnego. Skuteczny limit dla zadania podrzędnego może być bardziej restrykcyjny niż limit jego elementu nadrzędnego, ale nie może być mniej restrykcyjny. Jeśli na przykład klasa priorytetu zadania podrzędnego jest ABOVE_NORMAL_PRIORITY_CLASS, a klasa priorytetu zadania nadrzędnego jest NORMAL_PRIORITY_CLASS, obowiązującą granicą procesów w zadaniu podrzędnym jest NORMAL_PRIORITY_CLASS. Jeśli jednak klasa priorytetu zadania podrzędnego jest BELOW_NORMAL_PRIORITY_CLASS, efektywny limit procesów w zadaniu podrzędnym jest BELOW_NORMAL_PRIORITY_CLASS. Obowiązujące limity są wymuszane dla klasy priorytetu, koligacji, opłaty za zatwierdzenie, limitu czasu wykonywania poszczególnych procesów, limitu klasy planowania i minimalnego i maksymalnego zestawu roboczego. Aby uzyskać więcej informacji na temat określonych limitów zasobów, zobacz SetInformationJobObject.

W przypadku wystąpienia niektórych zdarzeń, takich jak naruszenie nowego procesu lub limitu zasobów, komunikat jest wysyłany do portu ukończenia we/wy skojarzonego z zadaniem. Zadanie może również zarejestrować się w celu otrzymywania powiadomień po przekroczeniu określonych limitów. W przypadku zadania niezagnieżdżonego komunikat jest wysyłany do portu ukończenia we/wy skojarzonego z zadaniem. W przypadku zadania zagnieżdżonego komunikat jest wysyłany do każdego portu ukończenia we/wy skojarzonego z dowolnym zadaniem w nadrzędnym łańcuchu zadań zadania, które wyzwoliło komunikat. Zadanie podrzędne nie musi mieć skojarzonego portu uzupełniania we/wy dla komunikatów, które wyzwala do portów uzupełniania we/wy wyższego poziomu w łańcuchu zadań nadrzędnych. Aby uzyskać więcej informacji na temat określonych komunikatów, zobacz JOBOBJECT_ASSOCIATE_COMPLETION_PORT.

Ewidencjonowanie zasobów dla zagnieżdżonych zadań

Informacje o ewidencjonowaniu zasobów dla zagnieżdżonego zadania opisują użycie każdego procesu skojarzonego z tym zadaniem, w tym procesów w zadaniach podrzędnych. Każde zadanie w łańcuchu zadań reprezentuje zatem zagregowane zasoby używane przez własne procesy i procesy każdego podrzędnego zadania podrzędnego poniżej tego zadania w łańcuchu zadań.

Kończenie zagnieżdżonych zadań

Gdy zadanie w hierarchii zadań zostanie zakończone, system kończy procesy w tym zadaniu i wszystkie zadania podrzędne, począwszy od zadania podrzędnego w dolnej części hierarchii. Zaległe zasoby używane przez każdy zakończony proces są naliczane opłaty za zadanie nadrzędne.

Dojście zadania musi mieć prawo dostępu JOB_OBJECT_TERMINATE takie samo jak w przypadku zadań autonomicznych.