Objetos de trabajo

Un objeto de trabajo permite administrar grupos de procesos como una unidad. Los objetos job son objetos namables, protegibles y compartibles que controlan los atributos de los procesos asociados a ellos. Las operaciones realizadas en un objeto de trabajo afectan a todos los procesos asociados con el objeto de trabajo. Entre los ejemplos se incluyen la aplicación de límites como el tamaño del conjunto de trabajo y la prioridad del proceso o la terminación de todos los procesos asociados a un trabajo.

Crear trabajos

Para crear un objeto de trabajo, use la función CreateJobObject . Cuando se crea el trabajo, no hay procesos asociados al trabajo.

Para asociar un proceso a un trabajo, use la función AssignProcessToJobObject . Después de asociar un proceso a un trabajo, la asociación no se puede romper. Un proceso se puede asociar a más de un trabajo en una jerarquía de trabajos anidados. Para obtener más información, consulte Trabajos anidados.

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 trabajo. Los trabajos no se pueden anidar. La capacidad de anidar trabajos se agregó en Windows 8 y Windows Server 2012.

Puede especificar un descriptor de seguridad para un objeto de trabajo al llamar a la función CreateJobObject . Para obtener más información, vea Seguridad de objetos de trabajo y derechos de acceso.

Administración de procesos en trabajos

Después de asociar un proceso a un trabajo, de forma predeterminada, los procesos secundarios que crea mediante CreateProcess también están asociados con el trabajo. (Los procesos secundarios creados con Win32_Process.Create no están asociados al trabajo). Este comportamiento predeterminado se puede cambiar estableciendo el límite extendido JOB_OBJECT_LIMIT_BREAKAWAY_OK o JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK para el trabajo.

  • Si el trabajo tiene el límite extendido JOB_OBJECT_LIMIT_BREAKAWAY_OK y el proceso primario se creó con la marca CREATE_BREAKAWAY_FROM_JOB, los procesos secundarios del proceso primario no están asociados al trabajo.
  • Si el trabajo tiene el límite extendido JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK, los procesos secundarios de cualquier proceso primario asociado al trabajo no están asociados al trabajo. No es necesario que los procesos primarios se creen con la marca CREATE_BREAKAWAY_FROM_JOB.

Si el trabajo está anidado, la configuración de separación de los trabajos primarios de la jerarquía afecta a si los procesos secundarios están asociados a otro trabajo de la jerarquía. Para obtener más información, consulte Trabajos anidados.

Para determinar si un proceso se ejecuta en un trabajo, use la función IsProcessInJob .

Para finalizar todos los procesos asociados actualmente a un objeto de trabajo, use la función TerminateJobObject .

Límites y notificaciones de trabajos

Un trabajo puede aplicar límites como el tamaño del conjunto de trabajo, la prioridad del proceso y el límite de tiempo de finalización del trabajo en cada proceso asociado al trabajo. Si un proceso asociado a un trabajo intenta aumentar el tamaño del conjunto de trabajo o la prioridad del proceso del límite establecido por el trabajo, las llamadas de función se realizan correctamente, pero se omiten silenciosamente. Un trabajo también puede establecer límites que desencadenan una notificación cuando se superan, pero permiten que el trabajo continúe ejecutándose.

Para establecer límites para un trabajo, use la función SetInformationJobObject . Para obtener una lista de los posibles límites que se pueden establecer para un trabajo, consulte los temas siguientes:

Los límites de seguridad se deben establecer individualmente para cada proceso asociado a un objeto de trabajo. Para obtener más información, consulte Derechos de acceso y seguridad de procesos.

Windows XP con SP3 y Windows Server 2003: La función SetInformationJobObject se puede usar para establecer limitaciones de seguridad para todos los procesos asociados a un objeto de trabajo. A partir de Windows Vista, los límites de seguridad deben establecerse individualmente para cada proceso asociado a un objeto de trabajo.

Si el trabajo está anidado, los trabajos primarios de la jerarquía influyen en el límite que se aplica para el trabajo. Para obtener más información, consulte Trabajos anidados.

Si el trabajo tiene un puerto de finalización de E/S asociado, puede recibir notificaciones cuando se superen determinados límites de trabajo. El sistema envía mensajes al puerto de finalización cuando se supera un límite o se producen otros eventos. Para asociar un puerto de finalización a un trabajo, use la función SetInformationJobObject con la clase de información del objeto de trabajo JobObjectAssociateCompletionPortInformation y un puntero a una estructura de JOBOBJECT_ASSOCIATE_COMPLETION_PORT . Es mejor hacerlo cuando el trabajo está inactivo, para reducir la posibilidad de que falten notificaciones para los procesos cuyos estados cambian durante la asociación del puerto de finalización.

