Ir al contenido principal

Procesos lijeros: hilos o hebras


Bienvenidos de nuevo a otra entrada en nuestro querido blog StudentPlace. En fin el día de hoy hablaremos de hilos o Threads (en ingles) con lo cual complementaremos un poco las entradas pasadas Concurrencia y Secuencialidad (Sistemas Operativos) y Administración de Procesos y del Procesador, eres bienvenido a leerlas si gustas.

Entre otras cosas comencemos con la típica definición:

Hilo: Un hilo o proceso ligero es básicamente un bloque de código que puede ser ejecutado como un programa independiente, esto nos permite ejecutar varias tareas de manera simultanea dentro de nuestras aplicaciones.

Los hilos son muy importantes, pues como menciona la definición, estos nos permiten ejecutar varias acciones al mismo tiempo dentro de un mismo programa.

Pongamos un ejemplo simple, creo todos hemos usado un reproductor de música ¿no?, ya sea en nuestro teléfono o en nuestra computadora. Bueno este programa es multihilo, ¿Qué quiere decir esto?, pues simple y sencillamente que puede estar ejecutando varias tareas al mismo tiempo. Esto por que puedes tu estar reproduciendo una canción en el fondo (Hilo 1) mientras al mismo tiempo puedes estar buscando en tu biblioteca la siguiente canción a reproducir (Hilo 2).

Si el reproductor fuera monohilo, osease solo puede ejecutar una sola tarea, al momento de regresarte a la lista de canciones para buscar la siguiente canción, la música debería detenerse por completo, ¿Por qué?, simple, como en este caso es una aplicación monohilo, o reproduce la canción o visualiza el buscador para enlistar las canciones, puesto que no puede hacer dos cosas al mismo tiempo.

¿Se nota la diferencia?

La programación multihilos hoy en día es muy recurrente e importante, puesto que pasa si ¿Una pagina web no puede cargar una imagen por que fue borrada? o ¿Existe un error con la conexión a la base de datos?, simple y sencillamente la pagina no cargaría y mostraría "Error de conexión", puesto que al ser una pagina web estructurada bajo código Monohilo, hasta que no se termine de procesar todos los elementos la pagina no se mostrara, si es una aplicación de escritorio, esta sencillamente se trabara y no nos dejara hacer nada mas hasta que se carguen las imagenes. Vez la importancia de utilizarlos, si usamos varios hilos de ejecución dentro de un programa o nuestro código, podemos separar varias tareas para ejecutarse de forma independiente, de manera que si existe un error con alguno, ese error no afectara en gran medida a la aplicación, asi podemos separar un hilo para la carga del texto, otro hilo para la carga del diseño, otro para la conexión a la base de datos y otro para cargar imagenes, si sucede un error con alguno, la pagina o programa aún así podrá funcionar adecuadamente, al menos dejara al usuario trabajar cómodamente.



Ahora habiendo explicado lo anterior podemos decir lo siguiente:

Un programa puede estar constituido por varios hilos de ejecución, siendo la aplicación el hilo principal, el cual corresponde a la función main y cada subproceso una hebra del mismo. Es decir cada hebra es una parte del programa principal (el hilo principal) y cada hilo derivado de el se le conoce como hebra. 

Un hilo esta formado por varios hilos mas pequeños (Hebras)

Por decirlo de algún modo, un hilo normal, de los usados para coser prendas de vestir, esta constituido por varios hilos mas delgados y pequeños (hebras), al unir todas estas hebras tenemos al hilo original en cuestión. En cuestión un hilo es un conjunto de hilos mas pequeños, si hacemos analogía un programa multihilo es un programa formado por varios subprogramas.

En resumen la creación de un hilo es una característica que permite a una aplicación realizar varias tareas a la vez (concurrentemente). Los distintos hilos de ejecución comparten una serie de recursos tales como el espacio de memoria, los archivos abiertos, situación de autenticación, etc. Esta técnica permite simplificar el diseño de una aplicación que debe llevar a cabo distintas funciones simultáneamente.

Un hilo es simplemente una tarea que puede ser ejecutada al mismo tiempo con otra tarea.
Los hilos de ejecución que comparten los mismos recursos, sumados a estos recursos, son en conjunto conocidos como un proceso. El hecho de que los hilos de ejecución de un mismo proceso compartan los recursos hace que cualquiera de estos hilos pueda modificar éstos. Cuando un hilo modifica un dato en la memoria, los otros hilos acceden a ese dato modificado inmediatamente. 

Cada proceso ligero tiene informaciones que le son propias y que no comparte con otros procesos ligeros. Las informaciones propias se refieren fundamentalmente al contexto de ejecución, pudiéndose destacar las siguientes:
  • Contador de programa.
  • Pila.
  • Registros.
  • Estado del proceso ligero (ejecutando, listo o bloqueado).
Todos los procesos ligeros de un mismo proceso comparten la información del mismo. En concreto, comparten:
  • Espacio de memoria.
  • Variables globales.
  • Archivos abiertos.
  • Procesos hijos.
  • Temporizadores.
  • Señales y semáforos.
  • Contabilidad.

(Para no confundirnos en el siguiente párrafo mencionare como hilo a la aplicación o programa principal y a cada sub-hilo o hilo derivado como hebra para no confundir). 

De esta manera el Hilo Principal sigue en ejecución mientras al menos una de sus hebras de ejecución siga activa. Cuando el Hilo Principal finaliza, todas sus hebras de ejecución también han terminado. Asimismo en el momento en el que todas las hebras de ejecución finalizan, el Hilo Principal no existe más y todos sus recursos son liberados.

