Objets de travail
Un objet de travail permet aux groupes de processus d’être gérés en tant qu’unité. Les objets de travail sont namables, sécurisables, partageables qui contrôlent les attributs des processus associés. Les opérations effectuées sur un objet de travail affectent tous les processus associés à l’objet de travail. Les exemples incluent l’application de limites telles que la taille du jeu de travail et la priorité du processus ou la fin de tous les processus associés à un travail.
- création de travaux
- gestion des processus dans les travaux
- limites et notifications des travaux
- comptabilité des ressources pour les travaux
- Gestion des objets de travail
- gestion d’une arborescence de processus qui utilise des objets de 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 interrompue. 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 : processus A 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é des objets de travail et droits d’accès.
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 de CREATE_BREAKAWAY_FROM_JOB.
Si le travail est imbriqué, les paramètres d’interruption des travaux parents dans la hiérarchie affectent 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 terminer tous les processus actuellement associés à un objet de travail, utilisez la fonction TerminateJobObject.
Limites et notifications des travaux
Un travail peut appliquer des limites telles que la taille du groupe de travail, la priorité du processus et la limite de temps de fin du travail sur chaque processus associé au travail. Si un processus associé à un travail tente d’augmenter sa taille de 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 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 :
- JOBOBJECT_BASIC_LIMIT_INFORMATION
- JOBOBJECT_BASIC_UI_RESTRICTIONS
- JOBOBJECT_CPU_RATE_CONTROL_INFORMATION
- JOBOBJECT_EXTENDED_LIMIT_INFORMATION
- JOBOBJECT_NOTIFICATION_LIMIT_INFORMATION
Les limites de sécurité doivent être définies individuellement pour chaque processus associé à un objet de travail. Pour plus d’informations, consultez Processus de sécurité et de droits 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 dans 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 à la classe d’informations de l’objet de travail 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 lors de 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 d’un message à arriver ne signifie pas nécessairement que l’événement n’a pas eu lieu. 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 ont été arrêtés. Pour récupérer ces informations de comptabilité, utilisez la fonctionQueryInformationJobObject. 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é pour 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 temps de fin de travail spécifiée a été dépassée. Utilisez waitForSingleObject ou WaitForSingleObjectEx pour surveiller l’objet de travail pour 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 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 des processus de différentes façons.
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 toute une arborescence de processus. 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 des processus, à l’exception des processus que n’importe quel membre de l’arborescence s’éloigne 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 dans lesquels AssignProcessToJobObject échoue.
L’indicateur CREATE_BREAKAWAY_FROM_JOB n’a aucun effet si l’arborescence n’est pas surveillée par l’outil. Par conséquent, il s’agit de l’option préférée, mais elle nécessite une connaissance avancée des processus surveillés.
Empêchez les ruptures de tout type en définissant ni les 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 d’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, cet échec peut empêcher le processus de fonctionner correctement.