Trabalhos aninhados
Um aplicativo pode usar trabalhos aninhados para gerenciar subconjuntos de processos. 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 único trabalho. Trabalhos aninhados foram introduzidos em Windows 8 e Windows Server 2012.
Este tópico fornece uma visão geral do aninhamento de trabalho e do comportamento de trabalhos aninhados:
- Hierarquias de trabalho aninhadas
- Criando uma hierarquia de trabalho aninhada
- Limites de trabalho e notificações para trabalhos aninhados
- Contabilização de recursos para trabalhos aninhados
- Encerramento de trabalhos aninhados
Para obter informações gerais sobre trabalhos e objetos de trabalho, consulte Objetos de trabalho.
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 trabalho que contém uma árvore de processos rotuladas como P0 a P7. O Trabalho 1 é o trabalho pai do Trabalho 2 e do Trabalho 4 e é um ancestral do Trabalho 3. O trabalho 2 é o pai imediato do Trabalho 3; O trabalho 3 é o filho imediato do Trabalho 2. Os trabalhos 1, 2 e 3 formam uma cadeia de trabalhos na qual os Trabalhos 1 e 2 são a cadeia de trabalho pai do Trabalho 3. O trabalho final em uma cadeia de trabalho é o trabalho imediato dos processos nesse trabalho. Na Figura 1, o Trabalho 3 é o trabalho imediato dos processos P2, P3 e P4.
Trabalhos aninhados também podem ser usados para gerenciar grupos de processos pares. Na hierarquia de trabalho mostrada na Figura 2, o Trabalho 1 é o trabalho pai do Trabalho 2. Observe que uma hierarquia de trabalho pode conter apenas parte de uma árvore de processo. Na Figura 2, p0 não está na hierarquia, mas seus processos filho P1 a P5 são.
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ção AssignProcessToJobObject ou implicitamente associados durante a criação do processo, o mesmo que para trabalhos autônomos. A ordem na qual 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 deve ser chamado várias vezes para cada processo 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 estiver 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 separará do objeto de trabalho imediato e de cada trabalho na cadeia de trabalho pai, subindo a hierarquia até atingir um trabalho que não permita a fuga. Se o objeto de trabalho imediato não permitir a separação, o processo filho não será interrompido 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 imposto para um trabalho filho. O limite efetivo para o trabalho filho pode ser mais restritivo do que o limite de seu pai, mas não pode ser menos restritivo. Por exemplo, se a classe de prioridade de um trabalho filho for ABOVE_NORMAL_PRIORITY_CLASS e a classe de prioridade de seu trabalho pai for NORMAL_PRIORITY_CLASS, o limite efetivo para processos no trabalho filho será NORMAL_PRIORITY_CLASS. No entanto, se a classe de prioridade do trabalho filho for BELOW_NORMAL_PRIORITY_CLASS, o limite efetivo para processos no trabalho filho será BELOW_NORMAL_PRIORITY_CLASS. Limites efetivos são impostos para classe de prioridade, afinidade, encargo de confirmação, limite de tempo de execução por processo, limite de classe de agendamento e mínimo e máximo do conjunto de trabalho. 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 determinados 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 mensagens disparadas para serem 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 contabilidade de recursos para um trabalho aninhado descrevem o uso de cada processo associado 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 filho abaixo dele na cadeia de trabalhos.
Encerramento de trabalhos aninhados
Quando um trabalho em uma hierarquia de trabalho é encerrado, o sistema encerra processos nesse trabalho e todos os seus trabalhos filho, começando com o trabalho filho na parte inferior da hierarquia. Os recursos pendentes usados por cada processo encerrado são cobrados para o trabalho pai.
O identificador de trabalho deve ter o direito de acesso JOB_OBJECT_TERMINATE, o mesmo que para trabalhos autônomos.