Prioridades de programación

Los subprocesos están programados para ejecutarse en función de su prioridad de programación. A cada subproceso se le asigna una prioridad de programación. Los niveles de prioridad van de cero (prioridad más baja) a 31 (prioridad más alta). Solo el subproceso de página cero puede tener una prioridad de cero. (El subproceso de página cero es un subproceso del sistema responsable de cero de las páginas libres cuando no hay otros subprocesos que necesiten ejecutarse).

El sistema trata todos los subprocesos con la misma prioridad que igual. El sistema asigna segmentos de tiempo de forma round robin a todos los subprocesos con la prioridad más alta. Si ninguno de estos subprocesos está listo para ejecutarse, el sistema asigna segmentos de tiempo de forma round robin a todos los subprocesos con la siguiente prioridad más alta. Si un subproceso de prioridad más alta está disponible para ejecutarse, el sistema deja de ejecutar el subproceso de prioridad inferior (sin permitirle terminar de usar su intervalo de tiempo) y asigna un segmento de tiempo completo al subproceso de prioridad más alta. Para obtener más información, vea Modificadores de contexto.

La prioridad de cada subproceso viene determinada por los criterios siguientes:

  • La clase de prioridad de su proceso
  • El nivel de prioridad del subproceso dentro de la clase de prioridad de su proceso

La clase de prioridad y el nivel de prioridad se combinan para formar la prioridad base de un subproceso. Para obtener información sobre la prioridad dinámica de un subproceso, consulte Priority Boosts.

Priority (clase)

Cada proceso pertenece a una de las siguientes clases de prioridad:

IDLE_PRIORITY_CLASS
BELOW_NORMAL_PRIORITY_CLASS
NORMAL_PRIORITY_CLASS
ABOVE_NORMAL_PRIORITY_CLASS
HIGH_PRIORITY_CLASS
REALTIME_PRIORITY_CLASS

De forma predeterminada, la clase de prioridad de un proceso es NORMAL_PRIORITY_CLASS. Use la función CreateProcess para especificar la clase de prioridad de un proceso secundario al crearlo. Si el proceso de llamada se IDLE_PRIORITY_CLASS o BELOW_NORMAL_PRIORITY_CLASS, el nuevo proceso heredará esta clase. Use la función GetPriorityClass para determinar la clase de prioridad actual de un proceso y la función SetPriorityClass para cambiar la clase de prioridad de un proceso.

Los procesos que supervisan el sistema, como los protectores de pantalla o las aplicaciones que actualizan periódicamente una pantalla, deben usar IDLE_PRIORITY_CLASS. Esto impide que los subprocesos de este proceso, que no tienen prioridad alta, interfieran con subprocesos de mayor prioridad.

Use HIGH_PRIORITY_CLASS con cuidado. Si un subproceso se ejecuta en el nivel de prioridad más alto durante períodos prolongados, otros subprocesos del sistema no obtendrán tiempo de procesador. Si varios subprocesos se establecen con prioridad alta al mismo tiempo, los subprocesos pierden su eficacia. La clase de prioridad alta debe reservarse para los subprocesos que deben responder a eventos críticos para el tiempo. Si la aplicación realiza una tarea que requiere la clase de prioridad alta mientras que el resto de sus tareas son prioridad normal, use SetPriorityClass para elevar temporalmente la clase de prioridad de la aplicación; a continuación, reduzca la tarea crítica después de que se haya completado la tarea crítica. Otra estrategia consiste en crear un proceso de alta prioridad que tenga todos sus subprocesos bloqueados la mayor parte del tiempo, despertando subprocesos solo cuando se necesitan tareas críticas. El punto importante es que un subproceso de alta prioridad debe ejecutarse durante un breve tiempo y solo cuando tiene un trabajo crítico para el tiempo.

Casi nunca debe usar REALTIME_PRIORITY_CLASS, ya que interrumpe los subprocesos del sistema que administran la entrada del mouse, la entrada del teclado y el vaciado del disco en segundo plano. Esta clase puede ser adecuada para las aplicaciones que "hablan" directamente con el hardware o que realizan tareas breves que deben tener interrupciones limitadas.

Nivel de prioridad

A continuación se muestran los niveles de prioridad dentro de cada clase de prioridad:

