tecnologías de programación concurrente y manejo de hilos
1. TECNOLÓGICO NACIONAL DE MÉXICO
Instituto Tecnológico de Colima
Maestría en Sistemas Computacionales
Tecnologías de Programación Web
UNIDAD II
Concurrencia de Hilos
2. Agenda
● Unidad II: Concurrencia de Hilos.
○ 2.1 Conceptos.
○ 2.2 Creación y estados de un hilo.
○ 2.3 Sincronización.
■ Secciones críticas.
■ Exclusión mutua.
■ Semáforos.
■ Barreras.
■ Tuberías.
3. Concurrencia de Hilos
● La CONCURRENCIA es el arte de hacer que una computadora haga (o parezca que
hace) múltiples cosas al mismo tiempo.
● Invita al procesador a cambiar entre diferentes tareas muchas veces por segundo, en
sistemas modernos significa que dos o más cosas se ejecuten simultáneamente en
procesadores separados.
● Concurrencia es difícil.
● Los conceptos básicos son simples, pero los bugs que pueden ocurrir son notablemente
difícil de rastrear. Sin embargo; para muchos proyectos, la concurrencia es la única
manera de obtener el desempeño que que se desea.
INTRODUCCIÓN
4. Concurrencia de Hilos
PROCESOS
● Un proceso es básicamente un programa en ejecución.
● Colección de uno o más hilos y un sistema de recursos asociados, que corresponde al
concepto de un programa en ejecución.
CONCEPTOS
5. Concurrencia de Hilos
HILO
● Unidad despachable de trabajo que incluye un contexto de procesador (que incluye
un contador de programa Y un apuntador de stack), así como su propia área de datos.
Se ejecuta de manera secuencial y puede ser interrumpible de tal manera que el
proceso puede cederle turno a otro hilo.
CONCEPTOS
6. Concurrencia de Hilos
MULTIHILO (MULTITRHEADING)
● Es una técnica en la cual un proceso, ejecutando una aplicación, es dividido en hilos
que pueden ejecutarse concurrentemente.
● Se refiere a la habilidad del SO para soportar múltiples rutas concurrentes de ejecución
dentro de un sólo proceso.
CONCEPTOS
7. Concurrencia de Hilos
● Dividiendo una sola aplicación en múltiples hilos , el desarrollador obtiene control de
modularidad de la aplicación y de los momentos de los eventos relacionados con ésta.
● Multithreading es útil para aplicaciones que realizan un número esencial de tareas
independientes.
○ Un ejemplo es un servidor de bases de datos que procesa numerosas peticiones de los
clientes.
● Existen dos enfoques, el enfoque tradicional que no es basado en multithreading y el
cual se conoce como enfoque de un sólo hilo (single thread approach) y el enfoque
basado en multithreading.
CONCEPTOS
8. Concurrencia de Hilos
CONCURRENCIA
● Concurrencia es la existencia simultánea de varios procesos en ejecución.
● Ojo concurrencia existencia simultánea (concurrencia) no implica ejecución simultánea
(paralelismo)
CONCEPTOS
10. Concurrencia de Hilos
CONCEPTOS
● En la mayoría de los casos, se crea concurrencia para que el trabajo pueda continuar
mientras el programa está esperando que ocurra la E / S.
○ Un servidor puede comenzar a procesar una nueva solicitud de red mientras espera que
lleguen los datos de una solicitud anterior.
○ Un programa interactivo puede representar una animación o realizar un cálculo mientras
espera que el usuario presione una tecla.
○ Si bien una persona puede escribir más de 500 caracteres por minuto, una computadora
puede realizar miles de millones de instrucciones por segundo.
○ Por lo tanto, puede ocurrir una gran cantidad de procesamiento entre las pulsaciones de
teclas individuales, incluso cuando se escribe rápidamente.
○ Teóricamente es posible administrar todo este cambio entre actividades dentro de su
programa, pero sería virtualmente imposible hacerlo bien.
11. Concurrencia de Hilos
● En cambio, podemos confiar en Python y el sistema operativo para que se encarguen
de la complicada parte de conmutación, mientras que creamos objetos que parecen
ejecutarse de forma independiente, pero a la vez. Estos objetos se llaman hilos; en
Python tienen una API muy simple.
CONCEPTOS
12. Concurrencia de Hilos
ESTADOS DE UN HILO
● Los hilos al igual que un proceso, tienen estados de ejecución y deben sincronizarse
con otros hilos.
● Los principales estados de un hilo son: en ejecución (running), listo (ready), y
bloqueado (blocked)
● Si un proceso es intercambiado, todos su hilos son necesariamente intercambiados, ya
que comparten el mismo espacio de direcciones que el proceso.
CREACIÓN Y ESTADOS DE UN HILO
13. Concurrencia de Hilos
● Existen cuatro operaciones básicas asociadas con el cambio de estado en un hilo:
○ Generado: Cuando se genera un proceso, un hilo para ese proceso también es generado.
○ Bloqueado: Cuando un hilo necesita esperar por un evento, éste es bloqueado. El
procesador cede el paso a otro hilo en el mismo o diferente procesos.
○ Desbloqueado: Cuando un evento para el cual el hilo fue bloqueado ocurre, el hilo se
mueve a la cola de “listo”
○ Finalizado: Cuando un hilo se completa, este registra su contexto y su pila es desasignada
CREACIÓN Y ESTADOS DE UN HILO
14. Concurrencia de Hilos
CREACIÓN DE HILOS EN PYTHON
● API threading de Python
○ https://docs.python.org/3/library/threading.html
● Lo primero que hay que hacer es importar la clase Thread del módulo threading
● Para crear un hilo en python se tiene que hacer que una clase funcione como un hilo
● Después definir un método run en la clase, la cual se ejecutará cuando se mande
llamar el método start de cualquier objeto en la clase MyThread
CREACIÓN Y ESTADOS DE UN HILO
15. Concurrencia de Hilos
● Se puede utilizar la función sleep para hacer que el hilo “duerma”, con la finalidad de
que el código no se ejecute tan rápido que no se pueda notar ningún cambio.
CREACIÓN Y ESTADOS DE UN HILO
16. Concurrencia de Hilos
● Para crear el hilo, es necesario crear algunos objetos de la clase que soporta hilos,
llamando el método start para cada objeto, ejecutando el método run de cada objeto.
● Se manda llamar el método join de cada objeto, con la finalidad de esperar hasta que el
hilo termine.
CREACIÓN Y ESTADOS DE UN HILO
17. Práctica
● Realice una práctica en python que permite ejecutar dos hilos:
● Un hilo deberá esperar por la entrada de datos desde teclado. Mientras
que, el otro hilo deberá continuar su ejecución normal y realizar el
cálculo del cuadrado de un contador que se autoincrementa dentro de un
ciclo while mientras que el hilo que está esperando por datos de teclado
está vivo.
● Deberá mostrar un mensaje que diga: “Mientras escribías el_texto se
calculó el cuadrado
CREACIÓN Y ESTADOS DE UN HILO
18. Tarea
Investigar los inconvenientes de la utilización de hilos y la solución a estos inconvenientes
y realizar un reporte de investigación máximo de 6 cuartillas por equipo, considerando los
siguientes aspectos:
● Exclusión mutua.
● Hambruna.
● Secciones críticas.
● Deadlock
● Livelock
● Condiciones de carrera
19. Concurrencia de Hilos
MEMORIA COMPARTIDA:
● Su principal problema es también su principal ventaja.
● Los hilos tienen acceso a toda la memoria y a todas las variables en programa
○ Puede causar inconsistencias en el estado del programa.
○ Ej. Cuando dos personas quieren encender al mismo tiempo la luz en un cuarto que tiene
dos apagadores.
■ Cada persona (hilo) espera que su acción encienda la lámpara (una variable) activada, pero el valor
resultante (la lámpara está apagada) es inconsistente con las expectativas.
■ Ahora imaginen si dos hilos estaban transfiriendo fondos entre cuentas bancarias o administrar el el
control de crucero en un vehículo.
PROBLEMAS CON LOS HILOS
La solución a este problema es sincronizar el acceso a
cualquier código que leao e escriba variables compartidas
20. Concurrencia de Hilos
● Existen diversas formas de realizar la sincronización.
● Ésta funcionan; sin embargo, bugs originados por un inapropiado uso de la
sincronización son realmente de rastrear debido a que el orden en que los hilos
desempeñan sus operaciones es inconsistente.
● Usualmente es más seguro forzar la comunicación entre hilo a través del uso de una
estructura de datos ligera que ya utilice bloqueos de manera adecuada. Python ofrece
la clase quueue.Queue para ésto.
● En algunos casos, estas desventajas pueden ser compensadas por la única ventaja de
permitir la memoria compartida: es rápido.
● Si múltiples hilos necesitan acceso a una gran estructura de datos, la memoria
compartida puede proporcionar este acceso rápidamente
21. Concurrencia de Hilos
● Para administrar de manera eficiente la memoria, la recolección de elementos no
utilizados y las llamadas al código de máquina en las bibliotecas, Python tiene una
utilidad llamada bloqueo de intérprete global o GIL. Es imposible desactivarlo, y
significa que los hilos son inútiles en Python por una cosa en la que sobresalen en
otros lenguajes: el procesamiento paralelo.
● El principal efecto del GIL es evitar que dos hilos funcionen al mismo tiempo, incluso
si tienen trabajo por hacer (usar CPU), por lo que está perfectamente bien que varios
hilos accedan al disco o a la red; el GIL se lanza tan pronto como el hilo comienza a
esperar algo.
● Sin embargo; En python 3 una librería de multiporcesamiento fue diseñada cuando
trabajos CPU-intensivos necesitan ejecutarse de manera paralela en múltiples núcleso
disponibles.
22. Concurrencia de Hilos
● Otra limitación de los hilos, es el costo de mantenimiento del hilo. Cada hilo toma
cierta cantidad de memoria (en el proceso y en el kernel del SO) para registrar el
estado del hilo.
● Intercambiar entre hilos también hace uso de una pequeña cantidad de tiempo de
CPU.
● La solución es reutilzar el hilo para que realice múltiples trabajos. Python proporciona
la función ThreadPool para el manejo de ésto.