Udostępnij za pośrednictwem


Obiekty zadań

Obiekt zadania umożliwia zarządzanie grupami procesów jako jednostką. Obiekty zadań są obiektami nazewnictwa, zabezpieczanymi, udostępnialnymi obiektami, które kontrolują atrybuty procesów skojarzonych z nimi. Operacje wykonywane na obiekcie zadania mają wpływ na wszystkie procesy skojarzone z obiektem zadania. Przykłady obejmują wymuszanie limitów, takich jak rozmiar zestawu roboczego i priorytet procesu lub kończenie wszystkich procesów skojarzonych z zadaniem.

Tworzenie zadań

Aby utworzyć obiekt zadania, użyj funkcji CreateJobObject. Po utworzeniu zadania żadne procesy nie są skojarzone z zadaniem.

Aby skojarzyć proces z zadaniem, użyj funkcji AssignProcessToJobObject. Po skojarzeniu procesu z zadaniem skojarzenie nie może zostać przerwane. Proces może być skojarzony z więcej niż jednym zadaniem w hierarchii zagnieżdżonych zadań. Aby uzyskać więcej informacji, zobacz zagnieżdżone zadania.

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. Nie można zagnieżdżać zadań. Możliwość zagnieżdżania zadań została dodana w systemach Windows 8 i Windows Server 2012.

Deskryptor zabezpieczeń dla obiektu zadania można określić podczas wywoływania funkcji CreateJobObject. Aby uzyskać więcej informacji, zobacz Job Object Security and Access Rights.

Zarządzanie procesami w zadaniach

Po skojarzeniu procesu z zadaniem wszystkie procesy podrzędne tworzone przy użyciu CreateProcess są również skojarzone z zadaniem. (Procesy podrzędne utworzone przy użyciu Win32_Process.Create nie są skojarzone z zadaniem). To zachowanie domyślne można zmienić, ustawiając JOB_OBJECT_LIMIT_BREAKAWAY_OK rozszerzonego limitu lub JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK dla zadania.

  • Jeśli zadanie ma rozszerzony limit JOB_OBJECT_LIMIT_BREAKAWAY_OK i proces nadrzędny został utworzony za pomocą flagi CREATE_BREAKAWAY_FROM_JOB, procesy podrzędne procesu nadrzędnego nie są skojarzone z zadaniem.
  • Jeśli zadanie ma rozszerzony limit JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK, procesy podrzędne dowolnego procesu nadrzędnego skojarzonego z zadaniem nie są skojarzone z zadaniem. Nie jest konieczne utworzenie procesów nadrzędnych za pomocą flagi CREATE_BREAKAWAY_FROM_JOB.

Jeśli zadanie jest zagnieżdżone, ustawienia podziału zadań nadrzędnych w hierarchii mają wpływ na to, czy procesy podrzędne są skojarzone z innym zadaniem w hierarchii. Aby uzyskać więcej informacji, zobacz zagnieżdżone zadania.

Aby określić, czy proces jest uruchomiony w zadaniu, użyj funkcji IsProcessInJob.

Aby zakończyć wszystkie procesy aktualnie skojarzone z obiektem zadania, użyj funkcji TerminateJobObject.

Limity zadań i powiadomienia

Zadanie może wymuszać limity, takie jak rozmiar zestawu roboczego, priorytet procesu i limit czasu zakończenia zadania dla każdego procesu skojarzonego z zadaniem. Jeśli proces skojarzony z zadaniem próbuje zwiększyć rozmiar zestawu roboczego lub priorytet procesu z limitu ustalonego przez zadanie, wywołania funkcji kończą się powodzeniem, ale są ignorowane w trybie dyskretnym. Zadanie może również ustawić limity, które wyzwalają powiadomienie po przekroczeniu, ale umożliwiają kontynuowanie działania zadania.

Aby ustawić limity dla zadania, użyj funkcji SetInformationJobObject. Aby uzyskać listę możliwych limitów, które można ustawić dla zadania, zobacz następujące tematy:

Limity zabezpieczeń muszą być ustawiane indywidualnie dla każdego procesu skojarzonego z obiektem zadania. Aby uzyskać więcej informacji, zobacz Process Security and Access Rights.

windows XP z dodatkiem SP3 i windows Server 2003: Funkcja setInformationJobObjectmoże służyć do ustawiania ograniczeń zabezpieczeń dla wszystkich procesów skojarzonych z obiektem zadania. Począwszy od systemu Windows Vista, limity zabezpieczeń muszą być ustawiane indywidualnie dla każdego procesu skojarzonego z obiektem zadania.

Jeśli zadanie jest zagnieżdżone, zadania nadrzędne w hierarchii wpływają na limit wymuszany dla zadania. Aby uzyskać więcej informacji, zobacz zagnieżdżone zadania.

Jeśli zadanie ma skojarzony port ukończenia we/wy, może otrzymywać powiadomienia o przekroczeniu określonych limitów zadań. System wysyła komunikaty do portu ukończenia po przekroczeniu limitu lub wystąpieniu niektórych innych zdarzeń. Aby skojarzyć port ukończenia z zadaniem, użyj funkcji SetInformationJobObject z klasą informacji o obiekcie zadania JobObjectAssociateCompletionPortInformation i wskaźnikiem do struktury JOBOBJECT_ASSOCIATE_COMPLETION_PORT. Najlepiej jest to zrobić, gdy zadanie jest nieaktywne, aby zmniejszyć prawdopodobieństwo braku powiadomień dla procesów, których stany zmieniają się podczas skojarzenia portu ukończenia.

