Trabajos anidados
Una aplicación puede usar trabajos anidados para administrar subconjuntos de procesos. Los trabajos anidados también habilitan una aplicación que usa trabajos para hospedar otras aplicaciones que también usan trabajos.
Windows 7, Windows Server 2008 R2, Windows XP con SP3, Windows Server 2008, Windows Vista y Windows Server 2003: Un proceso solo se puede asociar a un único trabajo. Los trabajos anidados se introdujeron en Windows 8 y Windows Server 2012.
En este tema se proporciona información general sobre el anidamiento de trabajos y el comportamiento de los trabajos anidados:
- Jerarquías de trabajos anidadas
- Creación de una jerarquía de trabajos anidados
- Límites y notificaciones de trabajos anidados
- Contabilidad de recursos para trabajos anidados
- Terminación de trabajos anidados
Para obtener información general sobre los trabajos y los objetos de trabajo, vea Objetos de trabajo.
Jerarquías de trabajos anidadas
Los trabajos anidados tienen una relación de elementos primarios y secundarios en la que cada trabajo secundario contiene un subconjunto de los procesos de su trabajo primario. Si un proceso que ya está en un trabajo se agrega a otro trabajo, los trabajos se anidan de forma predeterminada si el sistema puede formar una jerarquía de trabajos válida y ninguno establece límites de interfaz de usuario (SetInformationJobObject con JobObjectBasicUIRestrictions).
En la figura 1 se muestra una jerarquía de trabajos que contiene un árbol de procesos etiquetados P0 a P7. El trabajo 1 es el trabajo primario del trabajo 2 y el trabajo 4, y es un antecesor del trabajo 3. El trabajo 2 es el elemento primario inmediato del trabajo 3; El trabajo 3 es el elemento secundario inmediato del trabajo 2. Los trabajos 1, 2 y 3 forman una cadena de trabajos en la que los trabajos 1 y 2 son la cadena de trabajos principal del trabajo 3. El trabajo final de una cadena de trabajos es el trabajo inmediato de los procesos de ese trabajo. En la figura 1, el trabajo 3 es el trabajo inmediato de los procesos P2, P3 y P4.
Los trabajos anidados también se pueden usar para administrar grupos de procesos del mismo nivel. En la jerarquía de trabajos que se muestra en la figura 2, el trabajo 1 es el trabajo primario del trabajo 2. Tenga en cuenta que una jerarquía de trabajos puede contener solo parte de un árbol de procesos. En la figura 2, P0 no está en la jerarquía, pero sus procesos secundarios P1 a P5 son.
Creación de una jerarquía de trabajos anidados
Los procesos de una jerarquía de trabajos se asocian explícitamente a un objeto de trabajo mediante la función AssignProcessToJobObject o se asocian implícitamente durante la creación del proceso, igual que para los trabajos independientes. El orden en que se crean los trabajos y los procesos se asignan determina si se puede crear una jerarquía.
Para crear una jerarquía de trabajos mediante una asociación explícita, se deben crear todos los objetos de trabajo mediante CreateJobObject y, a continuación, se debe llamar a AssignProcessToJobObject varias veces para que cada proceso asocie el proceso a cada trabajo al que debe pertenecer. Para asegurarse de que la jerarquía de trabajos es válida, primero asigne todos los procesos al trabajo en la raíz de la jerarquía y, a continuación, asigne un subconjunto de procesos al objeto de trabajo secundario inmediato, etc. Si los procesos se asignan a trabajos en este orden, un trabajo secundario siempre tendrá un subconjunto de procesos en su trabajo primario mientras se crea la jerarquía, que es necesaria para el anidamiento. Si los procesos se asignan a trabajos en orden aleatorio, en algún momento un trabajo secundario tendrá procesos que no están en su trabajo primario. Esto no se permite mediante el anidamiento y provocará un error en AssignProcessToJobObject .
Cuando los procesos están asociados implícitamente a un trabajo durante la creación del proceso, un proceso secundario está asociado a cada trabajo de la cadena de trabajos de su proceso primario. Si el objeto de trabajo inmediato permite la separación, el proceso secundario se separa del objeto de trabajo inmediato y de cada trabajo de la cadena de trabajos primarios, moviendo la jerarquía hasta que llegue a un trabajo que no permita la separación. Si el objeto de trabajo inmediato no permite la separación, el proceso secundario no se rompe aunque los trabajos de su cadena de trabajos primarios lo permitan.
Límites y notificaciones de trabajos anidados
Para determinados límites de recursos, el límite establecido para los trabajos de una cadena de trabajos primarios determina el límite efectivo que se aplica para un trabajo secundario. El límite efectivo para el trabajo secundario puede ser más restrictivo que el límite de su elemento primario, pero no puede ser menos restrictivo. Por ejemplo, si la clase de prioridad de un trabajo secundario es ABOVE_NORMAL_PRIORITY_CLASS y la clase de prioridad de su trabajo primario es NORMAL_PRIORITY_CLASS, se NORMAL_PRIORITY_CLASS el límite efectivo para los procesos del trabajo secundario. Sin embargo, si la clase de prioridad del trabajo secundario es BELOW_NORMAL_PRIORITY_CLASS, se BELOW_NORMAL_PRIORITY_CLASS el límite efectivo para los procesos del trabajo secundario. Los límites efectivos se aplican para la clase de prioridad, la afinidad, el cargo de confirmación, el límite de tiempo de ejecución por proceso, el límite de clases de programación y el conjunto de trabajo mínimo y máximo. Para obtener más información sobre los límites de recursos específicos, vea SetInformationJobObject.
Cuando se producen determinados eventos, como la nueva infracción de creación de procesos o límite de recursos, se envía un mensaje al puerto de finalización de E/S asociado a un trabajo. Un trabajo también puede registrarse para recibir notificaciones cuando se superan determinados límites. Para un trabajo no anidado, el mensaje se envía al puerto de finalización de E/S asociado al trabajo. Para un trabajo anidado, el mensaje se envía a cada puerto de finalización de E/S asociado a cualquier trabajo de la cadena de trabajos primaria del trabajo que desencadenó el mensaje. Un trabajo secundario no necesita tener un puerto de finalización de E/S asociado para los mensajes que desencadena para enviarse a los puertos de finalización de E/S de los trabajos primarios más altos en la cadena de trabajos. Para obtener más información sobre mensajes específicos, consulte JOBOBJECT_ASSOCIATE_COMPLETION_PORT.
Contabilidad de recursos para trabajos anidados
La información de contabilidad de recursos de un trabajo anidado describe el uso de todos los procesos asociados a ese trabajo, incluidos los procesos de los trabajos secundarios. Por lo tanto, cada trabajo de una cadena de trabajos representa los recursos agregados utilizados por sus propios procesos y los procesos de cada trabajo secundario debajo de él en la cadena de trabajos.
Terminación de trabajos anidados
Cuando se finaliza un trabajo en una jerarquía de trabajos, el sistema finaliza los procesos de ese trabajo y todos sus trabajos secundarios, empezando por el trabajo secundario en la parte inferior de la jerarquía. Los recursos pendientes usados por cada proceso terminado se cobran al trabajo primario.
El identificador de trabajo debe tener el derecho de acceso JOB_OBJECT_TERMINATE, igual que para los trabajos independientes.