Objets de travail

Un objet de travail permet de gérer des groupes de processus en tant qu’unité. Les objets de travail sont des objets namables, sécurisables et partageables qui contrôlent les attributs des processus qui leur sont associés. Les opérations effectuées sur un objet de traitement affectent tous les processus associés à cet objet. Les exemples incluent l’application de limites telles que la taille et la priorité de processus des groupes de travail ou la fin de tous les processus associés à un travail.

Création de travaux

Pour créer un objet de travail, utilisez la fonction CreateJobObject . Lorsque le travail est créé, aucun processus n’est associé au travail.

Pour associer un processus à un travail, utilisez la fonction AssignProcessToJobObject . Une fois qu’un processus est associé à un travail, l’association ne peut pas être rompue. Un processus peut être associé à plusieurs travaux dans une hiérarchie de travaux imbriqués. Pour plus d’informations, consultez Travaux imbriqués.

Windows 7, Windows Server 2008 R2, Windows XP avec SP3, Windows Server 2008, Windows Vista et Windows Server 2003 : Un processus ne peut être associé qu’à un seul travail. Les travaux ne peuvent pas être imbriqués. La possibilité d’imbriquer des travaux a été ajoutée dans Windows 8 et Windows Server 2012.

Vous pouvez spécifier un descripteur de sécurité pour un objet de travail lorsque vous appelez la fonction CreateJobObject . Pour plus d’informations, consultez Sécurité et droits d’accès aux objets de travail.

Gestion des processus dans les travaux

Une fois qu’un processus est associé à un travail, par défaut, tous les processus enfants qu’il crée à l’aide de CreateProcess sont également associés au travail. (Les processus enfants créés à l’aide de Win32_Process.Create ne sont pas associés au travail.) Ce comportement par défaut peut être modifié en définissant la limite étendue JOB_OBJECT_LIMIT_BREAKAWAY_OK ou JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK pour le travail.

  • Si le travail a la limite étendue JOB_OBJECT_LIMIT_BREAKAWAY_OK et que le processus parent a été créé avec l’indicateur CREATE_BREAKAWAY_FROM_JOB, les processus enfants du processus parent ne sont pas associés au travail.
  • Si le travail a la limite étendue JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK, les processus enfants d’un processus parent associé au travail ne sont pas associés au travail. Il n’est pas nécessaire que les processus parents soient créés avec l’indicateur CREATE_BREAKAWAY_FROM_JOB.

Si le travail est imbriqué, les paramètres d’interruption des travaux parents dans la hiérarchie déterminent si les processus enfants sont associés à un autre travail dans la hiérarchie. Pour plus d’informations, consultez Travaux imbriqués.

Pour déterminer si un processus s’exécute dans un travail, utilisez la fonction IsProcessInJob .

Pour arrêter tous les processus actuellement associés à un objet de travail, utilisez la fonction TerminateJobObject .

Limites et notifications du travail

Un travail peut appliquer des limites telles que la taille de l’ensemble de travail, la priorité du processus et la limite de temps de fin de travail à chaque processus associé au travail. Si un processus associé à un travail tente d’augmenter la taille de son jeu de travail ou sa priorité de processus à partir de la limite établie par le travail, les appels de fonction réussissent, mais sont ignorés en mode silencieux. Un travail peut également définir des limites qui déclenchent une notification lorsqu’elles sont dépassées, mais qui permettent au travail de continuer à s’exécuter.

Pour définir des limites pour un travail, utilisez la fonction SetInformationJobObject . Pour obtenir la liste des limites possibles qui peuvent être définies pour un travail, consultez les rubriques suivantes :

Les limites de sécurité doivent être définies individuellement pour chaque processus associé à un objet de travail. Pour plus d’informations, consultez Traiter les droits de sécurité et d’accès.

Windows XP avec SP3 et Windows Server 2003 : La fonction SetInformationJobObject peut être utilisée pour définir des limitations de sécurité pour tous les processus associés à un objet de travail. À compter de Windows Vista, les limites de sécurité doivent être définies individuellement pour chaque processus associé à un objet de travail.

Si le travail est imbriqué, les travaux parents de la hiérarchie influencent la limite appliquée pour le travail. Pour plus d’informations, consultez Travaux imbriqués.

Si le travail a un port d’achèvement d’E/S associé, il peut recevoir des notifications lorsque certaines limites de travail sont dépassées. Le système envoie des messages au port d’achèvement lorsqu’une limite est dépassée ou que d’autres événements se produisent. Pour associer un port d’achèvement à un travail, utilisez la fonction SetInformationJobObject avec la classe d’informations d’objet jobObjectAssociateCompletionPortInformation et un pointeur vers une structure JOBOBJECT_ASSOCIATE_COMPLETION_PORT . Il est préférable de le faire lorsque le travail est inactif, afin de réduire le risque de notifications manquantes pour les processus dont les états changent pendant l’association du port d’achèvement.

