G.Bordel >Docencia >TAP Técnicas Actuales de Programación (curso 2010-2011)
desprotegido Intro. desprotegido Temario desprotegido Calendario desprotegido RPF desprotegido Recursos protegido Práctica protegido Gest. Alum.
tema_anterior Tema 10: Hilos tema_siguiente
  1. Introducción.
  2. Ciclo de vida de un hilo.
  3. Distribución de la CPU. Prioridades. El problema de la "inanición".
  4. Mecanismos de sincronización de hilos. El problema del interbloqueo.
  5. Agrupamientos de hilos.
  6. Estudio de un ejemplo de programación con hilos.[ejercicios]

10.3- Distribución de la CPU. Prioridades. El problema de la "inanición"

Es importante conocer el mecanismo de selección de hilos para su ejecución cuando trabajamos con ellos. Este mecanismo en Java tiene en cuenta las prioridades: cada hilo tiene asignado un valor de prioridad que copia del hilo que lo ha generado. Este valor puede ser cualquier entero entre 1 (Thread.MIN_PRIORITY) y 10 (Thread.MAX_PRIORITY) , siendo el valor inicial para el hilo "main" el 5 (Thread.NORM_PRIORITY). El modo de selección es el siguiente:

  • Siempre se selecciona un hilo con la máxima prioridad de los que se encuentren en la lista de candidatos a ejecución.
  • Si hay varios candidatos con el mismo máximo nivel de prioridad, estos van utilizando el procesador por orden circular

Ejemplo de asignación de tiempo de CPU a tareas con distintas prioridades..

En consecuencia podemos establecer una polititca de asignación de probabilidades que como primera aproximación puede ser la siguiente:
  • En general los procedimientos que no tengan nada de especial pueden quedar con nivel 5 de manera que participen todos ellos por igual y por turnos.
  • En caso de haber un procedimiento que requiera una actuación inmediata a un determinado evento, subirle la prioridad, pero en todo caso tener en cuenta que habrá de ser un procedimiento que consuma poco tiempo de CPU y pase a espera para que de opción de ejecución al resto de procesos con menos prioridad. (también es posible bajar la prioridad del proceso una vez que ha realizado la tarea para la cual se precisaba respuesta rápida si ha de continuar con un procesamiento menos exigente, pero este esquema puede ser poco recomendable ya que durante este tiempo no se dispone de la reacción rápida ante una nueva ocurrencia del suceso, por lo que es mejor pasar a espera y delegar en otro hilo para el resto del procesamiento).
  • Si un proceso realiza una labor "de fondo", es decir más o menos constante pero que puede ser relegada en favor de otras , bajarle la prioridad. Un ejemplo de este tipo de tarea es el recolector de basuras, que suele tener prioridad 4.

Estas prioridades pueden ser consultadas o cambiadas en tiempo de ejecución mediante los métodos getPriority y setPriority

Si el procesamiento que se lleva a cabo supone una elevada exigencia para la potencia de procesamiento disponible, una buena estructuración de la solución en hilos y una acertada distribución de sus prioridades es realmente un aspecto importante a conseguir. En tales casos, aparte de una buena solución de partida puede ser necesaria una fase de pruebas con objeto de determinar los valores más adecuados.

Una distribución inadecuada de las prioridades puede dar lugar a que algún proceso no llegue a ejecutarse nunca y en consecuencia a que la ejecución no sea correcta aún cuando no haya errores de codigo relacionados con ello. Esta situación es conocida como "inanición", y en general se habla de "inanición" no sólo cuando un proceso no dispone de CPU a lo largo del tiempo sino cuando no dispone de cualquier recurso que le resulte necesario (memoria, un periférico, etc).

Siguiente punto: 10.4- Mecanismos de sincronización de hilos. El problema del interbloqueo


Plataforma de soporte a curso y contenidos (c) German Bordel 2005.