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


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

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

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, как и для автономных заданий.