BENEMERITA UNIVERSIDAD AUTONOMA DE PUEBLA FACULTAD DE CIENCIAS
BENEMERITA UNIVERSIDAD AUTONOMA DE PUEBLA FACULTAD DE CIENCIAS DE LA COMPUTACIÓN Programación Concurrente Introducción y Threads PUEBLA, PUEBLA 2006 25/02/2021 Intro Threads 1
Programación concurrente. Def. n n Es el nombre dado a las técnicas de programación para expresar el paralelismo potencial y resolver los problemas de comunicación y sincronización. La programación concurrente es importante, por que provee un mecanismo abstracto en el cual se estudia el paralelismo sin preocuparse de los detalles de la implementación. (Ben-Ari, 1982) 25/02/2021 Intro Threads 2
Programación concurrente n n Un programa secuencial tiene un solo Thread (Hilo) de control. A su ejecución se le llama un proceso. Un programa concurrente tiene múltiples threads de control. Éstos pueden ser ejecutados como procesos paralelos. 25/02/2021 Intro Threads 3
Programación concurrente, secuencial y paralela. 25/02/2021 Intro Threads 4
Ejecución de un programa concurrente n n n Un programa concurrente se puede ejecutar mediante: Multiprogramación: procesos que comparten uno o más procesadores. Multiprocesamiento: cada proceso se ejecuta en su propio procesador pero con memoria compartida. Procesamiento Distribuido : cada proceso se ejecuta en su propio procesador conectado a otros mediante una red de computadoras. 25/02/2021 Intro Threads 5
En todos los casos anteriores, los principios básicos de la programación concurrente son los mismos. 25/02/2021 Intro Threads 6
n n Los Sistemas Operativos generalmente proveen una abstracción lógica para el hardware fundamental, los programas concurrentes se basan en tales abstracciones. Así, en un nivel de programación, los programadores no distinguen entornos de hardware que contienen múltiples o un solo CPU, ellos escriben programas usando tales abstracciones lógicas como threads, procesos, recursos, etc. 25/02/2021 Intro Threads 7
25/02/2021 Intro Threads 8
¿Por qué necesitamos programas concurrente? n n n n n Mejorar la disponibilidad y eficiencia Modelar tareas, objetos autónomos, animación Paralelismo: múltiples procesadores, simultanear E/S Protección: aislar actividades en hilos de ejecución. Ejemplos: • Tareas con mucha E/S: acceso a sitios Web y bases de datos. • Interfaces gráficas de usuario: gestión de eventos • Demonios con múltiples peticiones de servicio simultáneo • Simulación 25/02/2021 Intro Threads 9
Las aplicaciones concurrentes introducen complejidad. n n n Seguridad: procesos concurrentes pueden causar conflictos con datos compartidos. Liveness: los procesos pueden morir de “inanición" si no se coordinan adecuadamente. No-determinismo: el mismo programa que se ejecuta dos veces puedes mostrar resultados diferentes. 25/02/2021 Intro Threads 10
Procesos y Threads n n Un proceso es un programa en ejecución. El sistema operativo asigna todos los recursos que necesitan tales procesos. Un thread es un Hilo de ejecución dentro de un proceso. Eso significa que un proceso puede tener varios threads ejecutándose en el ámbito de un proceso particular. 25/02/2021 Intro Threads 11
Mientras un thread tiene acceso al espacio de direcciones de memoria y recursos de su proceso, un proceso no puede acceder a variables asignadas a otros procesos. 25/02/2021 Intro Threads 12
Conclusiones de la propiedad anterior n n La comunicación entre threads creados dentro de un solo proceso es simple debido a que los threads comparten todas las variables. Así, un valor producido por un thread está inmediatamente disponible para todos los demás threads. Los threads toman memos tiempo para iniciar o detenerse debido a que usan el espacio de dirección ya asignada para el proceso corriente. 25/02/2021 Intro Threads 13
Planificación de CPU y Cambio de Contexto n n Los procesos son ejecutados por el procesador a intervalos regulares (cuantum). Cada intercambio de CPU de un proceso a otro es llamado cambio de contexto. Los valores de los registros del CPU se salvan en la tabla de procesos del proceso que se estaba ejecutando cuando ocurre una interrupción. 25/02/2021 Intro Threads 14
Que es un Thread? n n n Flujo de control diferente que puede ejecutar sus instrucciones de forma independiente. Concepto abstracto que se compone de todo lo que hace una computadora al ejecutar un programa tradicional Proceso VS Thread. Un Proceso es un código de programa en algún estado de ejecución, incluye: asignación de memoria virtual, descriptores de ficheros, ID de usuario, etc. Un Thread es una entidad ligera que tiene su propio contador de programa, otros valores de registros de CPU, tiempo de ejecución. 25/02/2021 Intro Threads 15
Estados de Hilos o Threads n n n Cuando nace el hilo espera hasta que se invoque el método start() del hilo. El hilo listo de más alta prioridad pasa al estado de ejecución. Un hilo pasa a su estado muerto cuando termina el método run() o cuando se invoca el método stop() Un hilo en ejecución pasa al estado bloqueado cuando el hilo emite una solicitud de E/S. Un hilo bloqueado no puede usar el procesador aunque este desocupado. 25/02/2021 Intro Threads 16
Ciclo de vida o estado de un Thread 25/02/2021 Intro Threads 17
Métodos de la clase Thread n n n La clase principal ejecuta el método start() de ese hilo. Start invoca el método run() Start lanza una excepción de un hilo ilegal (Illegal. Thread. State. Exception). Si el hilo que trata de echar de andar ya esta corriendo Static sleep. Se invoca con un argumento de tiempo para que duerma Static Interrupt. Devuelve true si el hilo ha sido interrumpido. Suspende la ejecución del hilo y resume reanuda la ejecución del hilo 25/02/2021 Intro Threads 18
n n n Stop. Detiene el hilo. is. Alive. Devuelve true si se ha invocado start para un hilo si todavía no se ha invocado stop. Yield. Ceder el paso dependiendo de las prioridades. set. Name. Establece el nombre del Thread. Static current. Thread. Referencia al hilo actual 25/02/2021 Intro Threads 19
Prioridad y planificación de hilos n n Todo hilo tiene una prioridad en el intervalo de Thread. MIN_PRIORITY (vale 1), Thread. MAX_PRIORITY (vale 10) y Thread. NORM_PRIORITY(vale 5) Tajadas de tempo. Cada hilo recibe un lapso de tiempo de procesador llamado cuanto. El procesador le quita el tiempo al expirar este hilo y continua con el siguiente. 25/02/2021 Intro Threads 20
n n Un proceso termina hasta que todos los hilos terminan su ejecución. Se posterga si se crean mas hilos. set. Priority. Modifica la prioridad del hilo El hilo puede llamar el método yield() para dar oportunidad de ejecutarse. 25/02/2021 Intro Threads 21
Métodos para crear Threads en Java n n n Existen 2 métodos para crear Threads 1 er Método. Los Threads se implementan como objetos que contienen un método llamado run(). Class My. Thread extends Thread{ publi. C void run(){ { //Cuerpo de ejecución Thread} } //Fin de la clase thread 25/02/2021 Intro Threads 22
2 do. Método. n n n n Utilizando la interfase Runnable Class Mythread implements Runnable{. . . public void run(){ // cuerpo de ejecución del thread } } //fin del clase 25/02/2021 Intro Threads 23
Ejemplo 1. Utilizando la clase Thread n n n n n Class My. Thread extends Thread{ public void run(){ system. Out. println(“this thread is running”); }} class My. Thread. Ex 1{ public static void main(String [] arg){ My. Thread t = new My. Thread(); t. start(); } } 25/02/2021 Intro Threads 24
Ejemplo 2. Utilizando la interfase Runnable. n n n n n Class My. Thread implements Runnable{ public void run(){ system. Out. println(“this thread is running”); }} class My. Thread. Ex 2{ public static void main(String [] arg){ Thread t = new Thread(new My. Thread()); t. start(); } } 25/02/2021 Intro Threads 25
Manipulación de un Thread n El cuerpo del método run() viene a ser el cuerpo del programa. Decimos que es la rutina main a nivel de thread. Todo lo queremos que realice el Thread debe estar dentro del método run(). Cuando finalice run(), finalizará también el thread que lo ejecutaba. 25/02/2021 Intro Threads 26
Otro ejemplo para afianzar. n n n n Class Repeticion extends Thread{ Private int repeticiones; Private String mensaje; Repeticion(String msg, int n){ mensaje=msg; repeticiones=n; } Public void run(){ For(int i= 1; i<=repeticiones; i++) system. out. println(“mensaje+” “+i); } Public static void main(String [] arg){ Repeticion r 1=new Repeticion(“Rojo”, 5); Repeticion r 2=new Repeticion(“Azul”, 15); R 1. start(); R 2. start(); } 25/02/2021 Intro Threads 27
El último ejemplo, de verdad! n n n public class Un. Hilo extends Thread{ public Un. Hilo(String str){ super(str); } public void run(){ for(int i=0; i<10; i++){ System. out. println(i+” “+get. Name()); n n n try{ sleep((long)(Math. random()*1000); }catch(Interrupted. Exception e){} } System. out. println(“Listo! “+get. Name()); } } 25/02/2021 Intro Threads 28
Continuación. n n n public class Dos. Hilos { public static void main(String [] args){ new Un. Hilo(“Me llamo thread 1”). start(); new Un. Hilo(“Yo soy el thread 2”). start(); } }//fin de Dos. Hilos 25/02/2021 Intro Threads 29
Evaluación! ¿Qué aprendieron? Qué imprime el siguiente programa con threads? 25/02/2021 Intro Threads 30
- Slides: 30