Introducción a los Hilos III

Pegado a la parte dos viene esta parte 3, que no daba para estar en el mismo post, sino separados.

Hilos

A falta de una definición más formal, un hilo se puede definir como la traza de ejecución de un proceso. Esto se refiere a la parte dinámica del proceso, la ejecución del código representada por la pila del usuario y la parte del bloque de control del proceso que hace referencia al estado del procesador y del proceso, frente a la parte mas estática, co­mo es la el resto del bloque de control del proceso y el código mismo.

La aparición de los hilos viene justificada desde dos pilares básicos: facilitar la sincronización entre procesos y mejorar la eficiencia en la alternancia de procesos en el procesador. A continuación se van a desarrollar esas ideas.

En esta sección vamos a presentar el concepto de sistemas mul­tihilo, justificando la aparición de los hilos, presentando sus ventajas frente a la idea clásica de proceso y analizando las implicaciones que tienen en la forma de representar los procesos en el sistema, también se presentaran los estados de los hilos y por último se analizaran las distintas formas de implementar los hilos.

 


Sistemas Multihilo

El termino multihilo hace referencia a la capacidad de un sistema operativo para mantener varios hilos de ejecución. Tras la aparición de los hilos se puede considerar que en el enfoque tradicional solo existe un hilo de ejecución por proceso, por lo que puede ser llamado monohilo.

En la Figura 4 se pueden observar las combinaciones posibles en­tre procesos e hilos. Dentro de la categoría de los sistemas monoproceso y monohilo se puede encuadrar al sistema MS-DOS. Los sistemas UNIX genéricos se pueden definir como sistemas multiproceso con un único hilo por proceso. Dentro de los sistemas monoproceso multihilo se puede incluir a las maquinas virtuales Java. Los sistemas operativos más modernos se agrupan dentro de la categoría de multiproceso multihilo (W2000 y Solaris entre otros).

Figura 5

En un entorno multihilo un proceso se define como la unidad de protección y unidad de asignación de recursos con los siguientes elementos asociados con ellos:

  • Un espacio de direcciones virtuales con la imagen del proceso.
  • Acceso protegido a los procesadores, a otros procesos, archivos y dispositivos de E/S.

Un proceso puede tener uno o más hilos, cada uno con:

  • El estado de ejecución del hilo.
  • El contexto del procesador que se salva cuando el hilo no está en ejecución.
  • Una pila de ejecución de usuario (y otra para el núcleo cuando sea preciso).
  • Almacenamiento estático para las variables locales.
  • Acceso a la memoria y a los recursos del proceso, que son compartidos con todos los otros hilos del proceso.

Todo esto se puede ver en la Figura 5, donde se puede ver las diferencias entre la representación de procesos monohilos y multihilos.

En un sistema multihilo continúa existiendo un solo bloque de control de proceso y un espacio de direcciones de usuario asociado al proceso, pero ahora hay pilas separadas para cada hilo, así como distintos bloques de control para cada hilo, que contienen los valores de los registros, prioridad y otras informaciones relativas al estado de los hilos.

Así pues, todos los hilos de un proceso comparten el estado y los recursos del proceso, residen en el mismo espacio de direcciones y tienen acceso a los mismos datos. Por todo esto, es fácil ver que la utilización de hilos produce una mejora en las posibilidades de sincronización de procesos, además de una mejora en el rendimiento. Las ventajas que se derivan de la utilización de los hilos son las siguientes:

 

  1. Respuesta: Una aplicación multihilo puede continuar ejecutándose incluso si una parte de ella está bloqueada o está realizando una tarea larga, incrementando de este modo el nivel de respuesta frente al usuario.
  2. Compartición de recursos: Los hilos por defecto comparten la memoria y otros recursos del proceso al que pertenecen por lo que no hay que utilizar ningún mecanismo especial de compartición entre procesos. Esto permite que la aplicación pueda tener distintos hilos de ejecución con la misma memoria. Además los hi­los aumentan la eficiencia de al comunicación entre programas en ejecución ya que pueden comunicarse sin la intervención del núcleo del sistema operativo.
  3. Economía: Reservar memoria y recursos en la creación de los pro­cesos es una tarea costosa. Como los hilos comparten los recur­sos del proceso al que pertenecen, resulta más económico crear hilos nuevos y alternarlos en el procesador que hacer lo mismo con procesos. Aunque no existen medidas empíricas definitivas, en Solaris crear un proceso es unas 30 veces más lento que crear un hilo, y realizar un cambio de contexto entre procesos es 5 ve­ces más lento que hacerlo entre hilos.
  4. Utilización de arquitecturas multiprocesador: Los procesos multihi­lo pueden aprovechar fácilmente una arquitectura multiproce­sador ya que cada hilo podría ejecutarse en un procesador distinto.

