Partilhar via


Objetos de trabalho

Um objeto de trabalho permite que grupos de processos sejam gerenciados como uma unidade. Os objetos de trabalho são objetos nomeáveis, protegíveis e compartilháveis que controlam atributos dos processos associados a eles. As operações executadas em um objeto de trabalho afetam todos os processos associados ao objeto de trabalho. Os exemplos incluem a imposição de limites, como o tamanho do conjunto de trabalho e a prioridade do processo, ou o encerramento de todos os processos associados a um trabalho.

Criação de Emprego

Para criar um objeto de trabalho, use a funçãoCreateJobObject. Quando o trabalho é criado, nenhum processo é associado ao trabalho.

Para associar um processo a um trabalho, use a funçãoAssignProcessToJobObject. Depois que um processo é associado a um trabalho, a associação não pode ser quebrada. Um processo pode ser associado a mais de um trabalho em uma hierarquia de trabalhos aninhados. Para obter mais informações, consulte Trabalhos aninhados.

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 não podem ser aninhados. A capacidade de aninhar trabalhos foi adicionada no Windows 8 e no Windows Server 2012.

Você pode especificar um descritor de segurança para um objeto de trabalho ao chamar a funçãoCreateJobObject. Para obter mais informações, consulte Job Object Security and Access Rights.

Gerenciando processos em trabalhos

Depois que um processo é associado a um trabalho, por padrão, todos os processos filho criados usando CreateProcess também são associados ao trabalho. (Os processos filho criados usando Win32_Process.Create não estão associados ao trabalho.) Esse comportamento padrão pode ser alterado definindo o limite estendido JOB_OBJECT_LIMIT_BREAKAWAY_OK ou JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK para o trabalho.

  • Se o trabalho tiver o limite estendido JOB_OBJECT_LIMIT_BREAKAWAY_OK e o processo pai tiver sido criado com o sinalizador CREATE_BREAKAWAY_FROM_JOB, os processos filho do processo pai não serão associados ao trabalho.
  • Se o trabalho tiver o limite estendido JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK, os processos filho de qualquer processo pai associado ao trabalho não serão associados ao trabalho. Não é necessário que os processos pai sejam criados com o sinalizador CREATE_BREAKAWAY_FROM_JOB.

Se o trabalho estiver aninhado, as configurações separatistas dos trabalhos pai na hierarquia afetarão se os processos filho estão associados a outro trabalho na hierarquia. Para obter mais informações, consulte Trabalhos aninhados.

Para determinar se um processo está sendo executado em um trabalho, use a funçãoIsProcessInJob.

Para encerrar todos os processos atualmente associados a um objeto de trabalho, use a funçãoTerminateJobObject.

Limites de trabalho e notificações

Um trabalho pode impor limites como tamanho do conjunto de trabalho, prioridade do processo e limite de tempo de fim de trabalho em cada processo associado ao trabalho. Se um processo associado a um trabalho tentar aumentar o tamanho do conjunto de trabalho ou a prioridade do processo a partir do limite estabelecido pelo trabalho, as chamadas de função serão bem-sucedidas, mas serão ignoradas silenciosamente. Um trabalho também pode definir limites que acionam uma notificação quando eles são excedidos, mas permitem que o trabalho continue a ser executado.

Para definir limites para um trabalho, use a funçãoSetInformationJobObject. Para obter uma lista de limites possíveis que podem ser definidos para um trabalho, consulte os seguintes tópicos:

Os limites de segurança devem ser definidos individualmente para cada processo associado a um objeto de trabalho. Para obter mais informações, consulte de Segurança de Processos e Direitos de Acesso .

Windows XP com SP3 e Windows Server 2003: A funçãoSetInformationJobObjectpode ser usada para definir limitações de segurança para todos os processos associados a um objeto de trabalho. A partir do Windows Vista, os limites de segurança devem ser definidos individualmente para cada processo associado a um objeto de trabalho.

Se o trabalho estiver aninhado, os trabalhos pai na hierarquia influenciarão o limite imposto para o trabalho. Para obter mais informações, consulte Trabalhos aninhados.

Se o trabalho tiver uma porta de conclusão de E/S associada, ele poderá receber notificações quando determinados limites de trabalho forem excedidos. O sistema envia mensagens para a porta de conclusão quando um limite é excedido ou determinados outros eventos ocorrem. Para associar uma porta de conclusão a um trabalho, use a função deSetInformationJobObjectcom a classe de informações do objeto de trabalho JobObjectAssociateCompletionPortInformation e um ponteiro para uma estrutura JOBOBJECT_ASSOCIATE_COMPLETION_PORT. É melhor fazer isso quando o trabalho está inativo, para reduzir a chance de notificações ausentes para processos cujos estados mudam durante a associação da porta de conclusão.

