Compartir por


Directivas de Scheduler

En este documento se describe el rol de las directivas de programación en el Runtime de simultaneidad. Una directiva de Scheduler controla la estrategia que el programador utiliza cuando administra tareas. Por ejemplo, considere una aplicación que requiere que algunas tareas se ejecuten en THREAD_PRIORITY_NORMAL y otras tareas en THREAD_PRIORITY_HIGHEST. Puede crear dos instancias del programador: una que especifica que la directiva ContextPriority sea THREAD_PRIORITY_NORMAL y otra que especifica que la misma directiva sea THREAD_PRIORITY_HIGHEST.

Mediante el uso de directivas de programador, puede dividir los recursos de procesamiento disponibles y asignar un conjunto fijo de recursos a cada programador. Por ejemplo, piense en un algoritmo paralelo que no se escala más allá de cuatro procesadores. Puede crear una directiva de programador que limite sus tareas para que no usen más de cuatro procesadores simultáneamente.

Sugerencia

El Runtime de simultaneidad proporciona un programador predeterminado. Por lo tanto, no es necesario crear ninguno en la aplicación. El Programador de tareas permite ajustar el rendimiento de las aplicaciones por lo que, si no está familiarizado con Runtime de simultaneidad, se recomienda comenzar con la biblioteca de modelos paralelos (PPL) o la biblioteca de agentes asincrónicos.

Cuando se usan los métodos concurrency::CurrentScheduler::Create, concurrency::Scheduler::Create o concurrency::Scheduler::SetDefaultSchedulerPolicy para crear una instancia del programador, se proporciona un objeto concurrency::SchedulerPolicy que contiene una colección de pares clave-valor que especifican el comportamiento del programador. El constructor SchedulerPolicy toma un número variable de argumentos. El primer argumento es el número de elementos de directiva que está a punto de especificar. Los argumentos restantes son pares clave-valor para cada elemento de directiva. En el ejemplo siguiente se crea un objeto SchedulerPolicy que especifica tres elementos de directiva. El Runtime usa valores predeterminados para las claves de directiva que no se especifican.

SchedulerPolicy policy(3,       
   MinConcurrency, 2,
   MaxConcurrency, 4,
   ContextPriority, THREAD_PRIORITY_HIGHEST
);

La enumeración concurrency::PolicyElementKey define las claves de directiva asociadas al Programador de tareas. En la tabla siguiente se describen las claves de directiva y el valor predeterminado que usa el Runtime para cada uno de ellos.

Clave de directiva Descripción Valor predeterminado
SchedulerKind Valor concurrency::SchedulerType que especifica el tipo de subprocesos que se va a usar para programar tareas. ThreadScheduler (use subprocesos normales). Este es el único valor válido para esta clave.
MaxConcurrency Valor unsigned int que especifica el número máximo de recursos de simultaneidad que usa el programador. concurrency::MaxExecutionResources
MinConcurrency Valor unsigned int que especifica el número mínimo de recursos de simultaneidad que usa el programador. 1
TargetOversubscriptionFactor Valor unsigned int que especifica cuántos subprocesos se van a asignar a cada recurso de procesamiento. 1
LocalContextCacheSize Valor unsigned int que especifica el número máximo de contextos que se pueden almacenar en caché en la cola local de cada procesador virtual. 8
ContextStackSize Valor unsigned int que especifica el tamaño de la pila, en kilobytes, que se va a reservar para cada contexto. 0 (use el tamaño de pila predeterminado)
ContextPriority Valor int que especifica la prioridad del subproceso de cada contexto. Puede ser cualquier valor que pueda pasar a SetThreadPriority o INHERIT_THREAD_PRIORITY. THREAD_PRIORITY_NORMAL
SchedulingProtocol Valor concurrency::SchedulingProtocolType que especifica el algoritmo de programación que se va a usar. EnhanceScheduleGroupLocality
DynamicProgressFeedback Valor concurrency::DynamicProgressFeedbackType que especifica si se deben reequilibrar los recursos según la información de progreso basada en estadísticas.

Nota No establezca esta directiva en ProgressFeedbackDisabled porque está reservada para que la use el Runtime.
ProgressFeedbackEnabled

Cada programador usa su propia directiva cuando programa tareas. Las directivas asociadas a un programador no afectan al comportamiento de ningún otro programador. Además, no se puede cambiar la directiva del programador una vez creado el objeto Scheduler.

Importante

Use solo directivas de programador para controlar los atributos de los subprocesos que crea el Runtime. No cambie la afinidad de subproceso ni la prioridad de los subprocesos creados por el Runtime, ya que esto podría provocar un comportamiento indefinido.

El Runtime crea un programador predeterminado automáticamente si el usuario no crea uno de forma explícita. Si desea usar el programador predeterminado en la aplicación, pero quiere especificar una directiva para que la use ese programador, llame al método concurrency::Scheduler::SetDefaultSchedulerPolicy antes de programar el trabajo paralelo. Si no llama al método Scheduler::SetDefaultSchedulerPolicy, el tiempo de ejecución usa los valores de directiva predeterminados de la tabla.

Use los métodos concurrency::CurrentScheduler::GetPolicy y concurrency::Scheduler::GetPolicy para recuperar una copia de la directiva del programador. Los valores de directiva que recibe de estos métodos pueden diferir de los valores de directiva que especifique al crear el programador.

Ejemplo

Para examinar ejemplos que usan directivas de programador específicas para controlar el comportamiento del programador, vea Procedimiento para especificar directivas de programador concretas y Procedimiento para crear agentes que usen directivas de programador concretas.

Consulte también

Programador de tareas
Procedimiento para especificar directivas de Scheduler concretas
Procedimiento para crear agentes que usen directivas de Scheduler concretas