Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En este documento se describe el rol de las directivas de programador en el runtime de simultaneidad. Una directiva de programador controla la estrategia que el programador usa cuando administra tareas. Por ejemplo, imagine una aplicación que necesita que algunas tareas usen subprocesos y otras tareas programables en modo usuario (UMS) para usar el mecanismo de subprocesamiento normal. Se pueden crear dos instancias del programador: una que especifica la creación de subprocesos UMS como parte de su directiva de programador y otra que especifica subprocesos normales como parte de su directiva de programador. Para obtener más información sobre UMS, vea Programación en modo usuario.
Las directivas de programador también permiten dividir los recursos de procesamiento disponibles y asignar un conjunto fijo de recursos a cada programador. Por ejemplo, considere un algoritmo paralelo que no se amplía para más de cuatro procesadores. Puede crear una directiva de programador que limite las tareas para que no usen más de cuatro procesadores simultáneamente.
Sugerencia |
|---|
El runtime de simultaneidad proporciona un programador predeterminado y, por tanto, no es necesario crear uno en la aplicación. Puesto que el programador de tareas ayuda a optimizar el rendimiento de las aplicaciones, se recomienda que comience con Parallel Patterns Library (PPL) o Biblioteca de agentes asincrónicos si no ha usado antes el runtime de simultaneidad. |
Cuando use el método Concurrency::CurrentScheduler::Create, Concurrency::Scheduler::Create o Concurrency::Scheduler::SetDefaultSchedulerPolicy para crear una instancia de programador, proporcione un objeto Concurrency::SchedulerPolicy que contenga una colección de pares de clave y valor que especifiquen 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 los pares de clave y valor para cada elemento de directiva. En el siguiente ejemplo se crea un objeto SchedulerPolicy que especifica tres elementos de directiva. El runtime utiliza los 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 siguiente tabla se describen las claves de directiva y el valor predeterminado que el runtime usa para cada uno de ellos.
Clave de directiva |
Descripción |
Valor predeterminado |
|---|---|---|
SchedulerKind |
Un valor Concurrency::SchedulerType que especifica si se van a usar subprocesos normales o subprocesos programables en modo usuario (UMS) para programar tareas. |
ThreadScheduler (usa subprocesos normales) |
MaxConcurrency |
Valor unsigned int que especifica el número máximo de recursos de simultaneidad que el programador usa. |
|
MinConcurrency |
Un valor unsigned int que especifica el número mínimo de recursos de simultaneidad que el programador utiliza. |
1 |
TargetOversubscriptionFactor |
Un valor unsigned int que especifica cuántos subprocesos se asignan a cada recurso de procesamiento. |
1 |
LocalContextCacheSize |
Un valor unsigned int que especifica el número máximo de contextos que pueden estar almacenados en memoria caché en la cola local de cada procesador virtual. |
8 |
ContextStackSize |
Un valor unsigned int que especifica el tamaño de la pila, en kilobytes, que se reserva para cada contexto. |
0 (usa el tamaño de pila predeterminado) |
ContextPriority |
Un valor int que especifica la prioridad del subproceso de cada contexto. Puede ser cualquier valor que se pueda pasar a SetThreadPriority o INHERIT_THREAD_PRIORITY. |
THREAD_PRIORITY_NORMAL |
SchedulingProtocol |
Un valor Concurrency::SchedulingProtocolType que especifica el algoritmo de programación que se va a usar. |
EnhanceScheduleGroupLocality |
DynamicProgressFeedback |
Un valor Concurrency::DynamicProgressFeedbackType que especifica si se van a volver a equilibrar los recursos según la información de progreso basada en estadísticas. Nota: no establezca esta directiva en ProgressFeedbackDisabled. La sintaxis ProgressFeedbackDisabled se reserva para uso del runtime. |
ProgressFeedbackEnabled |
Cada programador utiliza su propia directiva cuando programa tareas. Por consiguiente, las directivas que están asociadas a un programador no afectan al comportamiento de otros programadores. Además, no puede cambiar la directiva de programador después de crear el objeto Scheduler.
Importante |
|---|
Use solo directivas de programador para controlar los atributos de los subprocesos que el runtime crea. Cambiar la afinidad de subprocesos o la prioridad de los subprocesos creados por el runtime produce un comportamiento indefinido. |
El runtime creará un programador predeterminado si no crea uno explícitamente. Si desea usar el programador predeterminado en la aplicación, pero desea especificar una directiva para que la use el programador, llame al método Concurrency::Scheduler::SetDefaultSchedulerPolicy antes de programar trabajo paralelo. Si no llama al método Scheduler::SetDefaultSchedulerPolicy, el runtime utiliza 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 de programador. Los valores de directiva que se reciben de estos métodos pueden diferir de los valores de directiva que se especifican cuando se crea el programador. Por ejemplo, el valor de directiva UMSThreadDefault especifica que el programador utiliza subprocesos UMS si esa característica está disponible en el sistema operativo (por ejemplo, la versión de 64 bits de Windows 7). Si los subprocesos UMS no están disponibles, el programador establece este valor de directiva en ThreadScheduler, que especifica que el programador usará subprocesos normales.
Ejemplo
Para obtener ejemplos que utilizan directivas de programador concretas para controlar el comportamiento del programador, vea Cómo: Especificar directivas de programador concretas y Cómo: Crear agentes que usen directivas de programador específicas.
Vea también
Tareas
Cómo: Especificar directivas de programador concretas
Cómo: Crear agentes que usen directivas de programador específicas
Conceptos
Programador de tareas (Runtime de simultaneidad)
Historial de cambios
Fecha |
Historial |
Motivo |
|---|---|---|
|
Julio de 2010 |
Contenido reorganizado. |
Mejora de la información. |
Sugerencia
Importante