Todas as mensagens são enviadas diretamente do trabalho como se o trabalho tivesse chamado a funçãoPostQueuedCompletionStatus. Um thread deve monitorar a porta de conclusão usando a funçãoGetQueuedCompletionStatuspara pegar as mensagens. Observe que, com exceção dos limites definidos com o JobObjectNotificationLimitInformation classe de informações, a entrega de mensagens para a porta de conclusão não é garantida; A falha na chegada de uma mensagem não significa necessariamente que o evento não ocorreu. As notificações para limites definidos com JobObjectNotificationLimitInformation têm a garantia de chegar à porta de conclusão. Para obter uma lista de mensagens possíveis, consulte JOBOBJECT_ASSOCIATE_COMPLETION_PORT.

Contabilização de recursos para trabalhos

O objeto de trabalho registra informações básicas de contabilidade para todos os seus processos associados, incluindo aqueles que foram encerrados. Para recuperar essas informações de contabilidade, use a função QueryInformationJobObject. Para obter uma lista das informações contábeis mantidas para um trabalho, consulte os seguintes tópicos:

Se o objeto de trabalho estiver aninhado, as informações de contabilidade de cada trabalho filho serão agregadas em seu trabalho pai. Para obter mais informações, consulte Trabalhos aninhados.

Gerenciando objetos de trabalho

O estado de um objeto de trabalho é definido como sinalizado quando todos os seus processos são encerrados porque o limite de tempo de fim de trabalho especificado foi excedido. Use WaitForSingleObject ou WaitForSingleObjectEx para monitorar o objeto de trabalho para esse evento.

Para obter um identificador para um objeto de trabalho existente, use o função OpenJobObject e especifique o nome dado ao objeto quando ele foi criado. Somente objetos de trabalho nomeados podem ser abertos.

Para fechar um identificador de objeto de trabalho, use a função CloseHandle. O trabalho é destruído quando seu último identificador foi fechado e todos os processos associados foram encerrados. No entanto, se o trabalho tiver o sinalizador de JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE especificado, fechar o último identificador de objeto de trabalho encerrará todos os processos associados e, em seguida, destruirá o próprio objeto de trabalho. Se um trabalho aninhado tiver o sinalizador JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE especificado, fechar o identificador do último objeto de trabalho encerrará todos os processos associados ao trabalho e seus trabalhos filhos na hierarquia.

Gerenciando uma árvore de processo que usa objetos de trabalho

A partir do Windows 8 e do Windows Server 2012, um aplicativo pode usar de trabalhos aninhados para gerenciar uma árvore de processos que usa mais de um objeto de trabalho. No entanto, um aplicativo que deve ser executado no Windows 7, Windows Server 2008 R2 ou versões anteriores do Windows que não oferecem suporte a trabalhos aninhados deve gerenciar a árvore de processo de outras maneiras.

Se uma ferramenta deve gerenciar uma árvore de processo que usa objetos de trabalho e não é possível usar trabalhos aninhados, tanto a ferramenta quanto os membros da árvore de processo devem cooperar. Use uma das seguintes opções:

  • Use o limite de JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK. Se a ferramenta usar esse limite, ela não poderá monitorar uma árvore de processo inteira. A ferramenta pode monitorar apenas os processos que adiciona ao trabalho. Se esses processos criarem processos filho, eles não serão associados ao trabalho. Nesta opção, os processos filho podem ser associados a outros objetos de trabalho.

  • Use o limite de JOB_OBJECT_LIMIT_BREAKAWAY_OK. Se a ferramenta usar esse limite, ela poderá monitorar toda a árvore de processos, exceto aqueles processos em que qualquer membro da árvore se separa explicitamente da árvore. Um membro da árvore pode criar um processo filho em um novo objeto de trabalho chamando a funçãoCreateProcess com o sinalizador CREATE_BREAKAWAY_FROM_JOB e, em seguida, chamando a funçãoAssignProcessToJobObject. Caso contrário, o membro deve lidar com casos em que AssignProcessToJobObject falha.

    O sinalizador CREATE_BREAKAWAY_FROM_JOB não terá efeito se a árvore não estiver sendo monitorada pela ferramenta. Portanto, esta é a opção preferida, mas requer conhecimento prévio dos processos que estão sendo monitorados.

  • Evite fugas de qualquer tipo, não estabelecendo nem o JOB_OBJECT_LIMIT_BREAKAWAY_OK nem o limite JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK. Nesta opção, a ferramenta pode monitorar toda a árvore de processos. No entanto, se um processo filho tentar se associar ou outro processo filho a um trabalho chamando AssignProcessToJobObject, a chamada falhará. Se o processo foi projetado para ser associado a um trabalho específico, essa falha pode impedir que o processo funcione corretamente.