¿Diferencia entre hilo y proceso?

Ahora si sabes un poco de informática o has leído nuestros post anteriores te llegara la pregunta ¿Entonces un hilo y un proceso es lo mismo?, la respuesta es si y no. Ambos son un conjunto de instrucciones que se ejecutan con el propósito de solucionar una tarea, de esta manera podemos decir que son lo mismo pues varios sistemas operativos los manejan como si fuesen la misma cosa (casos como Linux) pero en la practica la realidad es otra, puesto que por lo general un hilo es un proceso derivado de otro ya iniciado.

Un hilo principal es lo mismo que el proceso principal, cada hilo derivado de este se le denomina subproceso o hilo.

Habiendo dicho esto podemos decir lo siguiente:

Un Proceso es un programa en ejecución, cada sub-proceso que se derive, produzca o parta del Proceso Principal (Padre) es considerado un hilo (proceso hijo) de ejecución. De esta manera, reforzamos un punto mencionado con anterioridad, puesto que mientras el Proceso Principal siga activo también sus hilos de ejecución podrán estar ejecutandose, así mismo si se termina el Proceso Principal todos sus hilos deberán terminar por consecuente.

De esta manera y juntando todo lo anterior descrito podemos encontrar otra diferencia entre hilo y proceso, la cual es:

Un proceso es una tarea independiente por lo general llevan bastante información de estados, e interactúan sólo a través de mecanismos de comunicación dados por el sistema, mientras que los hilos al ser parte de un mismo proceso, estos comparten los recursos e información directamente (todo lo que es de papá también es nuestro y por derecho podemos usarlo y compartirlo entre nosotros, seria la analogía mas fácil de entender).

Estados y transiciones de un hilo

En una de nuestras entradas anteriores vimos los estados y transiciones de los procesos, ahora tocaremos el tema para los hilos. Como hemos aclarado, un hilo es una tarea que nace de un Proceso, es decir es un proceso hijo, de esta manera un hilo posee estados similares a un proceso, veamos a que nos referimos. Aclaro antes que estos estados dependen mucho del sistema operativo y en algunos casos del lenguaje de programación (como el caso de java y su maquina virtual y de hecho usare a java para ejemplificar lo siguiente), pero dejando eso de lado podemos decir que...

Los estados de un hilo son:
  • Creado o Nuevo: Es cuando se crea el hilo pero no se ha activado.
  • Ejecución: Es cuando el hilo es activado y se pone a ejecutar sus tareas.
  • Bloqueado: el hilo se encuentra en espera de que una condición suceda para volverse a ejecutar.
  • Muerto o Terminado: Cuando se ha completado todos sus procesos y operaciones.

Como nos damos cuenta un hilo posee los mismos estados de un proceso, sin embargo elimina el estado de Listo, esto es debido a que al ser un hilo, este comparte tanto el espacio en memoria, información así como el mismo tiempo de ejecución que su Proceso padre, es decir un hilo no necesita esperar su turno para ejecutarse en el procesador puesto que este se ejecutara mientras su padre trabaje con la CPU. Es como cuando vas a una fiesta de acompañante, si vas con quien invitaron te dejan pasar, de lo contrario no podrás entrar a la fiesta.

Ahora veamos las transiciones:
  • Creación o Admitido: sucede cuando se crea un hilo.
  • Bloqueo: cuando un hilo necesita esperar para un suceso, es decir, se cumpla una condición.
  • Desbloqueo: el hilo vuelve al estado de ejecución después de cumplida la condición que lo dejo en el estado de bloqueo.
  • Terminación: cuando el hilo termina su tarea.
Como podemos ver, en este caso no hemos mencionado la transición de despacho y tiempo excedido, esto es debido a que un hilo no necesita esperar su tiempo para competir por la CPU, es su padre quien tendrá esa tarea, así mismo el tiempo excedido también dependerá del proceso padre, puesto que a forma de analogía, el niño sigue a su papá, si el no se queda en la fiesta mucho menos el niño pequeño lo hará.


Fuentes:
https://sites.google.com/site/materiasisoperativo/unidad-2-administrador-del-proceso-y-del-procesador/2-3-procesos-ligeros-hilos-o-hebras
http://administraciondeprocesos-barrueta.blogspot.com/2008/10/23-procesos-ligeros-hilos-o-hebras.html
https://chsos20141908510.wordpress.com/2014/04/30/procesos-ligeros-hilos-o-hebras/
http://florysel.blogspot.com/2012/11/23-procesos-ligeros-hilos-o-hebras.html
http://sitemasoperativosicurosemestre6.blogspot.com/2013/07/23-procesos-ligeros-hilos-o-hebras.html
http://codigoprogramacion.com/cursos/java/133-uso-de-hilos-o-threads-en-java.html#.W6fsHeXPzDc
http://arquimedes.matem.unam.mx/pasados/java_profundizacion/index6.htm
https://ed.team/blog/como-funcionan-los-hilos-en-programacion
https://webprogramacion.com/1/sistemas-operativos/procesos-e-hilos.aspxhttps://es.wikipedia.org/wiki/Hilo_(informática)
https://sistemasoper2.wordpress.com/2014/10/21/diferencias-entre-hilos-y-procesos/
https://www.monografias.com/trabajos26/estados-proceso-hilos/estados-proceso-hilos.shtml
https://sites.google.com/a/espe.edu.ec/programacion-ii/hilos/estados-de-un-hilo
http://labojava.blogspot.com/2012/10/estados-de-un-thread.html

Comentarios