Servicio de ordenación de subprocesos

El servicio de ordenación de subprocesos controla la ejecución de uno o varios subprocesos de cliente. Garantiza que cada subproceso de cliente se ejecute una vez durante el período especificado y en orden relativo.

Windows Server 2003 y Windows XP: El servicio de ordenación de subprocesos está disponible a partir de Windows Vista y Windows Server 2008.

El servicio de ordenación de subprocesos está desactivado de forma predeterminada y el usuario debe iniciarlo. Mientras se ejecuta el servicio de ordenación de subprocesos, se activa cada 5 segundos para comprobar si hay una nueva solicitud, incluso si el sistema está inactivo. Esto evita que el sistema entre en suspensión durante más de 5 segundos, lo que hace que el sistema consuma más energía. Si la eficiencia energética es fundamental para la aplicación, es mejor no usar el servicio de ordenación de subprocesos y, en su lugar, permitir que el programador del sistema administre la ejecución de subprocesos.

Cada subproceso de cliente pertenece a un grupo de ordenación de subprocesos. El subproceso primario crea uno o varios grupos de ordenación de subprocesos mediante una llamada a la función AvRtCreateThreadOrderingGroup . El subproceso primario usa esta función para especificar el período del grupo de ordenación de subprocesos y un intervalo de tiempo de espera.

Los subprocesos de cliente adicionales llaman a la función AvRtJoinThreadOrderingGroup para unirse a un grupo de ordenación de subprocesos existente. Estos subprocesos indican si van a ser predecesores o sucesores del subproceso primario en el orden de ejecución. Se espera que cada subproceso de cliente complete una determinada cantidad de procesamiento cada período. Todos los subprocesos del grupo deben completar su ejecución dentro del período más el intervalo de tiempo de espera.

Los subprocesos de un grupo de ordenación de subprocesos encierra su código de procesamiento dentro de un bucle controlado por la función AvRtWaitOnThreadOrderingGroup . En primer lugar, los subprocesos predecesores se ejecutan de uno en uno en el orden en que se unieron al grupo, mientras que los subprocesos primarios y sucesores se bloquean en sus llamadas a AvRtWaitOnThreadOrderingGroup. Cuando cada subproceso predecesor finaliza con su procesamiento, el control de ejecución vuelve a la parte superior de su bucle de procesamiento y el subproceso llama a AvRtWaitOnThreadOrderingGroup de nuevo para bloquear hasta su próximo turno. Después de que todos los subprocesos predecesores hayan llamado a esta función, el servicio de ordenación de subprocesos puede programar el subproceso primario. Por último, cuando el subproceso primario finaliza su procesamiento y llama de nuevo a AvRtWaitOnThreadOrderingGroup , el servicio de ordenación de subprocesos puede programar los subprocesos sucesores uno a uno en el orden en que se unieron al grupo. Si todos los subprocesos completan su ejecución antes de que finalice un período, todos los subprocesos esperan hasta que transcurre el resto del período antes de que se vuelva a ejecutar.

Cuando el cliente ya no necesita ejecutarse como parte del grupo de ordenación de subprocesos, llama a la función AvRtLeaveThreadOrderingGroup para quitarse del grupo. Tenga en cuenta que el subproceso primario no debe quitarse de un grupo de ordenación de subprocesos. Si un subproceso no completa su ejecución antes del período más el intervalo de tiempo de espera transcurrido, se elimina del grupo.

El subproceso primario llama a la función AvRtDeleteThreadOrderingGroup para eliminar el grupo de ordenación de subprocesos. El grupo de ordenación de subprocesos también se destruye si el subproceso primario no completa su ejecución antes del período más el intervalo de tiempo de espera transcurrido. Cuando se destruye el grupo de ordenación de subprocesos, cualquier llamada a AvRtWaitOnThreadOrderingGroup desde subprocesos de ese grupo produce un error o se agota el tiempo de espera.