sábado, 14 de julio de 2012

5.1.1. ¿Qué son los hilos?


¿Qué son los hilos?
Primero definamos hilo, es un proceso de ejecución también llamado proceso liviano como contraparte a multiproceso que usa programas que se denominan procesos pesados, un hilo es un flujo secuencial de instrucciones pero que está dentro de un programa, no es un programa independiente, es decir, un hilo forma parte de un programa.
  •  Contexto de ejecución, proceso liviano (lightweight).
  •  Un flujo secuencial de instrucciones dentro de un programa .

Multiproceso vs Multihilos

Como mencionamos un hilo es un proceso liviano, para entender esto necesitamos hacer la separación en lo que es multiproceso y lo que es multihilo.
En multiproceso tenemos dos o más programas independientes que se ejecutan en forma paralela esta ejecución paralela no es tal, en el caso de que tengamos un procesador en una máquina, como todos sabemos es imposible tener ejecución paralela, pero para el usuario se puede ver como una ejecución en paralelo, además en multiproceso, cada programa tiene su propio espacio de memoria, su propio conjunto de variables, sus propios recursos, el control para ver que programa se está ejecutando en determinado momento lo tiene el sistema operativo, el programador no tiene ninguna ingerencia al respecto.
En programación multihilo, que lo podemos definir como dos o más tareas ejecutándose en forma paralela dentro de un programa, estas tareas comparten los recursos del programa es decir las variables definidas para el programa son compartidas por las dos o más tareas que se están ejecutando,  esto trae una responsabilidad para el programador por que el control para el acceso de recursos, lo tiene el programa y esto es un punto delicado que veremos más adelante. Así es que debe de quedar claro lo que es programación multiproceso y programación multihilo, la programación multihilo deja más responsabilidad al programador y tenemos que saber ciertas cosas para que se realice en forma adecuada.
  •  Multiproceso:
     - Dos o más programas (procesos)  
    independientes ejecución en forma "paralela".
     - Cada proceso tiene su propio espacio de  memoria, su propio conjunto de variables, su propia pila, etc.
     
    - El control lo tiene el sistema operativo.
  •  Multihilo:
     - Dos o más "tareas" ejecutándose en forma  "paralela" dentro de un programa.
     - 
    Comparten los recursos del programa.
     - El control lo tiene el programa.
En la figura, puedes ver un programa que tiene dos hilos ejecutándose en forma simultánea, como puedes ver, los hilos son parte del programa y ambos tienen acceso a los recursos del programa porque forman parte de este y no tienen al sistema operativo que controle este acceso, así es que es responsabilidad del programador controlar el acceso a estos recursos para que no se incurra en un estado inestable del programa como un todo.
Java, tiene el soporte natural para la programación multihilos, de hecho la máquina virtual de Java está programada en multihilos, lo que es el método main de un programa o el recolector de basura o las actualizaciones de pantalla, todas corren en su propio hilo, además de los hilos que tu crees y pongas a ejecutar, y repetiremos nuevamente el concepto de que en multiproceso cada programa es independiente y en multihilo no, en multihilo el programador tiene la responsabilidad de controlar el acceso a los recursos del programa, esto lo estamos repitiendo porque es tremendamente importante para evitar caer en problemas conocidos como deadlock y starvation 
Antes de comenzar a programar hilos, es conveniente saber el por qué utilizarlos, una de las cosas principales es que puedes dejar ejecutando tareas en el fondo obackground como se les dice, esto te permite una programación múltiple más eficiente, es decir mientras realizas cuestiones lentas o que requieren entradas del usuario puedes poner a ejecutar alguna otra tarea; otra de las cosas es que evitas el bloqueo de un programa, esto es cuando un programa accesa a disco para leer un archivo relativamente grande, todos sabemos que el programa detiene su ejecución y se espera para que se termine la lectura de disco, lo que se puede hacer es mandar a ejecutar dicha lectura en un hilo y puedes continuar con tu programa, puedes hacer programas mucho más adecuados desde el punto de vista de servicio al usuario ya que cuando haces tareas que se tardan puedes realizar el despliegue de una barra de progreso, esto implica que estás realizando dos tareas; uno, la tarea tardada y la otra el despliegue de una barra de progreso que muy probablemente sea una animación.
Además se dice, y es verdad, la programación es mucho más estructurada y se ve mucho más elegante y si aprendes bien los procesos multihilo en Java, la programación va a ser más fácil. Y por último para aquellos que quieran utilizar animaciones, el uso de hilos es imprescindible ¿por qué?, porque por un lado quieres desplegar animación y por otro lado quieres procesar la entrada de algún usuario o estar haciendo otra cosa, en ese momento necesitas dos o más hilos ejecutándose simultáneamente en tu programa.

No hay comentarios:

Publicar un comentario en la entrada