Todos los mensajes se envían directamente desde el trabajo como si el trabajo hubiera llamado a la función PostQueuedCompletionStatus . Un subproceso debe supervisar el puerto de finalización mediante la función GetQueuedCompletionStatus para recoger los mensajes. Tenga en cuenta que, a excepción de los límites establecidos con la clase de información JobObjectNotificationLimitInformation , no se garantiza la entrega de mensajes al puerto de finalización; El error de llegada de un mensaje no significa necesariamente que no se haya producido el evento. Se garantiza que las notificaciones de límites establecidos con JobObjectNotificationLimitInformation lleguen al puerto de finalización. Para obtener una lista de los posibles mensajes, consulte JOBOBJECT_ASSOCIATE_COMPLETION_PORT.

Contabilidad de recursos para trabajos

El objeto de trabajo registra información de contabilidad básica para todos sus procesos asociados, incluidos los que han finalizado. Para recuperar esta información contable, use la función QueryInformationJobObject . Para obtener una lista de la información contable que se mantiene para un trabajo, consulte los temas siguientes:

Si el objeto de trabajo está anidado, la información contable de cada trabajo secundario se agrega en su trabajo primario. Para obtener más información, consulte Trabajos anidados.

Administrar objetos de trabajo

El estado de un objeto de trabajo se establece en señalado cuando se finalizan todos sus procesos porque se ha superado el límite de tiempo de finalización del trabajo especificado. Use WaitForSingleObject o WaitForSingleObjectEx para supervisar el objeto de trabajo de este evento.

Para obtener un identificador para un objeto de trabajo existente, use la función OpenJobObject y especifique el nombre dado al objeto cuando se creó. Solo se pueden abrir objetos de trabajo con nombre.

Para cerrar un identificador de objeto de trabajo, use la función CloseHandle . El trabajo se destruye cuando se ha cerrado su último identificador y se han terminado todos los procesos asociados. Sin embargo, si el trabajo tiene la marca JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE especificada, cerrar el último identificador de objeto de trabajo finaliza todos los procesos asociados y, a continuación, destruye el propio objeto de trabajo. Si un trabajo anidado tiene la marca de JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE especificada, cerrar el último identificador de objeto de trabajo finaliza todos los procesos asociados al trabajo y sus trabajos secundarios en la jerarquía.

Administración de un árbol de procesos que usa objetos de trabajo

A partir de Windows 8 y Windows Server 2012, una aplicación puede usar trabajos anidados para administrar un árbol de procesos que usa más de un objeto de trabajo. Sin embargo, una aplicación que debe ejecutarse en Windows 7, Windows Server 2008 R2 o versiones anteriores de Windows que no admiten trabajos anidados deben administrar el árbol de procesos de otras maneras.

Si una herramienta debe administrar un árbol de procesos que usa objetos de trabajo y no es posible usar trabajos anidados, tanto la herramienta como los miembros del árbol de procesos deben cooperar. Use una de las siguientes opciones:

  • Use el límite de JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK. Si la herramienta usa este límite, no puede supervisar un árbol de proceso completo. La herramienta solo puede supervisar los procesos que agrega al trabajo. Si estos procesos crean procesos secundarios, no están asociados al trabajo. En esta opción, los procesos secundarios se pueden asociar a otros objetos de trabajo.

  • Use el límite de JOB_OBJECT_LIMIT_BREAKAWAY_OK. Si la herramienta usa este límite, puede supervisar todo el árbol de procesos, excepto los procesos que cualquier miembro del árbol separa explícitamente del árbol. Un miembro del árbol puede crear un proceso secundario en un nuevo objeto de trabajo llamando a la función CreateProcess con la marca CREATE_BREAKAWAY_FROM_JOB y, a continuación, llamando a la función AssignProcessToJobObject . De lo contrario, el miembro debe controlar los casos en los que se produce un error en AssignProcessToJobObject .

    La marca CREATE_BREAKAWAY_FROM_JOB no tiene ningún efecto si la herramienta no supervisa el árbol. Por lo tanto, esta es la opción preferida, pero requiere conocimientos avanzados de los procesos que se supervisan.

  • Evite los puntos de interrupción de cualquier tipo estableciendo ni la JOB_OBJECT_LIMIT_BREAKAWAY_OK ni el límite de JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK. En esta opción, la herramienta puede supervisar todo el árbol de procesos. Sin embargo, si un proceso secundario intenta asociarse a sí mismo u otro proceso secundario con un trabajo mediante una llamada a AssignProcessToJobObject, se producirá un error en la llamada. Si el proceso se diseñó para asociarse a un trabajo específico, este error puede impedir que el proceso funcione correctamente.