Compartir a través de


IScheduler (Estructura)

Una interfaz para una abstracción de un planificador de tareas. El Administrador de recursos del entorno de simultaneidad usa esta interfaz para comunicarse con programadores de trabajo.

Sintaxis

struct IScheduler;

Miembros

Métodos públicos

Nombre Descripción
IScheduler::AddVirtualProcessors Proporciona a un programador un conjunto de procesadores virtuales para su uso. Cada interfaz IVirtualProcessorRoot representa el derecho a ejecutar un único subproceso que puede realizar el trabajo por el planificador.
IScheduler::GetId Devuelve un identificador único para el programador.
IScheduler::GetPolicy Devuelve una copia de la directiva del programador. Para obtener más información sobre las directivas del programador, consulte SchedulerPolicy.
IScheduler::NotifyResourcesExternallyBusy Notifica a este planificador que los subprocesos de hardware representados por el conjunto de raíces del procesador virtual en la matriz ppVirtualProcessorRoots están siendo utilizados ahora por otros planificadores.
IScheduler::NotifyResourcesExternallyIdle Notifica a este programador que otros programadores no emplean los subprocesos de hardware que representa el conjunto de raíces del procesador virtual de la matriz ppVirtualProcessorRoots.
IScheduler::RemoveVirtualProcessors Inicia la eliminación de las raíces del procesador virtual asignadas anteriormente a este programador.
IScheduler::Statistics Proporciona información sobre el cambio en la longitud de la cola, así como las tasas de llegada y finalización de tareas para un programador.

Comentarios

Si va a implementar un programador personalizado que se comunica con el Resource Manager, debería proporcionar una implementación de la interfaz IScheduler. La interfaz es un extremo de un canal bidireccional de comunicación entre un programador y el Resource Manager. El otro extremo se representa mediante las interfaces IResourceManager y ISchedulerProxy, que implementa el Resource Manager.

Jerarquía de herencia

IScheduler

Requisitos

Encabezado: concrtrm.h

Espacio de nombres: simultaneidad

IScheduler::AddVirtualProcessors (Método)

Proporciona a un programador un conjunto de raíces del procesador virtual para su uso. Cada interfaz IVirtualProcessorRoot representa el derecho a ejecutar un único subproceso que puede realizar trabajo en representación del planificador.

virtual void AddVirtualProcessors(
    _In_reads_(count) IVirtualProcessorRoot** ppVirtualProcessorRoots,
    unsigned int count) = 0;

Parámetros

ppVirtualProcessorRoots
Matriz de interfaces IVirtualProcessorRoot que representan las raíces del procesador virtual que se agregan al planificador.

count
Número de interfaces de la matriz IVirtualProcessorRoot.

Comentarios

El Administrador de Recursos invoca el método AddVirtualProcessor para conceder un conjunto inicial de raíces de procesador virtual a un planificador. También podría invocar el método para agregar raíces de procesadores virtuales al planificador cuando reequilibra los recursos entre planificadores.

Método IScheduler::GetId

Devuelve un identificador único para el programador.

virtual unsigned int GetId() const = 0;

Valor devuelto

Identificador entero único.

Comentarios

Use la función GetSchedulerId para obtener un identificador único para el objeto que implementa la interfaz IScheduler antes de poder usar la interfaz como un parámetro en métodos que proporciona el Resource Manager. Se espera que devuelva el mismo identificador al invocar la función GetId.

Un identificador obtenido de un origen diferente podría dar lugar a un comportamiento sin definir.

IScheduler::GetPolicy (Método)

Devuelve una copia de la directiva del programador. Para obtener más información sobre las directivas del programador, consulte SchedulerPolicy.

virtual SchedulerPolicy GetPolicy() const = 0;

Valor devuelto

Copia de la directiva del programador.

IScheduler::NotifyResourcesExternallyBusy (Método)

Notifica a este planificador que los subprocesos de hardware representados por el conjunto de raíces del procesador virtual en la matriz ppVirtualProcessorRoots están siendo utilizados ahora por otros planificadores.

virtual void NotifyResourcesExternallyBusy(
    _In_reads_(count) IVirtualProcessorRoot** ppVirtualProcessorRoots,
    unsigned int count) = 0;

Parámetros

ppVirtualProcessorRoots
Matriz de interfaces IVirtualProcessorRoot asociada a los subprocesos de hardware en las que otros programadores han estado muy ocupados.

count
Número de interfaces de la matriz IVirtualProcessorRoot.

Comentarios

Es posible que un hilo de hardware específico se asigne a varios planificadores al mismo tiempo. Podría deberse a que no hay suficientes subprocesos de hardware en el sistema para satisfacer la simultaneidad mínima para todos los programadores, sin compartir recursos. Otra posibilidad es que los recursos se asignen temporalmente a otros planificadores cuando el planificador propietario no los está usando, desactivando todas sus raíces de procesador virtual en ese hilo de hardware.

El nivel de suscripción de un subproceso de hardware se indica mediante el número de subprocesos suscritos y las raíces del procesador virtual activadas asociadas a ese subproceso de hardware. Desde el punto de vista de un planificador determinado, el nivel de suscripción externo de un hardware thread es la parte de suscripción a la que otros planificadores contribuyen. Las notificaciones de que los recursos están ocupados externamente se envían a un schedulador cuando el nivel de suscripción externa de un subproceso de hardware pasa de cero a un valor positivo.

Las notificaciones por medio de este método solo se envían a los programadores que tienen una directiva donde el valor de la clave de directiva MinConcurrency es igual al valor de la clave de directiva MaxConcurrency. Para obtener más información sobre las directivas del programador, consulte SchedulerPolicy.