Tous les messages sont envoyés directement à partir du travail comme si le travail avait appelé la fonction PostQueuedCompletionStatus . Un thread doit surveiller le port d’achèvement à l’aide de la fonction GetQueuedCompletionStatus pour récupérer les messages. Notez que, à l’exception des limites définies avec la classe d’informations JobObjectNotificationLimitInformation , la remise des messages au port d’achèvement n’est pas garantie ; l’échec de l’arrivée d’un message ne signifie pas nécessairement que l’événement ne s’est pas produit. Les notifications pour les limites définies avec JobObjectNotificationLimitInformation sont garanties pour arriver au port d’achèvement. Pour obtenir la liste des messages possibles, consultez JOBOBJECT_ASSOCIATE_COMPLETION_PORT.

Comptabilité des ressources pour les travaux

L’objet de travail enregistre les informations comptables de base pour tous ses processus associés, y compris ceux qui se sont terminés. Pour récupérer ces informations comptables, utilisez la fonction QueryInformationJobObject . Pour obtenir la liste des informations comptables conservées pour un travail, consultez les rubriques suivantes :

Si l’objet de travail est imbriqué, les informations de comptabilité de chaque travail enfant sont agrégées dans son travail parent. Pour plus d’informations, consultez Travaux imbriqués.

Gestion des objets de travail

L’état d’un objet de travail est défini sur signalé lorsque tous ses processus sont arrêtés, car la limite de fin de travail spécifiée a été dépassée. Utilisez WaitForSingleObject ou WaitForSingleObjectEx pour surveiller l’objet de travail de cet événement.

Pour obtenir un handle pour un objet de travail existant, utilisez la fonction OpenJobObject et spécifiez le nom donné à l’objet lors de sa création. Seuls les objets de travail nommés peuvent être ouverts.

Pour fermer un handle d’objet de travail, utilisez la fonction CloseHandle . Le travail est détruit lorsque son dernier handle a été fermé et que tous les processus associés ont été arrêtés. Toutefois, si le travail a l’indicateur JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE spécifié, la fermeture du dernier handle d’objet de travail met fin à tous les processus associés, puis détruit l’objet de travail lui-même. Si un travail imbriqué a l’indicateur JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE spécifié, la fermeture du dernier handle d’objet de travail met fin à tous les processus associés au travail et à ses travaux enfants dans la hiérarchie.

Gestion d’une arborescence de processus qui utilise des objets de travail

À compter de Windows 8 et Windows Server 2012, une application peut utiliser des travaux imbriqués pour gérer une arborescence de processus qui utilise plusieurs objets de travail. Toutefois, une application qui doit s’exécuter sur Windows 7, Windows Server 2008 R2 ou des versions antérieures de Windows qui ne prennent pas en charge les travaux imbriqués doit gérer l’arborescence de processus d’autres manières.

Si un outil doit gérer une arborescence de processus qui utilise des objets de travail et qu’il n’est pas possible d’utiliser des travaux imbriqués, l’outil et les membres de l’arborescence de processus doivent coopérer. Utilisez l’une des options suivantes :

  • Utilisez la limite de JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK. Si l’outil utilise cette limite, il ne peut pas surveiller une arborescence de processus entière. L’outil peut surveiller uniquement les processus qu’il ajoute au travail. Si ces processus créent des processus enfants, ils ne sont pas associés au travail. Dans cette option, les processus enfants peuvent être associés à d’autres objets de travail.

  • Utilisez la limite de JOB_OBJECT_LIMIT_BREAKAWAY_OK. Si l’outil utilise cette limite, il peut surveiller l’ensemble de l’arborescence de processus, à l’exception des processus dont n’importe quel membre de l’arborescence s’écarte explicitement de l’arborescence. Un membre de l’arborescence peut créer un processus enfant dans un nouvel objet de travail en appelant la fonction CreateProcess avec l’indicateur CREATE_BREAKAWAY_FROM_JOB, puis en appelant la fonction AssignProcessToJobObject . Sinon, le membre doit gérer les cas où AssignProcessToJobObject échoue.

    L’indicateur CREATE_BREAKAWAY_FROM_JOB n’a aucun effet si l’arborescence n’est pas surveillée par l’outil. Il s’agit donc de l’option privilégiée, mais elle nécessite une connaissance préalable des processus surveillés.

  • Empêchez les interruptions de quelque nature que ce soit en définissant ni le JOB_OBJECT_LIMIT_BREAKAWAY_OK ni la limite de JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK. Dans cette option, l’outil peut surveiller l’arborescence de processus entière. Toutefois, si un processus enfant tente de s’associer lui-même ou un autre processus enfant à un travail en appelant AssignProcessToJobObject, l’appel échoue. Si le processus a été conçu pour être associé à un travail spécifique, cette défaillance peut empêcher le processus de fonctionner correctement.