Para ilustrar las ventajas de los sistemas multihilo frente a los monohilo, se puede analizar el caso mostrado en la Figura 6. En este ejemplo se considera dos versiones del mismo programa que tiene que realizar dos invocaciones a procedimientos remotos en dos servidores diferentes; en el primer caso sobre un entorno monohilo, y en un entorno multihilo en el segundo caso. Es fácil observar que en el segundo caso se puede obtener una importante mejora en el tiempo empleado para ello si cada RPC es realizada desde un hilo diferente. Esta ventaja también resulta evidente aunque el proceso se ejecute en un entorno monoprocesador, lo que implica que aunque las solicitu­des deben generarse secuencialmente, la espera se realiza en paralelo.

 


Estados de un Hilo

Los principales estados de un hilo son Ejecución, Listo y Bloqueado. En general no tiene sentido considerar que los hilos se encuentran sus- pendidos, ya que eso pertenece al concepto de proceso. La planificación se lleva a cabo con los hilos, por lo que la mayor parte de la información sobre el estado de ejecución se mantiene en las estructuras de datos de los hilos. Existen varias acciones que afectan a todos los hilos de un proceso, como por ejemplo la suspensión de un proceso, ya que implica la descarga de todo el espacio de direcciones del proceso. Así, todos los hilos de un proceso deben pasar al estado de suspendidos al mismo tiempo. De igual modo, la terminación del proceso implica la terminación de todos los hilos de dicho proceso. Los estados de un hilo se pueden ver en la Figura 7.

Hay cuatro operaciones básicas relacionadas con el cambio de es­tado de los hilos:

  • Creación: cuando se crea un nuevo proceso normalmente también se crea un hilo para ese proceso, aunque posteriormente un hilo de un proceso puede crear otros hilos dentro del mismo proceso. El nuevo hilo tendrá su propio contexto y su propio espacio de pila, pasando a la cola de listos.
  • Bloqueo: cuando un hilo necesita esperar por un suceso se bloquea (salvando sus registros de usuario, el contador de programa y los punteros de pila). El procesador podrá pasar a ejecutar otro hilo que esté listo.
  • Desbloqueo: cuando se produce el suceso por el que el hilo se bloqueo el hilo pasa a la cola de listos.
  • Terminación: cuando un hilo finaliza se libera su contexto y sus pilas.

 


Hilos a Nivel de Usuario y de Núcleo

Existen dos grandes categorías para la implementación de los hilos: hilos a nivel de usuario (HU) e hilos a nivel del núcleo (HN).

 


Hilos a Nivel de Usuario

En una aplicación HU pura, todo el trabajo de gestión de hilos lo rea- liza la aplicación mientras que el núcleo no es consciente de ello. Resulta posible programar cualquier aplicación como multihilo median- te una biblioteca de hilos. Esta contiene el código para crear, destruir y sincronizar hilos, para intercambiar mensajes y datos entre hilos y para planificar la ejecución de los hilos salvando y restaurando el con- texto de los mismos. Ejemplos de bibliotecas de hilos pueden ser la MV Java, POSIX Pthreads, Mach C-threads y Solaris threads y Win32.