Wszystkie komunikaty są wysyłane bezpośrednio z zadania tak, jakby zadanie wywołało funkcję PostQueuedCompletionStatus. Wątek musi monitorować port ukończenia przy użyciu funkcji GetQueuedCompletionStatus w celu pobrania komunikatów. Należy pamiętać, że z wyjątkiem limitów ustawionych z JobObjectNotificationLimitInformation klasy informacji dostarczanie komunikatów do portu ukończenia nie jest gwarantowane; błąd odebrania komunikatu nie musi oznaczać, że zdarzenie nie wystąpiło. Powiadomienia dotyczące limitów ustawionych przy użyciu JobObjectNotificationLimitInformation mają gwarancję dotarcia do portu ukończenia. Aby uzyskać listę możliwych komunikatów, zobacz JOBOBJECT_ASSOCIATE_COMPLETION_PORT.

Ewidencjonowanie zasobów dla zadań

Obiekt zadania rejestruje podstawowe informacje o ewidencjonowaniu aktywności dla wszystkich skojarzonych z nim procesów, w tym tych, które zostały zakończone. Aby pobrać te informacje księgowe, użyj funkcji QueryInformationJobObject. Aby uzyskać listę informacji księgowych obsługiwanych dla zadania, zobacz następujące tematy:

Jeśli obiekt zadania jest zagnieżdżony, informacje o ewidencjonowaniu dla każdego zadania podrzędnego są agregowane w zadaniu nadrzędnym. Aby uzyskać więcej informacji, zobacz zagnieżdżone zadania.

Zarządzanie obiektami zadań

Stan obiektu zadania jest ustawiony na sygnał, gdy wszystkie jego procesy zostaną zakończone, ponieważ przekroczono określony limit czasu zakończenia zadania. Użyj WaitForSingleObject lub WaitForSingleObjectEx, aby monitorować obiekt zadania dla tego zdarzenia.

Aby uzyskać uchwyt dla istniejącego obiektu zadania, użyj funkcji OpenJobObject i określ nazwę nadaną obiektowi podczas jego utworzenia. Można otwierać tylko nazwane obiekty zadań.

Aby zamknąć dojście obiektu zadania, użyj funkcji CloseHandle. Zadanie jest niszczone po zamknięciu ostatniego dojścia, a wszystkie skojarzone procesy zostały zakończone. Jeśli jednak zadanie ma określoną flagę JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE, zamknięcie ostatniego uchwytu obiektu zadania kończy wszystkie skojarzone procesy, a następnie niszczy sam obiekt zadania. Jeśli zagnieżdżone zadanie ma określoną flagę JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE, zamknięcie ostatniego dojścia obiektu zadania kończy wszystkie procesy skojarzone z zadaniem i jego podrzędnymi zadaniami w hierarchii.

Zarządzanie drzewem procesów używającym obiektów zadań

Począwszy od systemów Windows 8 i Windows Server 2012, aplikacja może używać zagnieżdżonych zadań do zarządzania drzewem procesów używającym więcej niż jednego obiektu zadania. Jednak aplikacja, która musi działać w systemie Windows 7, Windows Server 2008 R2 lub starszych wersjach systemu Windows, które nie obsługują zagnieżdżonych zadań, muszą zarządzać drzewem procesów na inne sposoby.

Jeśli narzędzie musi zarządzać drzewem procesów używającym obiektów zadań i nie jest możliwe użycie zagnieżdżonych zadań, zarówno narzędzie, jak i elementy członkowskie drzewa procesów muszą współpracować. Użyj jednej z następujących opcji:

  • Użyj limitu JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK. Jeśli narzędzie używa tego limitu, nie może monitorować całego drzewa procesów. Narzędzie może monitorować tylko procesy, które dodaje do zadania. Jeśli te procesy tworzą procesy podrzędne, nie są one skojarzone z zadaniem. W tej opcji procesy podrzędne mogą być skojarzone z innymi obiektami zadań.

  • Użyj limitu JOB_OBJECT_LIMIT_BREAKAWAY_OK. Jeśli narzędzie używa tego limitu, może monitorować całe drzewo procesów, z wyjątkiem tych procesów, które każdy element członkowski drzewa jawnie odłamuje od drzewa. Element członkowski drzewa może utworzyć proces podrzędny w nowym obiekcie zadania, wywołując funkcję CreateProcess z flagą CREATE_BREAKAWAY_FROM_JOB, a następnie wywołując funkcję AssignProcessToJobObject. W przeciwnym razie członek musi obsługiwać przypadki, w których AssignProcessToJobObject kończy się niepowodzeniem.

    Flaga CREATE_BREAKAWAY_FROM_JOB nie ma wpływu, jeśli drzewo nie jest monitorowane przez narzędzie. W związku z tym jest to preferowana opcja, ale wymaga wcześniejszej wiedzy na temat monitorowanych procesów.

  • Zapobiegaj przerwom w jakimkolwiek rodzaju, ustawiając ani JOB_OBJECT_LIMIT_BREAKAWAY_OK, ani limit JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK. W tej opcji narzędzie może monitorować całe drzewo procesów. Jeśli jednak proces podrzędny próbuje skojarzyć się lub inny proces podrzędny z zadaniem, wywołując AssignProcessToJobObject, wywołanie zakończy się niepowodzeniem. Jeśli proces został zaprojektowany tak, aby był skojarzony z określonym zadaniem, ten błąd może uniemożliwić prawidłowe działanie procesu.