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

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

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

Чтобы создать объект задания, используйте функцию 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 для получения сообщений. Обратите внимание, что, за исключением ограничений, установленных в информационном классе JobObjectNotificationLimitInformation , доставка сообщений в порт завершения не гарантируется. Сбой поступления сообщения не обязательно означает, что событие не произошло. Уведомления об ограничениях, установленных с помощью 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. Если средство использует это ограничение, оно может отслеживать все дерево процессов, за исключением тех процессов, которые любой член дерева явно отрывается от дерева. Член дерева может создать дочерний процесс в новом объекте задания, вызвав функцию CreateProcess с флагом CREATE_BREAKAWAY_FROM_JOB, а затем вызвав функцию AssignProcessToJobObject . В противном случае член должен обрабатывать случаи, в которых AssignProcessToJobObject завершается сбоем .

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

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