THREAD_PRIORITY_IDLE
THREAD_PRIORITY_LOWEST
THREAD_PRIORITY_BELOW_NORMAL
THREAD_PRIORITY_NORMAL
THREAD_PRIORITY_ABOVE_NORMAL
THREAD_PRIORITY_HIGHEST
THREAD_PRIORITY_TIME_CRITICAL

Todos los subprocesos se crean mediante THREAD_PRIORITY_NORMAL. Esto significa que la prioridad del subproceso es la misma que la clase de prioridad de proceso. Después de crear un subproceso, use la función SetThreadPriority para ajustar su prioridad con respecto a otros subprocesos del proceso.

Una estrategia típica es usar THREAD_PRIORITY_ABOVE_NORMAL o THREAD_PRIORITY_HIGHEST para el subproceso de entrada del proceso, para asegurarse de que la aplicación responde al usuario. Los subprocesos en segundo plano, especialmente aquellos que consumen muchos procesadores, se pueden establecer en THREAD_PRIORITY_BELOW_NORMAL o THREAD_PRIORITY_LOWEST, para asegurarse de que se pueden adelantar cuando sea necesario. Sin embargo, si tiene un subproceso esperando a otro subproceso con una prioridad más baja para completar alguna tarea, asegúrese de bloquear la ejecución del subproceso de alta prioridad en espera. Para ello, use una función wait, una sección crítica o la función Sleep , SleepEx o SwitchToThread . Esto es preferible a que el subproceso ejecute un bucle. De lo contrario, es posible que el proceso se interbloquee, ya que el subproceso con prioridad inferior nunca está programado.

Para determinar el nivel de prioridad actual de un subproceso, use la función GetThreadPriority .

Prioridad base

La clase de prioridad de proceso y el nivel de prioridad de subproceso se combinan para formar la prioridad base de cada subproceso.

En la tabla siguiente se muestra la prioridad base para las combinaciones de la clase de prioridad de proceso y el valor de prioridad de subproceso.

Clase de prioridad de proceso Nivel de prioridad del subproceso Prioridad base
IDLE_PRIORITY_CLASS THREAD_PRIORITY_IDLE 1
THREAD_PRIORITY_LOWEST 2
THREAD_PRIORITY_BELOW_NORMAL 3
THREAD_PRIORITY_NORMAL 4
THREAD_PRIORITY_ABOVE_NORMAL 5
THREAD_PRIORITY_HIGHEST 6
THREAD_PRIORITY_TIME_CRITICAL 15
BELOW_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_IDLE 1
THREAD_PRIORITY_LOWEST 4
THREAD_PRIORITY_BELOW_NORMAL 5
THREAD_PRIORITY_NORMAL 6
THREAD_PRIORITY_ABOVE_NORMAL 7
THREAD_PRIORITY_HIGHEST 8
THREAD_PRIORITY_TIME_CRITICAL 15
NORMAL_PRIORITY_CLASS THREAD_PRIORITY_IDLE 1
THREAD_PRIORITY_LOWEST 6
THREAD_PRIORITY_BELOW_NORMAL 7
THREAD_PRIORITY_NORMAL 8
THREAD_PRIORITY_ABOVE_NORMAL 9
THREAD_PRIORITY_HIGHEST 10
THREAD_PRIORITY_TIME_CRITICAL 15
ABOVE_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_IDLE 1
THREAD_PRIORITY_LOWEST 8
THREAD_PRIORITY_BELOW_NORMAL 9
THREAD_PRIORITY_NORMAL 10
THREAD_PRIORITY_ABOVE_NORMAL 11
THREAD_PRIORITY_HIGHEST 12
THREAD_PRIORITY_TIME_CRITICAL 15
HIGH_PRIORITY_CLASS THREAD_PRIORITY_IDLE 1
THREAD_PRIORITY_LOWEST 11
THREAD_PRIORITY_BELOW_NORMAL 12
THREAD_PRIORITY_NORMAL 13
THREAD_PRIORITY_ABOVE_NORMAL 14
THREAD_PRIORITY_HIGHEST 15
THREAD_PRIORITY_TIME_CRITICAL 15
REALTIME_PRIORITY_CLASS THREAD_PRIORITY_IDLE 16
THREAD_PRIORITY_LOWEST 22
THREAD_PRIORITY_BELOW_NORMAL 23
THREAD_PRIORITY_NORMAL 24
THREAD_PRIORITY_ABOVE_NORMAL 25
THREAD_PRIORITY_HIGHEST 26
THREAD_PRIORITY_TIME_CRITICAL 31