Desde el punto de vista del núcleo, la aplicación se ejecuta bajo la forma de un solo proceso, pero la biblioteca de hilos crea y planifica los hilos en el tiempo de ejecución que le toque al proceso subyacente (Figura 8).

 

Las ventajas de utilizar HU en lugar de HN son las siguientes:

  1. El intercambio entre dos hilos no necesita los privilegios del núcleo, lo que evita la sobrecarga de los cambios de modo de ejecución.
  2. Se puede realizar una planificación a medida de la aplicación sin afectar a la planificación subyacente del sistema operativo.
  3. Los HU se pueden ejecutar sobre cualquier sistema operativo.

También existen desventajas:

  1. Como la mayoría de las llamadas al sistema producen bloqueo en el proceso que las invoca, la llamada al sistema de un hilo puede bloquear a todos los demás hilos del proceso (Figura 9 e).
  2. No puede aprovechar las ventajas de un entorno multiprocesador, ya que el proceso está asignado a un único procesador.

Existen formas de intentar eliminar estas desventajas. Se puede escribir la aplicación como varios procesos en lugar de múltiples hilos, pero entonces perdemos las ventajas de los hilos relativas a la eficiencia.

La otra técnica es la llamada recubrimiento, donde las llamadas bloqueadoras van precedidas por otras no bloqueadoras. Por ejemplo, antes de que un hilo llame directamente a una operación de E/S, otro hilo llama a una función de recubrimiento que comprueba si el dispositivo de E/S se encuentra ocupado o libre antes de realizar la llamada al sistema.

 


Hilos a Nivel de Nucleo

En una aplicación con hilos a nivel de núcleo todo el trabajo de gestión de hilos lo realiza el núcleo. Un ejemplo de este caso es el sistema operativo W2000.

El núcleo mantiene la información de contexto del proceso como un todo y la de cada hilo dentro del proceso. El núcleo realiza la planificación en función de los hilos. Esto soluciona los principales inconvenientes de la implementación HU. Se pueden planificar simultáneamente múltiples hilos del mismo proceso en un entorno multiprocesador. Además, si se bloquea un hilo del proceso los demás siguen pudiendo ejecutarse. Otra ventaja es que las mismas funciones del núcleo pueden ser multihilo.

La principal desventaja es que el paso del control de un hilo a otro dentro del mismo proceso necesita un cambio de modo de ejecución a modo núcleo. Eso sugiere que aunque el enfoque HN sea más rápido que el basado en monohilo, todavía resulte más lento que el HU.

  • Combinaciones

Algunos sistemas operativos como Solaris combinan los enfoques HU y HN. En este tipo de sistemas la creación de hilos así como la mayor parte de la planificación y sincronización de los hilos de una aplicación se realiza en el espacio del usuario. Los múltiples HU se pue­den asociar con varios HN a través de los llamados procesos ligeros o lightweight process (LWP). Así, los hilos de una aplicación se pueden ejecutar en paralelo en un entorno multiprocesador, y las llamadas al sistema bloqueadoras no bloquearan todo el proceso.

Con una buena configuración entre HU y HN, este enfoque puede combinar las ventajas de ambos modos minimizando sus inconve­nientes.

  • Relaciones Proceso:Hilo

Como hemos visto, la conceptualización clásica de los procesos asocia un hilo a un proceso, relación 1 : 1 (aunque el hilo se encuentre implícito en el concepto del proceso). En los sistemas multihilo se da una relación n : 1 entre hilos y procesos. Pero se pueden dar más combinaciones entre hilos y procesos. El caso 1 : m representa aquellos casos en los que la actividad de un hilo se puede llevar a cabo en varios procesos, lo que implicara la existencia de un hilo que pueda moverse entre procesos. El caso más extremo (y experimental) es el n : m donde varios procesos soportan la ejecución de varios hilos, y estos pueden moverse entre los procesos. Todos estos casos están resumidos en la Tabla 1.

 


 

— Seguimos la Próxima —

Dejá un comentario