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: Proceso puede asociarse con un solo 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
- Crear una jerarquía de trabajos anidados
- límites y notificaciones de trabajos anidados
- contabilidad de recursos para trabajos anidados
- finalizació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 primario inmediato del trabajo 3; El trabajo 3 es el 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 están asociados explícitamente a un objeto de trabajo mediante el AssignProcessToJobObject función o asociada implícitamente durante la creación del proceso, igual que para los trabajos independientes. El orden en el 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 asociación explícita, se deben crear todos los objetos de trabajo mediante CreateJobObject, AssignProcessToJobObject deben llamarse 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 AssignProcessToJobObject.
Cuando los procesos se asocian implícitamente a un trabajo durante la creación del proceso, un proceso secundario se asocia a cada trabajo de la cadena de trabajos de su proceso primario. Si el objeto de trabajo inmediato permite la interrupció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 interrupción, el proceso secundario no se interrumpe incluso si los trabajos de su cadena de trabajos primarios lo permiten.
Límites y notificaciones de trabajos para trabajos anidados
Para determinados límites de recursos, el límite establecido para los trabajos de una cadena de trabajos primario determina el límite 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, consulte SetInformationJobObject.
Cuando se producen determinados eventos, como la creación de nuevos procesos o la infracción del 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 primario del trabajo que desencadenó el mensaje. No es necesario que un trabajo secundario tenga un puerto de finalización de E/S asociado para los mensajes que desencadena se envíen 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, vea 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 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 JOB_OBJECT_TERMINATE derecho de acceso, igual que para los trabajos independientes.