Un planificador que califica para recibir notificaciones obtiene un conjunto inicial de notificaciones cuando se crea, informándole si los recursos que se le acaban de asignar están ocupados o inactivos externamente.

IScheduler::NotifyResourcesExternallyIdle (Método)

Notifica a este programador que otros programadores no emplean los subprocesos de hardware que representa el conjunto de raíces del procesador virtual de la matriz ppVirtualProcessorRoots.

virtual void NotifyResourcesExternallyIdle(
    _In_reads_(count) IVirtualProcessorRoot** ppVirtualProcessorRoots,
    unsigned int count) = 0;

Parámetros

ppVirtualProcessorRoots
Matriz de interfaces IVirtualProcessorRoot asociadas a los subprocesos de hardware en las cuales otros planificadores se han vuelto inactivos.

count
Número de interfaces de la matriz IVirtualProcessorRoot.

Comentarios

Es posible que un subproceso de hardware específico se asigne a varios planificadores al mismo tiempo. Podría deberse a que no hay suficientes subprocesos de hardware en el sistema para satisfacer la simultaneidad mínima para todos los programadores, sin compartir recursos. Otra posibilidad es que los recursos son asignados temporalmente a otros planificadores cuando el planificador propietario no los está utilizando, mediante la desactivación de todas sus raíces de procesadores virtuales en ese subproceso de hardware al desactivarse.

El nivel de suscripción de un subproceso de hardware se indica mediante el número de subprocesos suscritos y las raíces del procesador virtual activadas asociadas a ese subproceso de hardware. Desde el punto de vista de un planificador determinado, el nivel de suscripción externo de un subproceso de hardware es la parte de la suscripción a la que otros planificadores contribuyen. Las notificaciones de que los recursos están ocupados externamente se envían a un programador cuando el nivel de suscripción externa de un subproceso de hardware se mueve de un valor positivo anterior a cero.

Las notificaciones por medio de este método solo se envían a los programadores que tienen una directiva donde el valor de la clave de directiva MinConcurrency es igual al valor de la clave de directiva MaxConcurrency. Para obtener más información sobre las directivas del programador, consulte SchedulerPolicy.

Un planificador con derecho a notificaciones obtiene un conjunto inicial de notificaciones al crearse, informándole si los recursos que se le acaban de asignar están ocupados o inactivos.

Método IScheduler::RemoveVirtualProcessors

Inicia la eliminación de las raíces del procesador virtual asignadas anteriormente a este programador.

virtual void RemoveVirtualProcessors(
    _In_reads_(count) IVirtualProcessorRoot** ppVirtualProcessorRoots,
    unsigned int count) = 0;

Parámetros

ppVirtualProcessorRoots
Matriz de interfaces IVirtualProcessorRoot en la que se representan la raíces del procesador virtual que se van a quitar.

count
Número de interfaces de la matriz IVirtualProcessorRoot.

Comentarios

El Resource Manager invoca el método RemoveVirtualProcessors para recuperar un conjunto de raíces de procesadores virtuales desde un planificador. Se espera que el planificador invoque el método Quitar en cada interfaz cuando haya terminado con las raíces del procesador virtual. No use una interfaz IVirtualProcessorRoot una vez que haya invocado el método Remove en ella.

El parámetro ppVirtualProcessorRoots apunta a una matriz de interfaces. Entre el conjunto de raíces de procesador virtual que se van a quitar, las raíces que nunca se han activado se pueden devolver inmediatamente mediante el método Remove. Las raíces que se han activado y están ejecutando el trabajo o se han desactivado y están a la espera de que llegue el trabajo, deben devolverse de forma asincrónica. El programador debe hacer todos los intentos para quitar la raíz del procesador virtual lo antes posible. Al retrasar la eliminación de las raíces del procesador virtual, puede producirse una sobresuscripción involuntaria dentro del planificador.

IScheduler::Statistics (Método)

Proporciona información sobre el cambio en la longitud de la cola, así como las tasas de llegada y finalización de tareas para un programador.

virtual void Statistics(
    _Out_ unsigned int* pTaskCompletionRate,
    _Out_ unsigned int* pTaskArrivalRate,
    _Out_ unsigned int* pNumberOfTasksEnqueued) = 0;

Parámetros

pTaskCompletionRate
El número de tareas que ha completado el programador desde la última llamada a este método.

pTaskArrivalRate
El número de tareas que han llegado al planificador desde la última llamada a este método.

pNumberOfTasksEnqueued
El número total de tareas en todas las colas del planificador.

Comentarios

El Administrador de Recursos invoca este método para recopilar estadísticas de un planificador. Las estadísticas recopiladas aquí se usarán para impulsar algoritmos de comentarios dinámicos para determinar cuándo es apropiado asignar más recursos al programador y cuándo quitarlos. Los valores que proporciona el programador pueden ser optimistas y no reflejan necesariamente el recuento actual de forma exacta.

Debe implementar este método si desea que el Administrador de Recursos utilice retroalimentación sobre aspectos como la llegada de tareas para determinar cómo equilibrar los recursos entre su planificador y otros planificadores registrados con el Administrador de Recursos. Si decide no recopilar estadísticas, puede establecer la clave de directiva DynamicProgressFeedback en el valor DynamicProgressFeedbackDisabled de la directiva del programador y el Resource Manager no invocará este método en el programador.

A falta de información estadística, el Resource Manager usará los niveles de suscripción de subproceso de hardware para tomar decisiones de asignación y migración de recursos. Para más información sobre los niveles de suscripción, consulte IExecutionResource::CurrentSubscriptionLevel.

Consulte también

espacio de nombres de concurrencia
PolicyElementKey
SchedulerPolicy Clase
IExecutionContext (estructura)
IThreadProxy (estructura)
IVirtualProcessorRoot (estructura)
IResourceManager (estructura)