Поделиться через


Объекты задания

Объект задания позволяет управлять группами процессов как единицей. Объекты задания — это именуемые, защищаемые, совместно используемые объекты, управляющие атрибутами процессов, связанных с ними. Операции, выполняемые в объекте задания, влияют на все процессы, связанные с объектом задания. Примеры включают применение таких ограничений, как размер рабочего набора и приоритет процесса или завершение всех процессов, связанных с заданием.

Создание заданий

Чтобы создать объект задания, используйте функцию CreateJobObject. При создании задания процессы не связаны с заданием.

Чтобы связать процесс с заданием, используйте функцию AssignProcessToJobObject. После того как процесс связан с заданием, связь не может быть нарушена. Процесс может быть связан с несколькими заданиями в иерархии вложенных заданий. Дополнительные сведения см. в вложенных заданий.

Windows 7, Windows Server 2008 R2, Windows XP с пакетом обновления 3 (SP3), Windows Server 2008, Windows Vista и Windows Server 2003: Процесс может быть связан только с одним заданием. Не удается вложить задания. Возможность вложения заданий добавлена в Windows 8 и Windows Server 2012.

Вы можете указать дескриптор безопасности для объекта задания при вызове функции CreateJobObject. Дополнительные сведения см. в безопасности объектов задания и прав доступа.

Управление процессами в заданиях

После того как процесс связан с заданием, по умолчанию все дочерние процессы, создаваемые с помощью CreateProcess, также связаны с заданием. (Дочерние процессы, созданные с помощью Win32_Process.Create, не связаны с заданием.) Это поведение по умолчанию можно изменить, задав расширенный предел JOB_OBJECT_LIMIT_BREAKAWAY_OK или JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK для задания.

  • Если задание имеет расширенный предел JOB_OBJECT_LIMIT_BREAKAWAY_OK и родительский процесс был создан с флагом CREATE_BREAKAWAY_FROM_JOB, дочерние процессы родительского процесса не связаны с заданием.
  • Если задание имеет расширенный предел JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK, дочерние процессы любого родительского процесса, связанного с заданием, не связаны с заданием. Для создания родительских процессов с помощью флага CREATE_BREAKAWAY_FROM_JOB не требуется.

Если задание вложено, параметры разбиения родительских заданий в иерархии влияют на то, связаны ли дочерние процессы с другим заданием в иерархии. Дополнительные сведения см. в вложенных заданий.

Чтобы определить, выполняется ли процесс в задании, используйте функцию IsProcessInJob.

Чтобы завершить все процессы, связанные с объектом задания, используйте функцию TerminateJobObject.

Ограничения заданий и уведомления

Задание может применять такие ограничения, как размер рабочего набора, приоритет процесса и ограничение времени окончания задания для каждого процесса, связанного с заданием. Если процесс, связанный с заданием, пытается увеличить его размер рабочего набора или приоритет процесса из предела, установленного заданием, вызовы функции выполняются успешно, но игнорируются автоматически. Задание также может задать ограничения, которые активируют уведомление при превышении, но позволяют заданию продолжать выполняться.

Чтобы задать ограничения для задания, используйте функцию SetInformationJobObject. Список возможных ограничений, которые можно задать для задания, см. в следующих разделах:

Ограничения безопасности должны быть заданы отдельно для каждого процесса, связанного с объектом задания. Дополнительные сведения см. в "Безопасность процессов и доступ".

Windows XP с пакетом обновления 3 (SP3) и Windows Server 2003: функция SetInformationJobObject может использоваться для установки ограничений безопасности для всех процессов, связанных с объектом задания. Начиная с Windows Vista ограничения безопасности должны быть установлены отдельно для каждого процесса, связанного с объектом задания.

Если задание вложено, родительские задания в иерархии влияют на ограничение, которое применяется для задания. Дополнительные сведения см. в вложенных заданий.

Если задание имеет связанный порт завершения ввода-вывода, он может получать уведомления при превышении определенных ограничений заданий. Система отправляет сообщения в порт завершения при превышении предела или некоторых других событиях. Чтобы связать порт завершения с заданием, используйте функцию setInformationJobObject с классом сведений об объекте задания JobObjectAssociateCompletionPortInformation и указатель на структуру JOBOBJECT_ASSOCIATE_COMPLETION_PORT. Это лучше всего сделать, если задание неактивно, чтобы уменьшить вероятность отсутствия уведомлений для процессов, состояния которых изменяются во время сопоставления порта завершения.

