Programacion Concurrente

10
 1. ¿Qué es la programaci ón conc urrente? Se conoce por programación concurrente a la rama de la informática que trata de las técnicas de programación que se usan para expresar el pa ralelismo entre tareas y pa ra resol ver los pr oblemas de comunicación y sincronización entre procesos. La concurrencia aparece cuando dos o más procesos son contemporáneos. Un caso particular es el paralelismo (programación paralela. Los procesos pueden !competir" o colaborar entre s# por los recursos del sistema. $or tanto% existen tareas de colaboración y sincronización. La programación concurrente se encarga del estudio de las nociones de e&ecución concurrente% as# como sus problemas de comunicación y sincronización. 'l principal problema de la programación concurrente corresponde a no saber en qué orden se e&ecutan los programas (en especial los programas que se comunican. Se debe tener especial cuidado en que este orden no afecte el resultado de los programas. 2. Benefc ios elocidad de e&ecución. )l subdividir un programa en procesos% éstos se pueden !repartir" entre procesadores o gestionar en un *nico procesador seg*n importancia. Soluci ón a pr oblemas de esta naturaleza. 'xisten algunos problemas cuya solución es más fácil utilizando esta metodolog#a. + Sistemas de contr ol , -apt ura de datos% aná lisis y actu acn (p.e&. sistemas de tiempo real.

description

Todo sobre programacion concurrente

Transcript of Programacion Concurrente

1. Qu es la programacin concurrente?

Se conoce por programacin concurrente a la rama de la informtica que trata de las tcnicas de programacin que se usan para expresar el paralelismo entre tareas y para resolver los problemas de comunicacin y sincronizacin entre procesos.

La concurrencia aparece cuando dos o ms procesos son contemporneos.

Un caso particular es el paralelismo (programacin paralela).

Los procesos pueden competir o colaborar entre s por los recursos del sistema. Por tanto, existen tareas de colaboracin y sincronizacin.

La programacin concurrente se encarga del estudio de las nociones de ejecucin concurrente, as como sus problemas de comunicacin y sincronizacin.

El principal problema de la programacin concurrente corresponde a no saber en qu orden se ejecutan los programas (en especial los programas que se comunican). Se debe tener especial cuidado en que este orden no afecte el resultado de los programas.

2. Beneficios

Velocidad de ejecucin. Al subdividir un programa en procesos, stos se pueden repartir entre procesadores o gestionar en un nico procesador segn importancia.

Solucin a problemas de esta naturaleza. Existen algunos problemas cuya solucin es ms fcil utilizando esta metodologa.

Sistemas de control: Captura de datos, anlisis y actuacin (p.ej. sistemas de tiempo real).

Tecnologas web: Servidores web que son capaces de atender varias peticiones concurrentemente, servidores de chat, email, etc.

Aplicaciones basabas en GUI: El usuario hace varias peticiones a la aplicacin grfica (p.ej. Navegador web).

Simulacin: Programas que modelan sistemas fsicos con autonoma.

Sistemas Gestores de Bases de Datos: Cada usuario un proceso.

3. Threads/hilos

Definicin: Una secuencia de control dentro de un proceso que ejecuta sus instrucciones de forma independiente.

Existe concurrencia a dos niveles: entre procesos y entre threads.

Procesos: entidades pesadas con espacio en el ncleo. Cambios de contexto costosos

Threads: entidades ligeras en el espacio de usuario. Cambios de contexto poco costosos.

Los threads/hilos pueden estar en dos niveles: a nivel usuario (p.ej. java) o a nivel del sistema operativo (hilos del sistema).

Los threads/hilos de sistema dan soporte a los threads/hilos de usuario mediante un API (Application Program Interface).

EstndaresCada sistema operativo implementa los threads/hilos de sistema de manera diferente: win32, OS/2 y POSIX (pthreads).

ImplementacinA nivel usuario (librera) o a nivel de ncleo (llamadas al sistema). El estndar POSIX es del primer tipo.

PlanificacinExisten procesadores lgicos (los threads compiten por cada procesador lgico), y los procesadores lgicos compiten por los fsicos (SOLARIS).

4. Threads/hilos en Java

Java proporciona un API para el uso de hilos: clase Thread dentro del paquete java.lang.Thread.

Es de gran utilidad tener un lenguaje de alto nivel para programar concurrentemente utilizando threads/hilos, de ah el potencial y la fama de Java.

Cuando arranca un programa existe un hilo principal (main), y luego se pueden generar nuevos hilos que ejecutan cdigo en objetos diferentes o el mismo.

La clase Thread dispone de una serie de mtodos para caracterizar el thread/hilo en el programa: isAlive(), isDaemon(), setName(), setDaemon(), run(), etc.

Los threads son procesos ligeros, con lnea de flujo de control propia pero que comparte el espacio de direcciones del programa.

Los threads hacen posible la ejecucin concurrente de cdigo. Los cambios de contexto son menos costosos en tiempo de ejecucin.

Un thread se crea en Java instanciando un objeto de la clase Thread.

El cdigo que ejecuta un thread est definido por el mtodo run() que tiene todo objeto que sea instancia de la clases Thread.

La ejecucin del thread se inicia cuando sobre el objeto Thread se ejecuta el mtodo start().

De forma natural, un thread termina cuando en run() se alcanza una sentencia return o el final del mtodo. (Existen otras formas de terminacin forzada)

Constructores de la Clase Thread

Thread() Thread(Runnable threadOb) Thread(Runnable threadOb, String threadName) Thread(String threadName) Thread(ThreadGroup groupOb, Runnable threadOb) Thread(ThreadGroup groupOb, Runnable threadOb, String threadName); Thread(ThreadGroup groupOb, String threadName)

Existen varios constructores de la clase Thread (y transferido por herencia a todas su extensiones).

Desde el punto de vista estructural existen dos variantes bsicas:

Las que requieren que el cdigo del mtodo run() se especifique explcitamente en la declaracin de la clase.

Por ejemplo: Thread(String threadName)

Las que requieren un parmetro de inicializancin que implemente la interfaz Runnable.

Por ejemplo: Thread(Runnable threadOb)

Los restantes constructores resultan de si se asigna un nombre la threads, y que solo afecta para inicializar ese atributo en la instancia del objeto, y pueda utilizarse para que en fases de verificacin cada thread pueda autoidentificarse, o de si se le crea dentro de un ThreadGroup, lo cual limita su accesibilidad y su capacidad de interaccin con threads que han sido creados en otros ThreadGroup.

La clase java PingPong es una extensin de la clase Threads, por lo que cada una de sus instancias (por ejemplo t1 y t2 representan un nuevo thread java.

El metodo run() es sobreescrito en la clase PingPong, y establece el cdigo que se ejecutar en cada instancia de la clase. En el ejemplo consiste en un bucle indefinido de escribir el valor del atributo word, y de suspenderse durante los milisegundos expresador en el atributo delay.

La sentencia try .. catch tiene que ser utilizada porque el mtodo sleep puede elevar una excepcin del tipo InterruptException.

Con las sentencias que declaran e instancian los dos objetos t1 y t2 de la clase PingPong se han creado dos threads. La creacin supone que a los thread se les ha dotado de los recursos que requieren, pero an estn inactivos (esto es no se est ejecutando las sentencias de su mtodo run()).

Con las sentencias que invocan los mtodos t1.start() y t2.start() de los objetos de la clase PingPong, se inicia en la ejecucin del cdigo de los respectivos procedimiento run().

En este caso (para hacer el ejemplo sencillo) los threads no finalizan nunca (observese el bucle while(true) de los mtodos run()). Se acabarn desde el entorno abortando el programa principal y todo lo que depende de l.

La segunda posibilidad de crear un thread es a travs de la utilizacin de un objeto que implemente la interface Runnable, y con el que se incorpora el mtodo run() que establece las actividades que va a realizar.

La clase MiClase implementa la interfaz Runnable, y por ello se le requiere que establezca el cdigo del mtodo abstracto run() al que obliga ser la implementacin de la interfaz Runnable.

En el programa que declara el nuevo thread, se debe declarar primero el objeto t1 de la clase MiClase, y posteriormente cuando se crea el threads (se instancia el objeto t1 de la clase Thread) se le pasa como parmetro de su constructor.

Este es el procedimiento ms habitual de crear threads en java, ya que permite herencia mltiple, al poder ser la clase Runnable extensin de cualquier otra clase que ya est definida.

La clase PingPong implementa la interfaz Runnable, y en consecuencia define el mtodo run() que constituir el cuerpo de futuros threads.

Aunque no ocurre en el ejemplo, la clase PingPong podra ser una extensin de otra clase, de la que heredara su funcionalidad y sus recursos.Cuando instancian los threads t1 y t2 (en este caso directamente de la clase Thread, aunque podra ser de cualquier otra derivada de ella), se le pasa como valor actual del parmetro Runnable threadOb del constructor, los objetos Runnables r1 y r2 de la clase PingPong que fueron previamente instanciados.

La declaracin de los objetos runnables podra ser directa dentro de la declaracin de los threads, solo que en ese caso seran annimos:

PingPong t1 = new Thread(new PingPong(ping,33));PingPong t2 = new Thread(new PingPong(PONG,100));

O incluso con los thread tambin annimos:

new Thread(new PingPong(ping,33));new Thread(new PingPong(PONG,100));

5. Mtodos de la clase Thread: Control de finalizacin.

final boolean isAlive()

Retorna true si el thread se encuentra en el estado Alive (en alguno de sus subestados), esto es, ya ha comenzado y an no ha terminado.

final void join() throws InterruptedException

Suspende el thread que invoca hasta que el thread invocado haya terminado.

final void join(long milliseconds) throws InterruptedException

Suspende el thread que invoca hasta que el thread invocado haya terminado o hasta que hayan transcurrido los milisegundos.

6. Ejecucin Concurrente y hebras

7. Estados de los Hilos

8. Ejemplo Hora

9. Ejemplo Sonido

10. Ejemplo Reloj

11. Resumen

Los programas concurrentes tienen varias hebras de ejecucin (threads) que avanzan a la vez

En Java las hebras son objetos de una clase

que extiende Thread que implementa Runnable

El mtodo run() determina qu hace la hebra Para arrancar una hebra t se hace t.start()

Una hebra termina cuando se llega al final de run() tambin por interrupciones

Un programa termina cuando terminan todas sus hebras tambin la hebra inicial que ejecuta main()