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


Вложенные задания

Приложение может использовать вложенные задания для управления подмножествами процессов. Вложенные задания также позволяют приложению, использующему задания для размещения других приложений, которые также используют задания.

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

В этом разделе представлен обзор вложения заданий и поведения вложенных заданий:

Общие сведения о заданиях и объектах заданий см. в объектов заданий.

Иерархии вложенных заданий

Вложенные задания имеют отношение "родительский-дочерний", в котором каждое дочернее задание содержит подмножество процессов в родительском задании. Если процесс, который уже находится в задании, добавляется в другое задание, задания вложены по умолчанию, если система может сформировать допустимую иерархию заданий и ни один из наборов пользовательских элементов (SetInformationJobObject с JobObjectBasicUIRestrictions).

На рисунке 1 показана иерархия заданий, содержащая дерево процессов, помеченных P0 до P7. Задание 1 — это родительского задания задания 2 и задания 4, и это предок задания 3. Задание 2 — это непосредственного родительского задания 3; Задание 3 — это непосредственного ребенка задания 2. Задания 1, 2 и 3 образуют цепочку заданий , в которой задания 1 и 2 являются родительской цепочкой заданий задания 3. Конечное задание в цепочке заданий — это немедленное процессов в этом задании. На рис. 1 задание 3 — это немедленное задание процессов P2, P3 и P4.

рис. 1. вложенная иерархия заданий, содержащая дерево процессов

Вложенные задания также можно использовать для управления группами одноранговых процессов. В иерархии заданий, показанной на рис. 2, задание 1 является родительским заданием задания 2. Обратите внимание, что иерархия заданий может содержать только часть дерева процессов. На рис. 2 P0 не находится в иерархии, но его дочерние процессы P1–P5.

рис. 2. вложенная иерархия заданий, содержащая одноранговые процессы

Создание вложенной иерархии заданий

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

Чтобы создать иерархию заданий с помощью явной связи, необходимо создать все объекты заданий с помощью CreateJobObject, а затем AssignProcessToJobObject необходимо вызывать несколько раз для каждого процесса, чтобы связать процесс с каждым заданием, к которому он должен принадлежать. Чтобы убедиться, что иерархия заданий действительна, сначала назначьте все процессы заданию в корне иерархии, а затем назначьте подмножество процессов непосредственному дочернему объекту задания и т. д. Если процессы назначаются заданиям в этом порядке, дочернее задание всегда будет иметь подмножество процессов в родительском задании во время создания иерархии, которая требуется для вложения. Если процессы назначаются заданиям в случайном порядке, в какой-то момент дочернее задание будет иметь процессы, которые не находятся в родительском задании. Это не допускается путем вложения, и это приведет к сбою AssignProcessToJobObject.

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

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

Для определенных ограничений ресурсов ограничение для заданий в родительской цепочке заданий определяет действующее ограничение, которое применяется для дочернего задания. Эффективное ограничение для дочернего задания может быть более строгим, чем ограничение родительского, но оно не может быть менее строгим. Например, если класс приоритета дочернего задания ABOVE_NORMAL_PRIORITY_CLASS, а класс приоритета его родительского задания NORMAL_PRIORITY_CLASS, то эффективное ограничение для процессов в дочернем задании NORMAL_PRIORITY_CLASS. Однако если класс приоритета дочернего задания BELOW_NORMAL_PRIORITY_CLASS, то эффективное ограничение для процессов в дочернем задании BELOW_NORMAL_PRIORITY_CLASS. Действующие ограничения применяются для класса приоритета, сходства, фиксации, ограничения времени выполнения для каждого процесса, ограничения класса планирования и минимального и максимального рабочего набора. Дополнительные сведения о конкретных ограничениях ресурсов см. в разделе SetInformationJobObject.

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

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

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

Завершение вложенных заданий

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

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