Все сообщения отправляются непосредственно из задания, как если бы задание вызывало функцию PostQueuedCompletionStatus. Поток должен отслеживать порт завершения с помощью функции GetQueuedCompletionStatus для сбора сообщений. Обратите внимание, что за исключением ограничений, установленных с класс ом сведений JobObjectNotificationLimit Information, доставка сообщений в порт завершения не гарантируется; Ошибка при поступлении сообщения не обязательно означает, что событие не произошло. Уведомления о ограничениях, заданных с помощью JobObjectNotificationLimitInformation, гарантированно прибывают в порт завершения. Список возможных сообщений см. в JOBOBJECT_ASSOCIATE_COMPLETION_PORT.

Учет ресурсов для заданий

Объект задания записывает основные сведения об учете всех связанных процессов, включая завершенные. Чтобы получить эти сведения об учете, используйте функцию QueryInformationJobObject. Список сведений об учете, которые хранятся для задания, см. в следующих разделах:

Если объект задания вложен, учетные данные для каждого дочернего задания агрегируются в родительском задании. Дополнительные сведения см. в вложенных заданий.

Управление объектами заданий

Состояние объекта задания устанавливается на сигнал, когда все его процессы завершаются, так как указанное ограничение времени окончания задания было превышено. Используйте WaitForSingleObject или WaitForSingleObjectEx для мониторинга объекта задания для этого события.

Чтобы получить дескриптор для существующего объекта задания, используйте функцию OpenJobObject и укажите имя, заданное объекту при его создании. Можно открыть только именованные объекты задания.

Чтобы закрыть дескриптор объекта задания, используйте функцию CloseHandle. Задание уничтожается при закрытии последнего дескриптора и завершения всех связанных процессов. Однако если задание имеет указанный флаг JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE, закрытие последнего дескриптора задания завершает все связанные процессы, а затем уничтожает сам объект задания. Если вложенное задание имеет указанный флаг JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE, закрытие последнего дескриптора задания завершает все процессы, связанные с заданием и его дочерними заданиями в иерархии.

Управление деревом процессов, использующими объекты заданий

Начиная с Windows 8 и Windows Server 2012, приложение может использовать вложенные задания для управления деревом процессов, использующим несколько объектов задания. Однако приложение, которое должно работать в Windows 7, Windows Server 2008 R2 или более ранних версиях Windows, которые не поддерживают вложенные задания, должны управлять деревом процессов другими способами.

Если средство должно управлять деревом процессов, использующими объекты заданий, и невозможно использовать вложенные задания, как средство, так и члены дерева процессов должны сотрудничать. Используйте один из следующих вариантов:

  • Используйте ограничение JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK. Если средство использует это ограничение, оно не может отслеживать весь дерево процессов. Средство может отслеживать только процессы, добавляемые в задание. Если эти процессы создают дочерние процессы, они не связаны с заданием. В этом параметре дочерние процессы могут быть связаны с другими объектами задания.

  • Используйте ограничение JOB_OBJECT_LIMIT_BREAKAWAY_OK. Если средство использует это ограничение, оно может отслеживать весь дерево процессов, за исключением тех процессов, которые любой член дерева явно оторваться от дерева. Член дерева может создать дочерний процесс в новом объекте задания, вызвав функцию CreateProcessCreateProcess с флагом CREATE_BREAKAWAY_FROM_JOB, а затем вызовите функцию AssignProcessToJobObject. В противном случае член должен обрабатывать случаи, в которых не удается AssignProcessToJobObject.

    Флаг CREATE_BREAKAWAY_FROM_JOB не влияет, если дерево не отслеживается средством. Поэтому это предпочтительный вариант, но для этого требуется заранеее знание отслеживаемых процессов.

  • Запретить разрывы любого вида, не устанавливая ни JOB_OBJECT_LIMIT_BREAKAWAY_OK, ни ограничение JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK. В этом параметре средство может отслеживать весь дерево процессов. Однако если дочерний процесс пытается связать себя или другой дочерний процесс с заданием, вызвав AssignProcessToJobObject, вызов завершится ошибкой. Если процесс был разработан для связи с определенным заданием, этот сбой может препятствовать правильной работе процесса.