Partilhar via


Trabalhos aninhados

Um aplicativo pode usar trabalhos aninhados para gerenciar subconjuntos de processos. Os trabalhos aninhados também habilitam um aplicativo que usa trabalhos para hospedar outros aplicativos que também usam trabalhos.

Windows 7, Windows Server 2008 R2, Windows XP com SP3, Windows Server 2008, Windows Vista e Windows Server 2003: Um processo pode ser associado a apenas um trabalho. Os trabalhos aninhados foram introduzidos no Windows 8 e no Windows Server 2012.

Este tópico fornece uma visão geral do aninhamento de trabalhos e do comportamento de trabalhos aninhados:

Para obter informações gerais sobre trabalhos e objetos de trabalho, consulte Job Objects.

Hierarquias de trabalho aninhadas

Os trabalhos aninhados têm uma relação pai-filho na qual cada trabalho filho contém um subconjunto dos processos em seu trabalho pai. Se um processo que já está em um trabalho for adicionado a outro trabalho, os trabalhos serão aninhados por padrão se o sistema puder formar uma hierarquia de trabalho válida e nenhum trabalho definir limites de interface do usuário (SetInformationJobObject com JobObjectBasicUIRestrictions).

A Figura 1 mostra uma hierarquia de tarefas que contém uma árvore de processos rotulados de P0 a P7. O Emprego 1 é o de trabalho pai do Emprego 2 e do Emprego 4, e é um ancestral do Trabalho 3. O Emprego 2 é o parental imediato do Emprego 3; Jó 3 é o filho imediato de Jó 2. Os Empregos 1, 2 e 3 formam uma cadeia de trabalho na qual os Empregos 1 e 2 são a cadeia de trabalho pai do Trabalho 3. O trabalho final em uma cadeia de trabalho é o de trabalho imediato dos processos nesse trabalho. Na Figura 1, o trabalho 3 é o trabalho imediato dos processos P2, P3 e P4.

figura 1. Uma hierarquia de trabalho aninhada que contém uma árvore de processo

Os trabalhos aninhados também podem ser usados para gerenciar grupos de processos pares. Na hierarquia de tarefas mostrada na Figura 2, o Trabalho 1 é o trabalho pai do Trabalho 2. Observe que uma hierarquia de tarefas pode conter apenas parte de uma árvore de processos. Na Figura 2, P0 não está na hierarquia, mas seus processos filhos P1 a P5 estão.

figura 2. Uma hierarquia de trabalho aninhada que contém processos de mesmo nível

Criando uma hierarquia de trabalho aninhada

Os processos em uma hierarquia de trabalho são explicitamente associados a um objeto de trabalho usando a funçãoAssignProcessToJobObject ou implicitamente associados durante a criação do processo, o mesmo que para trabalhos autônomos. A ordem em que os trabalhos são criados e os processos são atribuídos determina se uma hierarquia pode ser criada.

Para criar uma hierarquia de trabalho usando associação explícita, todos os objetos de trabalho devem ser criados usando CreateJobObject e, em seguida, AssignProcessToJobObject devem ser chamados várias vezes para cada processo para associar o processo a cada trabalho ao qual ele deve pertencer. Para garantir que a hierarquia de trabalho seja válida, primeiro atribua todos os processos ao trabalho na raiz da hierarquia, depois atribua um subconjunto de processos ao objeto de trabalho filho imediato e assim por diante. Se os processos forem atribuídos a trabalhos nessa ordem, um trabalho filho sempre terá um subconjunto de processos em seu trabalho pai enquanto a hierarquia está sendo criada, o que é necessário para aninhamento. Se os processos forem atribuídos a trabalhos em ordem aleatória, em algum momento um trabalho filho terá processos que não estão em seu trabalho pai. Isso não é permitido pelo aninhamento e fará com que AssignProcessToJobObject falhe.

Quando os processos são implicitamente associados a um trabalho durante a criação do processo, um processo filho é associado a cada trabalho na cadeia de trabalho de seu processo pai. Se o objeto de trabalho imediato permitir a separação, o processo filho se separa do objeto de trabalho imediato e de cada trabalho na cadeia de trabalho pai, subindo na hierarquia até chegar a um trabalho que não permite a separação. Se o objeto de trabalho imediato não permitir a separação, o processo filho não se separará, mesmo que os trabalhos em sua cadeia de trabalho pai o permitam.

Limites de trabalho e notificações para trabalhos aninhados

Para determinados limites de recursos, o limite definido para trabalhos em uma cadeia de trabalho pai determina o limite efetivo que é imposto para um trabalho filho. O limite efetivo para o trabalho infantil pode ser mais restritivo do que o limite do progenitor, mas não pode ser menos restritivo. Por exemplo, se a classe de prioridade de um trabalho filho estiver ABOVE_NORMAL_PRIORITY_CLASS e a classe de prioridade do trabalho pai for NORMAL_PRIORITY_CLASS, o limite efetivo para processos no trabalho filho será NORMAL_PRIORITY_CLASS. No entanto, se a classe prioritária do trabalho infantil for BELOW_NORMAL_PRIORITY_CLASS, o limite efetivo para processos no trabalho infantil é BELOW_NORMAL_PRIORITY_CLASS. Os limites efetivos são impostos para classe de prioridade, afinidade, carga de confirmação, limite de tempo de execução por processo, limite de classe de agendamento e conjunto de trabalho mínimo e máximo. Para obter mais informações sobre limites de recursos específicos, consulte SetInformationJobObject.

Quando determinados eventos ocorrem, como criação de novo processo ou violação do limite de recursos, uma mensagem é enviada para a porta de conclusão de E/S associada a um trabalho. Um trabalho também pode se registrar para receber notificações quando certos limites são excedidos. Para um trabalho não aninhado, a mensagem é enviada para a porta de conclusão de E/S associada ao trabalho. Para um trabalho aninhado, a mensagem é enviada para cada porta de conclusão de E/S associada a qualquer trabalho na cadeia de trabalho pai do trabalho que disparou a mensagem. Um trabalho filho não precisa ter uma porta de conclusão de E/S associada para que as mensagens que ele dispara sejam enviadas para as portas de conclusão de E/S dos trabalhos pai mais altos na cadeia de trabalhos. Para obter mais informações sobre mensagens específicas, consulte JOBOBJECT_ASSOCIATE_COMPLETION_PORT.

Contabilização de recursos para trabalhos aninhados

As informações de contabilização de recursos para um trabalho aninhado descrevem o uso de todos os processos associados a esse trabalho, incluindo processos em trabalhos filho. Cada trabalho em uma cadeia de trabalho, portanto, representa os recursos agregados usados por seus próprios processos e os processos de cada trabalho infantil abaixo dele na cadeia de trabalho.

Término de trabalhos aninhados

Quando um trabalho em uma hierarquia de trabalho é encerrado, o sistema encerra os processos nesse trabalho e todos os seus trabalhos filhos, começando com o trabalho filho na parte inferior da hierarquia. Os recursos pendentes usados por cada processo encerrado são cobrados do trabalho pai.

O identificador de trabalho deve ter o direito de acesso JOB_OBJECT_TERMINATE, o mesmo que para trabalhos autônomos.