Java: Programación Multithread

Tamaño: px
Comenzar la demostración a partir de la página:

Download "Java: Programación Multithread"

Transcripción

1 Qué es un thread? Java: Programación Multithread Hasta el momento hemos desarrollado programas secuenciales con un único thread: en cualquier instante durante la ejecución de un programa hay un único punto de ejecución. Franco Guidi Polanco Escuela de Ingeniería Industrial Pontificia Universidad Católica de Valparaíso, Chile Un programa Un thread 2 Qué es un thread? (cont.) Un thread es un flujo secuencial de control dentro de un programa Un programa puede tener más de un thread ejecutándose al mismo tiempo Ejemplo Una aplicación que posee un thread que saluda y otro que se despide: Un programa Dos threads for(int i = 1; i<100;i++) for(int i = 1; i<100;i++) Un programa System.out.printl( Hola + i ); System.out.printl( Chao + i ); Dos threads 3 4

2 Ejemplo (cont.) Creación de múltiples threads en Java Output posible: Hola 1 Hola 2 Chao 1 Hola 3 Chao 2 Chao 3 Hola 4 Los threads en Java se implementan por medio de la clase java.lang.thread. Existen dos formas de crear threads en Java: Extendiendo la clase java.lang.thread Implementando la interfaz java.lang.runnable 5 6 Creación de threads extendiendo la clase java.lang.thread El thread debe ser una clase que extiende la clase Thread Se debe sobreescribir el método run() con el código que deberá ser ejecutado por el thread. El thread debe ser lanzado invocando el método start() del objeto (heredado de la clase Thread) Creación de threads extendiendo la clase java.lang.thread: ejemplo 1 Dos ejemplos de clases que extienden Thread: public class Hola extends Thread { for (int i=1;i<100;i++) System.out.println( "Hola" + i ); public class Chao extends Thread { for (int i=1;i<100;i++) System.out.println( "Chao" + i ); 7 8

3 Creación de threads extendiendo la clase java.lang.thread: ejemplo 1 (cont.) Qué ocurre en este ejemplo? La aplicación que lanza los threads: public class EjemploThreadSimple { Hola h = new Hola(); Chao c = new Chao(); h.start(); c.start(); System.out.println( Fin programa ); Notar que para lanzar un nuevo thread se debe invocar el método start(). La simple invocación del método run()produce sólo su ejecución en el thread actual (como cualquier otro método). Hola h = new Hola(); Chao c = new Chao(); h.start(); c.start(); System.out.println( Fin programa ); Thread Chao Thread main h.start(); c.start(); Thread Hola 9 10 Ejecución del ejemplo 1 NOTA: Ejecución en JVM sobre Windows XP. El resultado puede ser distinto en otras plataformas (se estudiará más adelante) Estos dos programas funcionan de igual modo Si las referencias a los threads no son necesarias public class EjemploThreadSimple { Hola h = new Hola(); Chao c = new Chao(); h.start(); c.start(); System.out.println( Fin programa ); public class EjemploThreadSimple { new Hola().start(); new Chao().start(); System.out.println( Fin programa ); 11 12

4 Creación de threads implementando la interfaz java.lang.runnable La clase que contiene el proceso que será lanzado dentro de un nuevo thread debe implementar la interfaz java.lang.runnable Particularmente se debe implementar en la clase el método run() declarado en Runnable, con el código que deberá ser ejecutado por el thread Para lanzar el thread se debe crear una instancia de java.lang.thread, pasando al constructor de éste una referencia al objeto que implementa Runnable, y luego se debe invocar el método start() del objeto Thread Creación de threads implementando la interfaz java.lang.runnable (cont.) Clase que implementa el código del thread: public class MiThread implements Runnable { // código del thread Instanciación y lanzamiento del thread: Thread t = new Thread( new MiThread() ); t.start(); Creación de threads implementando la interfaz java.lang.runnable: ejemplo 2 Dos ejemplos de clases que implementan Runnable: public class Hola implements Runnable { for (int i=1;i<100;i++) System.out.println( "Hola" + i ); public class Chao implements Runnable { for (int i=1;i<100;i++) System.out.println( "Chao" + i ); 15 Creación de threads implementando la interfaz java.lang.runnable: ejemplo 2 (cont.) La aplicación que lanza los threads: public class EjemploThreadSimple { Thread h = new Thread( new Hola() ); Thread c = new Thread( new Chao() ); h.start(); c.start(); System.out.println( Fin programa ); Notar que para lanzar un nuevo thread se debe crear una instancia de Thread pasando al constructor una referencia a un objeto Runnable, e invocar el método start() sobre Thread. La simple invocación del método run() produce sólo su ejecución en el thread actual (como cualquier otro método). 16

5 (Nuevamente) si las referencias a los threads no son necesarias Ejercicio Estos dos programas funcionan de igual modo public class EjemploThreadSimple { Thread h = new Thread( new Hola() ); Thread c = new Thread( new Chao() ); h.start(); c.start(); System.out.println( Fin programa ); public class EjemploThreadSimple { new Thread( new Hola() ).start(); new Thread( new Chao() ).start(); System.out.println( Fin programa ); Cree un programa similar al ejemplo anterior que, en vez de usar clases distintas para manejar los threads correspondientes a los diferentes mensajes ( Hola, Chao ), utilice dos thread de una misma clase (cuyo mensaje sea configurable). Haga una implementación del thread extendiendo la clase Thread y otra implementando Runnable. Haga la aplicación que lance los threads Solución Versión que extiende Thread: public class Habla extends Thread { String mensaje; public Habla(String msg){ mensaje = msg; for (int i=1;i<100;i++) System.out.println( mensaje + i ); public class Ejercicio { Habla h = new Habla( Hola ) ; Habla c = new Habla( Chao ); h.start(); c.start(); 19 Solución (cont.) Versión que implementa Runnable: public class Habla implements Runnable { String mensaje; public Habla(String msg){ mensaje = msg; for (int i=1;i<100;i++) System.out.println( mensaje + i ); public class Ejercicio { Thread h = new Thread( new Habla( Hola ) ) ; Thread c = new Thread( new Habla( Chao ) ); h.start(); c.start(); 20

6 Métodos útiles de la clase Thread: sleep Métodos útiles de la clase Thread: sleep Ejemplo Detiene la ejecución del thread actual por la cantidad de milisegundos indicada como parámetro. public static void sleep(long millis) throws InterruptedException Ejemplo: public class MyThread extends Thread { try{ sleep( 1000 ); catch(interruptedexception e){ //Interrupción Equivalente: Thread.sleep( 1000 ); NOTA: Si en vez de extender Thread se hubiese implementado Runnable, entonces aquí hubiese sido necesaria la referencia a la clase Thread para invocar el método sleep(). public class Hola extends Thread { for (int i=1;i<10;i++){ System.out.println( "Hola" + i ); try{ Thread.sleep( 1000 ); catch(interruptedexception e){ public class Chao extends Thread { for (int i=1;i<10;i++){ System.out.println( "Chao" + i ); try{ sleep( (long) ( Math.random() * 1000) ); catch (InterruptedException e){ Detención de 1000 ms (1 segundo) Tiempo de detención al azar Métodos útiles de la clase Thread: sleep Ejemplo Métodos útiles de la clase Thread: yield Detiene la ejecución del thread actual y permite a otros threads ser ejecutados public static void yield() Ejemplo: public class MyThread extends Thread { yield(); Equivalente: Thread.yield(); NOTA: Si en vez de extender Thread se hubiese implementado Runnable, entonces aquí hubiese sido necesaria la referencia a la clase Thread para invocar el método yield()

7 Métodos útiles de la clase Thread: yield (Ejemplo) Métodos útiles de la clase Thread: yield (Ejemplo) public class Hola extends Thread { for (int i=1;i<10;i++){ System.out.println( "Hola" + i ); Thread.yield(); public class Chao extends Thread { for (int i=1;i<10;i++){ System.out.println( "Chao" + i ); yield(); Ciclo de vida de un thread Ciclo de vida de un thread (cont.) Nuevo thread (New Thread) start Ejecutándose (Running) yield Ejecutable (Runnable) sleep wait bloqueado en I/O No ejecutable (Not Runnable) Inicio de un thread - el thread se ha creado ( Nuevo thread ) y se invoca el método start. El thread pasa al estado ejecutable. Transición del estado ejecutable al estado no ejecutable - ocurre por uno de estos tres motivos: El thread invoca el método sleep El thread invoca el método wait (*) El thread se bloquea en una operación de I/O finaliza el método run Muerto (Dead) Tomado de The Java Tutorial Sun Microsystems (*) será estudiado más adelante 27 28

8 Ciclo de vida de un thread (cont.) Transición del estado no ejecutable a ejecutable : si el thread había invocado el método sleep, el número de milisegundos de pausa ha transcurrido si el thread había invocado el método wait de un objeto, otro thread lo notifica de continuar por llamando al método notify o al método notifyall del mismo objeto (*) si el thread estaba bloqueado en operación de I/O, la operación se ha completado (*) serán estudiados más adelante Ciclo de vida de un thread (cont.) Transición del estado ejecutable al estado muerto : ocurre cuando el método run llega a su fin. El método isalive ayuda a conocer el estado de un thread: Retorna true si el thread ha sido lanzado (método start invocado) y no detenido Retorna false si el thread está en el estado Nuevo thread (no ha sido lanzado) o está muerto (método run terminado) Paralelismo Ejecución de threads En un sistema con múltiples CPU, cada CPU podría ejecutar un thread distinto Concurrencia Si no es posible el paralelismo, una CPU es responsable de ejecutar múltiples threads Thread A Thread A Thread A Thread B Thread B Thread B Thread A Thread B Thread A Prioridades de los threads La ejecución de múltiples threads en una sola CPU requiere la determinación de una secuencia de ejecución ( scheduling ) Java soporta un algoritmo de secuenciación de threads simple denominado fixed priority scheduling Este algoritmo secuencia la ejecución de threads en base a la prioridad relativa que les ha sido asignada CPU CPU CPU 31 32

9 Prioridades de los threads (cont.) Cuando se crea un nuevo thread, su prioridad relativa es la misma que la del thread que lo creó La prioridad de un thread puede ser cambiada en cualquier momento por medio del método setpriority. Este método recibe un entero que indica el valor de prioridad (valores más altos indican más altas prioridades) La clase Thread declara tres constantes: public static final int MAX_PRIORITY 10 public static final int MIN_PRIORITY 1 public static final int NORM_PRIORITY 5 El fixed priority scheduling de Java Entre todos los threads en estado ejecutable es escogido el thread con la prioridad más alta Si hay dos threads con la misma prioridad, es escogido uno de ellos en modo round-robin Cuando el thread en ejecución pasa al estado no ejecutable o muerto otro thread es seleccionado para su ejecución. La ejecución de un thread es interrumpida si otro thread con más alta prioridad se vuelve ejecutable Threads y la portabilidad de Java: debilidades La responsabilidad de ejecución de los threads es pasada al sistema operativo Pero distintos sistemas operativos manejan los threads en distinta forma: por ejemplo NT y Solaris tienen diferentes niveles de prioridades (incluso diferentes respecto los que define Java) Threads y la portabilidad de Java: debilidades (cont.) La cosa puede ser peor aun: existen sistemas operativos que implementan time slicing (subdivisión de tiempo): el sistema operativo asigna una porción de tiempo a la ejecución de cada thread. En este caso la ejecución de un thread es interrumpida no sólo si otro thread con más alta prioridad se vuelve ejecutable, sino también cuando su tiempo asignado de ejecución se acaba. (no todos los sistemas operativos implementan time slicing) 35 36

10 Threads egoístas Si un sistema operativo no implementa time slicing, y si el thread no sale del estado ejecutable, este continuará su ejecución hasta que muera. Mientras tanto, ningún otro thread podrá ser ejecutado. Volvamos el ejemplo inicial: public class Habla extends Thread { String mensaje; public Habla(String msg){ mensaje = msg; for (int i=1;i<100;i++) System.out.println( mensaje + i ); En un sistema sin time slicing, este se vuelve un thread egoísta. 37 Threads egoístas (cont.) Por lo tanto el siguiente programa ejecutará: ambos threads contemporáneamente en un sistema con time slicing (véase su ejecución en ejemplos anteriores) sólo el thread que imprime Hola hasta terminar las 99 impresiones, y luego el thread que imprime Chao, en un sistema que no soporta time slicing public class Ejercicio { Habla h = new Habla( Hola ) ; Habla c = new Habla( Chao ); h.start(); c.start(); 38 Moraleja sobre el egoísmo y los threads No se debe asumir que la ejecución de una aplicación se hará siempre en un sistema que soporta time slicing. Por lo tanto, se debe incluir adecuadamente invocaciones a los métodos yield, sleep y wait, si los threads no se bloquean en operaciones de I/O. public class Habla extends Thread { String mensaje; public Habla(String msg){ mensaje = msg; for (int i=1;i<100;i++){ System.out.println( mensaje + i ); yield(); Acceso a datos compartidos Es común que dos o más threads tengan acceso a objetos en común Ejemplo Supongamos una aplicación con dos threads que actualizan un objeto compartido, de la clase Historial: public class Historial { String[] mensajes = new String[1000]; int pos = 0; public void agregar(string msg) { mensaje[pos] = msg; 39 40

11 Acceso a datos compartidos (cont.) Acceso a datos compartidos (cont.) public class Habla extends Thread { String mensaje; Historial historial; public Habla(String msg, Historial h){ mensaje = msg; historial = h; for (int i=1;i<100;i++){ historial.agregar( mensaje ); yield(); Se espera que ocurra lo siguiente: Thread Hola mensaje[pos]=msg; mensaje[0]= Hola pos = 1 Thread Chao mensaje[pos]=msg; mensaje[1]= Chao pos = 2 public class Ejercicio { Historial historial = new Historial(); Habla h = new Habla( Hola, historial ) ; Habla c = new Habla( Chao, historial ); h.start(); c.start(); mensaje[pos]=msg; mensaje[2]= Hola pos = 3 mensaje[pos]=msg; mensaje[3]= Chao pos = Acceso a datos compartidos (cont.) Pero podría ocurrir lo siguiente: Thread Hola mensaje[pos]=msg; pos = 2 mensaje[pos]=msg; mensaje[pos]=msg; pos = 5 mensaje[0]= Hola mensaje[2]= Hola pos = 3 mensaje[3]= Hola Thread Chao mensaje[pos]=msg; mensaje[pos]=msg; pos = 4 mensaje[0]= Chao pos = 1 mensaje[3]= Chao Bloqueo del objetos compartidos La sincronización para el acceso a objetos compartidos se basa en el concepto de monitor, desarrollado por C.A.R. Hoare. Un monitor es una porción de código protegida por un mutex ( mutual exclusion semaphore ). Sólo un thread puede tener el mutex de un objeto en un momento dado. Si un segundo thread trata de obtener un mutex ya adquirido por otro thread, se bloquea hasta que el primero libere el mutex. Al momento de liberarse un mutex, todos los threads en espera de él se despertarán ; en base a algún criterio (orden de prioridad, FIFO, etc.) el mutex será dado a uno de ellos

12 Bloqueo del objetos compartidos: analogía Un edificio en el cual algunas oficinas tienen llave y otras tiene libre acceso. El monitor es el conjunto de oficinas cuyo acceso requiere la llave. Los threads son las personas que quieren acceder a las oficinas. Para entrar a una oficina con llave, una persona tiene que obtener el manojo con las llaves de la oficina. El manojo con las llaves es el mutex del edificio: solo la persona que tiene el manojo puede ingresar a las oficinas con llave. Las otras son de libre acceso. Objeto Threads Mutex Bloqueo del objetos compartidos: métodos synchronized En Java el bloqueo de un objeto ocurre cuando un thread entra a un método declarado como synchronized (de un objeto compartido). Ejemplo: public class Historial { public synchronized void agregar(string msg) { mensaje[pos] = msg; Al momento de entrar a un método synchronized de un objeto compartido, un thread se encontrará con una de las siguientes situaciones: Mutex libre: el thread tomará el mutex, ejecutará el método y lo liberará sólo al momento de terminar la ejecución de dicho método. Mutex tomado por otro thread: el thread se bloqueará en espera de que el primero lo libere Bloqueo del objetos compartidos: métodos synchronized (cont.) Consecuencia: sólo un thread a la vez podrá ejecutar un método synchronized sobre un objeto. Al interrumpirse la ejecución de un thread que accede a un método synchronized, el paso se dará a otro thread que no requiera el mutex sobre tal objeto (i.e. que no esté solicitando la ejecución de cualquiera de sus métodos synchronized). Una vez liberado el mutex, los threads bloquados en espera de él se vuelven ejecutables. Objeto Bloqueo del objetos compartidos: métodos synchronized (cont.) En el caso de nuestro ejemplo, mientras un thread se encuentra ejecutando el método agregar, ningún otro thread puede ejecutar dicho método (pues la ejecución de agregar requiere el mutex del objeto historial). Thread Hola mutex Thread Chao historial.agregar() mensaje[pos]=msg; historial historial.agregar() 47 48

13 Bloqueo del objetos compartidos: métodos synchronized (cont.) La invocación a sleep dentro de un thread no libera el mutex de los objetos que eventualmente pudiera tener en su poder. Métodos synchronized: ejemplo En el ejemplo de la clase Historial, el método agregar requiere ser synchronized, en cambio getcapacidad no lo requiere: Objeto Z z z z public class Historial { String[] mensajes = new String[1000]; int pos = 0; public synchronized void agregar(string msg) { mensaje[pos] = msg; public int getcapacidad(){ return mensajes.length; Métodos synchronized En la clase Historial, el método que retorna el número de elementos ingresados al arreglo debe ser synchronized? public class Historial { String[] mensajes = new String[1000]; int pos = 0; public synchronized void agregar(string msg) { mensaje[pos] = msg; public int getcapacidad(){ return mensajes.length;? public synchronized int getelementos() { return pos; Cuándo deben declararse métodos synchronized? En actualizaciones sobre variables de instancia de objetos que no sean operaciones atómicas: actualización de dos o más variables actualización de variables long, double otros? El costo de declarar métodos synchronized es: mayor lentitud de la ejecución de métodos (por la adquisición del mutex) peligro de deadlock: bloqueo mutuo de dos threads que esperan adquirir mutex intercambiados 51 52

14 Ejemplo de deadlock Dadas las clases Batman y Robin: public class Batman { Robin robin; public void setasistente( Robin robin ){ this.robin = robin; public synchronized void vuelveabaticueva(){ robin.subealbatimovil(); public synchronized usabatiboomerang(){ // usa el batiboomerang como arma de defensa public class Robin { Batman batman; public void setjefe( Batman batman ){ this.batman = batman; public synchronized powtonkpafbonk(){ batman.usabatiboomerang(); 53 Ejemplo de deadlock (cont.) y una aplicación que instancia dichas clases y las usa como objetos compartidos por diferentes threads: public class CiudadGotica { public static void main( String[] arg){ Batman batman = new Batman(); Robin robin = new Robin(); batman.setayudante( robin ); robin.setjefe( batman ); // aquí se inician distintas operaciones con threads, // entre ellos un thread Alfred y otro thread Pingüino NOTA: Ejemplo adaptado de Programming Java Threads in the real world (Parte 2), Allan Holub, disponible on-line: 54 Ejemplo de deadlock (cont.) Imagine que en el ejemplo anterior ocurre lo siguiente: 1.Un thread llamado Alfred invoca el método vuelveabaticueva() sobre el objeto batman. Alfred obtiene el mutex de batman pero justo antes de que este método invoque el método subealbatimovil() de robin, su ejecución es interrumpida. (Clase Batman) public synchronized void vuelveabaticueva(){ robin.subealbatimovil(); 2.Otro thread, llamado Pingüino, invoca el método powtonkpafbonk() de robin. El thread Pingüino obtiene el mutex de robin, y trata de ejecutar la instrucción batman.usabatiboomerang(). Para lograrlo debe adquirir también el mutex de batman, pero como éste está en poder del thread Alfred, se bloquea en espera de su liberación. (Clase Robin) public synchronized powtonkpafbonk(){ batman.usabatiboomerang(); 55 Ejemplo de deadlock (cont.) 3. Entonces el thread Alfred es reactivado, y trata de invocar subealbatimovil() sobre robin. Para invocarlo, sin embargo, debe adquirir el mutex de robin que está en poder del thread Pingüino. (Clase Batman) public synchronized void vuelveabaticueva(){ robin.subealbatimovil(); 4. A este punto el thread Pingüino no puede reactivarse porque no puede obtener el mutex de batman (lo tiene el thread Alfred), ni tampoco el thread Alfred puede hacerlo, porque no puede obtener el mutex de robin (lo tiene el thread Pingüino) Deadlock! 56

15 Re-adquisición del mutex En Java un thread puede re-obtener el mutex de un objeto que éste ya tiene. public class NoIncurroEnAutoDeadlock { public synchronized void a(){ b(); public synchronized void b(){ System.out.println( Estoy en b ); Esto evita que un thread incurra en deadlock por culpa de él mismo. Bloques synchronized Es posible declarar como synchronized porciones de código dentro de un método de una clase. Esto permite implementar exclusión mutua sobre bloques de instrucciones. Formato: synchronized( objeto ){ // instrucciones Un thread, al ingresar a un bloque synchronized se bloquea en espera de la adquisición del mutex asociado al objeto (o arreglo) declarado en su encabezado. El mutex es liberado a la salida del bloque Bloques synchronized: ejemplo En el siguiente ejemplo, el método avanzar adquiere el mutex de motor para ejecutar algunas instrucciones: public class Robot{ Motor motor = new Motor(); public void avanzar(){ if( encendido() ) synchronized( motor ){ avanzando = true; motor.aplicarpotencia( 10 ); else preguntar( Desea encender, Si, No ); Bloques synchronized: ejemplo Consecuencia: dado que en el bloque synchronized es adquirido el mutex de motor, ningún otro thread que requiera dicho mutex podrá ser ejecutado concurrentemente. En consecuencia se obtiene un acceso con exclusión mutua sobre la instancia de Motor, aun cuando esta clase no tenga ningún bloque ni método synchronized

16 Bloques y métodos synchronized El objeto asociado al bloque synchronized puede ser la misma instancia sobre la cual se ejecuta el método (referencia this). Como consecuencia, las siguientes implementaciones son equivalentes: public class MiClase{ public synchronized void mimetodo(){ // Instrucciones public class MiClase{ public void mimetodo(){ synchronized( this ){ // Instrucciones 61 Bloques synchronized (cont.) Se pueden crear exclusiones en/entre métodos específicos: public class Acta{ double[] notascatedra = new double[10]; double[] notasayudantia = new double[10]; public void actualizarcatedra(){ synchronized( notascatedra ); // Instrucciones public void imprimircatedra(){ synchronized( notascatedra ); // Instrucciones public void actualizarayudantia(){ synchronized( notasayudantia ); // Instrucciones public void imprimirayudantia(){ synchronized( notasayudantia ); // Instrucciones Excluyentes Excluyentes 62 Sincronización de threads El problema consiste en lograr que un thread actúe sólo cuando otro ha concluido cierta actividad (y viceversa): threads mutuamente excluyentes. Problema del productor/consumidor: Un thread (Productor) genera un elemento que es agregado a un depósito, este elemento es consumido por otro thread (Consumidor) El depósito tiene capacidad limitada, cuando está lleno, el Productor debe esperar que se disponga de espacio nuevamente. Por su parte el consumidor debe esperar que haya elementos para poder retirarlos. 63 Supongamos que la capacidad del depósito es igual a 1: Productor Sincronización de threads Depósito Consumidor El problema es más complejo que en los ejemplos anteriores: el depósito no sólo debe soportar acceso concurrente, sino que los threads deben también actuar sincronizadamente. 64

17 Ejemplo de sincronización Supongamos la siguiente implementación de un Productor y un Consumidor: public class Productor extends Thread { private Deposito deposito; public Productor(Deposito d) { deposito = d; for (int i=1;i<20 ;i++ ) deposito.guardar(); public class Consumidor extends Thread{ private Deposito deposito; public Consumidor(Deposito d) { deposito = d; for (int i=1;i<20 ;i++ ) deposito.sacar(); Ambos actúan sobre un objeto compartido de la clase Deposito. Sincronización de threads: una solución simplista Una solución simple sería que el productor verificara cada vez si hay espacio en el depósito, y si lo hay, entonces agregara un elemento a él. Lo mismo podría hacer el consumidor antes de intentar sacar un elemento del depósito. public class Deposito{ private int elementos = 0; public synchronized void guardar() { if( elementos = 0 ) elementos++; return; public synchronized void sacar() { if( elementos > 0 ) elementos--; return; Sincronización de threads: una solución simplista (cont.) Problema: alto consumo de recursos (CPU) en procesos improductivos. Solución más adecuada: detener los threads hasta que se den las condiciones para que actúen. Sincronización de threads: uso de métodos wait y notify La clase Object provee el método wait() que detiene un thread hasta que le sea notificada la posibilidad de continuar. El método wait debe ser invocado sobre un objeto compartido por los threads a sincronizar (ej. el depósito) Para poder invocar el método wait es necesario que el thread tenga el mutex del objeto compartido La invocación de wait detiene el thread, lo pone en una lista de espera asociada al objeto, y libera su mutex. Objeto CPU Lista de espera wait 67 68

18 Sincronización de threads: uso de métodos wait y notify (cont.) El thread saldrá de la lista de espera cuando otro thread invoque el método notify sobre el objeto compartido. Al salir de la lista de espera, se bloqueará en espera del mutex del objeto para continuar su ejecución. Una vez re-obtenido el mutex del objeto, el thread que salió de la lista de espera continuará la ejecución del método en la instrucción siguiente al llamado a wait. Si hay más de un thread en la lista de espera, notify reactivará sólo uno de ellos. El criterio de selección del thread a re-activar depende de la implementación de Java. Nota: El método wait puede generar una InterruptedException. Sincronización de threads: uso de métodos wait y notify (cont.) Notar que en este modelo la notificación es indirecta: el thread que invoca notify no tiene ninguna referencia al thread que está en espera. La notificación actúa sobre un objeto compartido, y al ser este notificado, un thread en espera es reactivado. Pedro llegué Pedro llegué Lista de espera llegó Pedro Inscripción para notificación (wait) Sincronización de threads: uso del método notifyall El método notifyall permite reactivar todos los threads bloqueados en la lista de espera de un objeto, esto es, se vuelven todos ejecutables. Notar sin embargo que ellos podrán tomar el mutex sólo de uno a la vez. Pedro llegué Lista de espera llegué llegué llegué Inscripción para notificación (wait) 71 Ejemplo de sincronización (cont.) El depósito está implementado de la siguiente forma: public class Deposito{ private int elementos = 0; public synchronized void guardar() { try{ if( elementos > 0) // Más adelante se verá que no está correcto this.wait(); catch( InterruptedException e ){ elementos++; System.out.println( "Guardar - numero elementos: " + elementos ); this.notify(); public synchronized void sacar() { try{ if( elementos == 0) // Más adelante se verá que no está correcto this.wait(); catch( InterruptedException e ){ elementos--; System.out.println( "Sacar - numero elementos: " + elementos ); this.notify(); 72

19 Ejemplo de sincronización (cont.) Ejemplo de sincronización (cont.) La aplicación crea dos threads (Productor y Consumidor), que accesan el objeto compartido (depósito): public class EjemploProductorConsumidor{ public static void main( String[] arg ) { Deposito deposito = new Deposito(); Productor productor = new Productor( deposito ); Consumidor consumidor = new Consumidor( deposito ); productor.start(); consumidor.start(); Ejemplo de sincronización (cont.) Ejemplo de sincronización (cont.) Supongamos en un momento cualquiera que el depósito está vacío y se activa el thread Consumidor Thread Productor Se bloquea en espera del mutex de depósito Adquiere el mutex de deposito Mutex Lista de espera depósito Thread Consumidor Adquiere el mutex de depósito Verifica que depósito tenga elementos. Dado que no los tiene invoca wait del objeto depósito. La invocación de wait libera el mutex de depósito y el thread se agrega a la lista de espera (de depósito). 75 Thread Productor Verifica que depósito esté vacío y agrega un elemento. Invoca notify de depósito. Termina la ejecución del método y libera el mutex. Se bloquea en espera del mutex de depósito Mutex Lista de espera depósito Thread Consumidor Sale de la lista de espera y se bloquea en espera del mutex de depósito. Adquiere el mutex de depósito. Saca el elemento del depósito Invoca notify de depósito (*) (*) El efecto de notify en esta secuencia es nulo, pero qué habría pasado si el mutex de depósito lo Franco Guidi Polanco hubiera ganado el Productor?

20 Sincronización y bloqueo iterativo (spin lock) Sincronización y bloqueo iterativo (spin lock) En la implementación de Deposito existe aun un problema. Suponga que hay mas de un thread Consumidor, el depósito está vacío, y se da la siguiente secuencia de eventos: 1. Un thread Consumidor toma el mutex del depósito, y verifica la existencia de un elemento en él. Dado que el depósito está vacío, invoca el método wait (sobre el depósito), se bloquea en la lista de espera (de depósito), y libera su mutex. if( elementos == 0) this.wait(); 2. El thread Productor es reactivado, adquiere el mutex de depósito, comprueba que éste está vacío, le agrega un elemento, e invoca notify (sobre el objeto depósito). 3. El thread Consumidor que estaba en la lista de espera de depósito es notificado (sacado de dicha lista), y puesto en espera del mutex (de depósito). 4. El thread Productor libera el mutex de depósito. 5. Otro thread Consumidor, que no estaba en la lista de espera de depósito, adquiere su mutex, comprueba que el depósito tiene un elemento, lo saca del depósito, invoca notify (no interesa que ocurre con esto), y libera el mutex de depósito. 6. El primer thread Consumidor (que en el paso 3 había sido sacado de la lista de espera y bloqueado en espera del mutex) adquiere el mutex de depósito (antes de que el thread Productor trate de agregar un elemento), y continúa su ejecución en el punto en que estaba: trata de sacar un elemento, pero el depósito está vacío: ERROR Sincronización y bloqueo iterativo (spin lock) Sincronización y bloqueo iterativo (spin lock) Este problema nace del hecho que la especificación de Java no establece que la salida de la lista de espera y adquisición del mutex sean implementados como una operación atómica (distintas JVM se pueden comportar de distinto modo). Problemas análogos se presentan cuando: Hay más de un Productor. La notificación ocurre con notifyall en vez de notify. Solución al problema anterior: reemplazar la estructura: por: if( condición de detención ) wait(); while( condición de detención ) wait(); Spin lock 79 80

21 Sincronización y bloqueo iterativo (spin lock) Es decir, la clase Deposito queda: public class Deposito{ private int elementos = 0; public synchronized void guardar() { try{ while( elementos > 0) this.wait(); catch( InterruptedException e ){ elementos++; System.out.println( "Guardar - numero elementos: " + elementos ); this.notify(); public synchronized void sacar() { try{ while( elementos == 0) this.wait(); catch( InterruptedException e ){ elementos--; System.out.println( "Sacar - numero elementos: " + elementos ); this.notify(); Para saber más The Java Tutorial (Sun Microsystems) The Java API (Sun Microsystems) Programming Java Threads in the Real World (Parts 1-9) Allan Hollub

Threads. La plataforma JAVA soporta programas multhreading a través del lenguaje, de librerías y del sistema de ejecución. Dos.

Threads. La plataforma JAVA soporta programas multhreading a través del lenguaje, de librerías y del sistema de ejecución. Dos. Threads Un thread es un flujo de control secuencial dentro de un programa. A los threads también se los conoce como procesos livianos ó contextos de ejecución. Un thread es similar a un programa secuencial:

Más detalles

1 HILOS (THREADS) EN JAVA

1 HILOS (THREADS) EN JAVA 1 HILOS (THREADS) EN JAVA 1.1QUÉ ES UN THREAD La Máquina Virtual Java (JVM) es un sistema multihilo. Es decir, es capaz de ejecutar varios hilos de ejecución simultáneamente. La JVM gestiona todos los

Más detalles

Concurrencia. Primitivas IPC con bloqueo

Concurrencia. Primitivas IPC con bloqueo Concurrencia Primitivas IPC con bloqueo Primitivas de IPC con bloqueo La solución de Peterson es correcta, pero tiene el defecto de requerir espera ocupada: Cuando un proceso quiere entrar en su región

Más detalles

Java nos ofrece la clase Thread y la interfaz Runable que permiten que varios procesos estén funcionando de forma concurrente.

Java nos ofrece la clase Thread y la interfaz Runable que permiten que varios procesos estén funcionando de forma concurrente. Threads (hilos) Java nos ofrece la clase Thread y la interfaz Runable que permiten que varios procesos estén funcionando de forma concurrente. Conceptos: Proceso (thread o hilo): es un programa en ejecución

Más detalles

Multitarea en Java. Rafa Caballero - UCM

Multitarea en Java. Rafa Caballero - UCM Multitarea en Java Rafa Caballero - UCM Programa Monoproceso (monotarea) En cada momento hay una única instrucción ejecutándose Se dice que el programa es monotarea, o monoproceso o monohebra (o single

Más detalles

Programación Orientada a Eventos

Programación Orientada a Eventos Programación Orientada a Eventos Técnicas de Programación Santiago Pavón V:2012.03.13 Programas Secuénciales El flujo de ejecución del programa sigue la secuencia de sentencias que lo forman. El estado

Más detalles

Federico Peinado www.federicopeinado.es

Federico Peinado www.federicopeinado.es Federico Peinado www.federicopeinado.es Depto. de Ingeniería del Software e Inteligencia Artificial disia.fdi.ucm.es Facultad de Informática www.fdi.ucm.es Universidad Complutense de Madrid www.ucm.es

Más detalles

MONITORES EN JAVA. Antonio Tomeu Control de la Concurrencia en Java: API Estándar

MONITORES EN JAVA. Antonio Tomeu Control de la Concurrencia en Java: API Estándar MONITORES EN JAVA Un monitor es un objeto que implementa acceso bajo e.m. a todos sus métodos, y provee sincronización En Java, son objetos de una clase cuyos métodos públicos son todos synchronized Un

Más detalles

TEMA 5: Control de la Concurrencia en Java (API Estándar)

TEMA 5: Control de la Concurrencia en Java (API Estándar) TEMA 5: Control de la Concurrencia en Java (API Estándar) CONTENIDO Exclusión Mutua con código synchronized. Exclusión Mutua con métodos synchronized. Protocolos de Control de la Exclusión Mutua. Interbloqueos

Más detalles

Programación Concurrente en Java

Programación Concurrente en Java Hebras y monitores Departamento de Sistemas Informáticos y Programación Universidad Complutense de Madrid 21 de marzo de 2006 Threads Extendiendo la clase java.lang.thread. public class PrThread extends

Más detalles

Concurrencia en Java

Concurrencia en Java Concurrencia en Java Herramientas proporcionadas por Java La Máquina Virtual (JVM) Pedro Pablo Gómez Martín La clase Thread Clase principal con la que conseguir concurrencia. La llamada a su método start()

Más detalles

Hebras y Sincronización en Java

Hebras y Sincronización en Java Hebras y Sincronización en Java Jonathan Makuc http://jmakuc.ublog.cl Noviembre 2008 Tópicos: 1. Introducción a hebras en Java...2 2. Hebras a través del clase Thread...3 3. Hebras a través de la interfaz

Más detalles

PROGRAMACIÓN EN JAVA

PROGRAMACIÓN EN JAVA SISTEMAS INFORMÁTICOS INDUSTRIALES curso 2007-2008 PROGRAMACIÓN EN JAVA PRÁCTICA 3: Comunicación entre tareas. Modelo productor / consumidor. Objetivos Implementar una aplicación en Java en la que existan

Más detalles

Benemérita Universidad Autónoma del Estado de Puebla

Benemérita Universidad Autónoma del Estado de Puebla Benemérita Universidad Autónoma del Estado de Puebla Facultad de Cs. De la Computación Programación Concurrente y Paralela Práctica de Laboratorio No. 5 Profr: María del Carmen Cerón Garnica Alumno: Roberto

Más detalles

Java: Clases Abstractas e Interfaces

Java: Clases Abstractas e Interfaces Clases abstractas e interfaces Java: Clases Abstractas e Interfaces Franco Guidi Polanco Escuela de Ingeniería Industrial Pontificia Universidad Católica de Valparaíso, Chile [email protected] A nivel conceptual,

Más detalles

Modulo 1 El lenguaje Java

Modulo 1 El lenguaje Java Modulo 1 El lenguaje Java 13 - Codificación en Java Una de las grandes diferencias entre Java y Pascal en cuando a la codificación es que Java se trata de un lenguaje de los llamados case sensitive Esto

Más detalles

CDI Exclusión mutua a nivel alto. conceptos

CDI Exclusión mutua a nivel alto. conceptos conceptos El concepto de usar estructuras de datos a nivel alto libera al programador de los detalles de su implementación. El programador puede asumir que las operaciones están implementadas correctamente

Más detalles

Java y JVM: programación concurrente

Java y JVM: programación concurrente Java y JVM: programación concurrente Adolfo López Díaz Escuela de Ciencias de la Computación e Informática. Universidad de Costa Rica Resumen: El lenguaje de programación Java proporciona, sin necesidad

Más detalles

RESUMEN DE CONCEPTOS BASICOS DE PROGRAMACION JAVA

RESUMEN DE CONCEPTOS BASICOS DE PROGRAMACION JAVA UNED Centro Asociado de Cádiz RESUMEN DE CONCEPTOS BASICOS DE PROGRAMACION JAVA 1. OBJETOS Cualquier elemento del programa es un objeto. Un programa es un conjunto de objetos que se comunican entre sí

Más detalles

Object 1. Threads en Java

Object 1. Threads en Java Object 1 Threads en Java Introducción En este artículo voy a explicar cómo se usan los threads en Java (también traducidos como "hilos de ejecución"). La intención no es solamente explicar cuáles son las

Más detalles

Clases y Objetos. Informática II Ingeniería Electrónica

Clases y Objetos. Informática II Ingeniería Electrónica Clases y Objetos Informática II Ingeniería Electrónica Los Tipos de Datos Hasta ahora, en un programa podemos usar para representar variables a: Tipos fundamentales : enteros (int), caracteres (char),

Más detalles

Concurrencia en Android LSUB, GYSC, URJC

Concurrencia en Android LSUB, GYSC, URJC Concurrencia en Android LSUB, GYSC, URJC Repaso de concurrencia en Java Crear un thread Instanciar un Thread, con el método run sobreescrito Intanciar un objeto que cumpla el interfaz Runnable y pasárselo

Más detalles

Uso de excepciones en Java

Uso de excepciones en Java Uso de excepciones en Java En Java, cuando se produce un error en un método, se lanza un objeto Throwable. Cualquier método que haya llamado al método puede capturar la excepción y tomar las medidas que

Más detalles

Programación Orientada a Objetos con Java

Programación Orientada a Objetos con Java Programación Orientada a Objetos con Java M.C. Jorge Eduardo Ibarra Esquer [email protected] Sobrecarga de métodos Java permite la definición de dos o más métodos que tengan el mismo nombre, dentro de la

Más detalles

Benemérita Universidad Autónoma del Estado de Puebla

Benemérita Universidad Autónoma del Estado de Puebla Benemérita Universidad Autónoma del Estado de Puebla Facultad de Cs. De la Computación Programación Concurrente y Paralela Práctica de Laboratorio No. 4 Profr: María del Carmen Cerón Garnica Alumno: Roberto

Más detalles

class Nombre_Clase extends Nombre_SuperClase { cuerpo de la clase extendida }

class Nombre_Clase extends Nombre_SuperClase { cuerpo de la clase extendida } REUTILIZACIÓN DE CLASES:MODELO DE HERENCIA EN JAVA Java soporta herencia simple pero no múltiple. Lo hace mediante el mecanismo de extensión de clase. A partir de él, una subclase se extiende (hereda)

Más detalles

8. Sentencia return y métodos

8. Sentencia return y métodos 92 A. García-Beltrán y J.M. Arranz 8. Sentencia return y métodos Objetivos: a) Describir el funcionamiento de la sentencia return b) Interpretar el resultado de una sentencia return en el código fuente

Más detalles

Si bien Pascal-FC no trae algunas de las características de Pascal como:

Si bien Pascal-FC no trae algunas de las características de Pascal como: PROCESOS VS. HILOS: Ciclo de vida de un proceso: es prácticamente un estándar en todos los sistemas operativos. En principio el proceso no existe, es creado, luego pasa a listo (el proceso esta en condiciones

Más detalles

Tema 6. Reutilización de código. Programación 2015-2016. Programación - Tema 6: Reutilización de código

Tema 6. Reutilización de código. Programación 2015-2016. Programación - Tema 6: Reutilización de código Tema 6 Reutilización de código Programación 2015-2016 Programación - Tema 6: Reutilización de código 1 Tema 6. Reutilización de código Modularidad. Implementación de métodos. Uso de métodos. Programación

Más detalles

Mensajes. Interbloqueo

Mensajes. Interbloqueo CONCURRENCIA DE PROCESOS Preparado por: Angel Chata Tintaya ([email protected]) Resumen Los procesos comparten variables globales, comparten y compiten por recursos, se ejecutan simultáneamente intercalándose

Más detalles

MICQ. Trabajo Práctico Final Seminario de Ingeniería en Informática I 75.35. Facultad de Ingeniería, UBA. Junio 2002. Cátedra: Pablo Cosso

MICQ. Trabajo Práctico Final Seminario de Ingeniería en Informática I 75.35. Facultad de Ingeniería, UBA. Junio 2002. Cátedra: Pablo Cosso MICQ Facultad de Ingeniería, UBA. Junio 2002 Trabajo Práctico Final Seminario de Ingeniería en Informática I 75.35 Cátedra: Pablo Cosso Alumno: Diego Fernando Montaldo 75.300 1 de 1 Introducción Este documento

Más detalles

GESTIÓN DE EXCEPCIONES EN JAVA. CAPTURA CON BLOQUES TRY CATCH Y FINALLY. EJEMPLOS RESUELTOS. (CU00927C)

GESTIÓN DE EXCEPCIONES EN JAVA. CAPTURA CON BLOQUES TRY CATCH Y FINALLY. EJEMPLOS RESUELTOS. (CU00927C) APRENDERAPROGRAMAR.COM GESTIÓN DE EXCEPCIONES EN JAVA. CAPTURA CON BLOQUES TRY CATCH Y FINALLY. EJEMPLOS RESUELTOS. (CU00927C) Sección: Cursos Categoría: Lenguaje de programación Java nivel avanzado I

Más detalles

Modelo de Objetos Distribuidos

Modelo de Objetos Distribuidos Remote Method Invocation Modelo de Objetos Distribuidos Un objeto remoto es un objeto cuyos métodos pueden ser invocados desde otra máquina virtual de java, potencialmente en un host diferente. Modelo

Más detalles

Práctico de Procesos, Hilos y Deadlock

Práctico de Procesos, Hilos y Deadlock Sistemas Operativos Práctico de Procesos, Hilos y Deadlock Universidad Nacional de Córdoba FaMAF Ejercicio 1.. Indique cuantas letras a imprime este programa, describiendo su funcionamiento. printf("a\n");

Más detalles

Acronis License Server. Guía del usuario

Acronis License Server. Guía del usuario Acronis License Server Guía del usuario TABLA DE CONTENIDO 1. INTRODUCCIÓN... 3 1.1 Generalidades... 3 1.2 Política de licencias... 3 2. SISTEMAS OPERATIVOS COMPATIBLES... 4 3. INSTALACIÓN DE ACRONIS LICENSE

Más detalles

Concurrencia: Exclusión mutua y Sincronización

Concurrencia: Exclusión mutua y Sincronización Concurrencia: Exclusión mutua y Sincronización Prof. Carlos Figueira Basado en materiales de Yudith Cardinale (USB) Williams Stallings, Eugene Styer Concurrencia Múltiples aplicaciones Aplicaciones estructuradas

Más detalles

Concurrencia entre Procesos.

Concurrencia entre Procesos. Concurrencia entre Procesos. Sistemas Operativos Tema 3. 1 Procesamiento concurrente. Procesamiento concurrente: base de los sistemas operativos modernos (multiprogramados): Un conjunto de procesos que

Más detalles

Pruebas de unidad con JUnit

Pruebas de unidad con JUnit Pruebas de unidad con JUnit Cuando se implementa software, resulta recomendable comprobar que el código que hemos escrito funciona correctamente. Para ello, implementamos pruebas que verifican que nuestro

Más detalles

Sistemas Operativos. Curso 2014 Planificación

Sistemas Operativos. Curso 2014 Planificación Sistemas Operativos Curso 2014 Planificación Agenda Introducción. Despachador. Clases de procesos. Esquemas de planificación. Criterios de planificación. Algoritmos de planificación. FCFS. SJF. Prioridad.

Más detalles

Sistemas Operativos. Curso 2015 Planificación

Sistemas Operativos. Curso 2015 Planificación Sistemas Operativos Curso 2015 Planificación Agenda Introducción. Despachador. Clases de procesos. Esquemas de planificación. Criterios de planificación. Algoritmos de planificación. FCFS. SJF. Prioridad.

Más detalles

EXAMEN FINAL Metodología y Programación Orientada a Objetos. Curso 2010 2011. Cuatrimestre de otoño. 17 de Enero de 2011

EXAMEN FINAL Metodología y Programación Orientada a Objetos. Curso 2010 2011. Cuatrimestre de otoño. 17 de Enero de 2011 EXAMEN FINAL Metodología y Programación Orientada a Objetos. Curso 2010 2011. Cuatrimestre de otoño. 17 de Enero de 2011 1. (0,75 PUNTOS) Identificad a continuación las sentencias que son ciertas, descartando

Más detalles

Concurrencia en Java

Concurrencia en Java Concurrencia en Java Concurrencia y Distribución Programación Avanzada Posgrado en Ciencia e Ingeniería de la Computación, UNAM 1. El mecanismo de threads Una aplicación Java o applet puede contener secciones

Más detalles

Pontificia Universidad Católica de Chile Escuela de Ingeniería Departamento de Ciencia de la Computación

Pontificia Universidad Católica de Chile Escuela de Ingeniería Departamento de Ciencia de la Computación Pontificia Universidad Católica de Chile Escuela de Ingeniería Departamento de Ciencia de la Computación Competencias IIC1103 Introducción a la Programación (I/2010) Interrogación 1 13 de Abril de 2010

Más detalles

75-62 Técnicas de Programación Concurrente II 2004 java Threads

75-62 Técnicas de Programación Concurrente II 2004 java Threads 75-62 Técnicas de Programación Concurrente II 2004 java Threads FIUBA Ing. Osvaldo Clúa Bibliografía: tutorial de Java en http://java.sun.com Un buen libro (algo teórico) es Garg: Concurrent and Distributed

Más detalles

Repaso de las características más importantes de la programación Java y su adaptación a Android

Repaso de las características más importantes de la programación Java y su adaptación a Android Repaso de las características más importantes de la programación Java y su adaptación a Android 1. Entorno de programación en java 2. Variables y tipos de datos 3. Operaciones y operadores 4. Clases y

Más detalles

Introducción a la Firma Electrónica en MIDAS

Introducción a la Firma Electrónica en MIDAS Introducción a la Firma Electrónica en MIDAS Firma Digital Introducción. El Módulo para la Integración de Documentos y Acceso a los Sistemas(MIDAS) emplea la firma digital como método de aseguramiento

Más detalles

1 (2 5 puntos) Responda con brevedad y precisión a las siguientes preguntas:

1 (2 5 puntos) Responda con brevedad y precisión a las siguientes preguntas: Universidad de Las Palmas de Gran Canaria Escuela Universitaria de Informática Facultad de Informática Sistemas Operativos Examen parcial, 11 de mayo de 2002 SOLUCIONES Calificación 1 2 3 4 5 1 (2 5 puntos)

Más detalles

Creación de Funciones de Conducción

Creación de Funciones de Conducción Creación de Funciones de Conducción Requerimientos Para el desarrollo de esta actividad se requiere que: Contemos con un robot BoeBot armado con placa Arduino. Repetición En estos momentos habremos notado

Más detalles

Elementos requeridos para crearlos (ejemplo: el compilador)

Elementos requeridos para crearlos (ejemplo: el compilador) Generalidades A lo largo del ciclo de vida del proceso de software, los productos de software evolucionan. Desde la concepción del producto y la captura de requisitos inicial hasta la puesta en producción

Más detalles

Introducción a la programación orientada a objetos

Introducción a la programación orientada a objetos Introducción a la programación orientada a objetos 1. Introducción a la programación orientada a objetos 2. Las clases 3. El tipo Struct 4. Diferencias entre Class y Struct 5. Pilares de la Programación

Más detalles

Gestión de Oportunidades

Gestión de Oportunidades Gestión de Oportunidades Bizagi Suite Gestión de Oportunidades 1 Tabla de Contenido CRM Gestión de Oportunidades de Negocio... 4 Elementos del Proceso... 5 Registrar Oportunidad... 5 Habilitar Alarma y

Más detalles

Concurrencia: deberes. Concurrencia: Exclusión Mutua y Sincronización. Concurrencia. Dificultades con la Concurrencia

Concurrencia: deberes. Concurrencia: Exclusión Mutua y Sincronización. Concurrencia. Dificultades con la Concurrencia Concurrencia: deberes Concurrencia: Exclusión Mutua y Sincronización Capítulo 5 Comunicación entre procesos Compartir recursos Sincronización de múltiples procesos Asignación del tiempo de procesador Concurrencia

Más detalles

SISTEMAS OPERATIVOS AVANZADOS

SISTEMAS OPERATIVOS AVANZADOS SISTEMAS OPERATIVOS AVANZADOS TEMA 3 CLAVE: MIS 204 PROFESOR: M.C. ALEJA DRO GUTIÉRREZ DÍAZ 3. PROCESOS CONCURRENTES 3.1 Conceptos de programación concurrente 3.2 El problema de la sección crítica 3.3

Más detalles

FUNDAMENTOS DE PROGRAMACIÓN. SEPTIEMBRE 2005

FUNDAMENTOS DE PROGRAMACIÓN. SEPTIEMBRE 2005 Dpto. de Ingeniería de Sistemas Telemáticos E.T.S.I. Telecomunicación Universidad Politécnica de Madrid FUNDAMENTOS DE PROGRAMACIÓN. SEPTIEMBRE 2005 Normas de examen: Con libros y apuntes Duración: 2 horas

Más detalles

Threads o Hilos. Marco Besteiro y Miguel Rodríguez

Threads o Hilos. Marco Besteiro y Miguel Rodríguez En.NET, cuando se lanza una aplicación se crea un proceso y dentro de este proceso un hilo de ejecución o thread para el método Main. Es posible, a la vez que se ejecuta el método Main, que la aplicación

Más detalles

Manual del Protocolo XML-RPC de Mensajería Negocios

Manual del Protocolo XML-RPC de Mensajería Negocios Manual del Protocolo XML-RPC de Mensajería Negocios Índice de contenidos 1 INTRODUCCIÓN... 3 2 FUNCIONALIDADES DEL API DE COMUNICACIÓN XML-RPC... 4 2.1 Envío Libre... 4 2.2 Envío a Grupo de Contactos...

Más detalles

Programación Concurrente en Java

Programación Concurrente en Java Programación Concurrente en Java Curso 2006-2007 9/2/2007 Prog. Distribuida Bajo Internet Qué es la Programación Concurrente? Diseño basado en varias actividades independientes Conceptualmente se ejecutan

Más detalles

SOLUCION PARCIAL TASK SCHEDULER. Task Scheduler

SOLUCION PARCIAL TASK SCHEDULER. Task Scheduler Task Scheduler Se necesita modelar una aplicación que permita definir tareas y ejecutarlas en forma programada. Las tareas pueden ser: La ejecución de programa cualquiera o comando del sistema operativo,

Más detalles

Hilos, comunicación y competencia entre procesos. Dr. Alonso Ramírez Manzanares 2-Sep-2010

Hilos, comunicación y competencia entre procesos. Dr. Alonso Ramírez Manzanares 2-Sep-2010 Hilos, comunicación y competencia entre procesos Dr. Alonso Ramírez Manzanares 2-Sep-2010 Implementación de procesos Se mantiene una tabla de procesos con una entrada por cada proceso: Con lo cual tenemos

Más detalles

2.2.- Paradigmas de la POO

2.2.- Paradigmas de la POO 2.2.- Paradigmas de la POO Los principios propios de la orientación a objetos son: 2.2.1.- Abstracción de Datos 2.2.2.- Encapsulamiento 2.2.3.- Ocultamiento 2.2.4.- Herencia 2.2.5.- Polimorfismo Cualquier

Más detalles

Estructura de datos tipo vector.

Estructura de datos tipo vector. Estructura de datos tipo vector. Hemos empleado variables de distinto tipo para el almacenamiento de datos (variables int, float, String) En esta sección veremos otros tipos de variables que permiten almacenar

Más detalles

Sistemas Operativos. Curso 2016 Procesos

Sistemas Operativos. Curso 2016 Procesos Sistemas Operativos Curso 2016 Procesos Agenda Proceso. Definición de proceso. Contador de programa. Memoria de los procesos. Estados de los procesos. Transiciones entre los estados. Bloque descriptor

Más detalles

2. Estructura de un programa en Java

2. Estructura de un programa en Java 24 A. García-Beltrán y J.M. Arranz 2. Estructura de un programa en Java Objetivos: a) Describir la estructura del código fuente de una aplicación Java b) Presentar los conceptos de comentario y de identificador

Más detalles

PUESTA EN MARCHA PROGRAMA GESTION DE OPTICAS. Junio - 2004

PUESTA EN MARCHA PROGRAMA GESTION DE OPTICAS. Junio - 2004 PUESTA EN MARCHA PROGRAMA GESTION DE OPTICAS Junio - 2004 pmqsoft Servicios Informáticos, S.L. www.pmqsoft.com [email protected] Entendiendo que la instalación ha finalizado y que todo ha salido correctamente.

Más detalles

EXCEPCIONES EN JAVA. Las sentencias que tratan las excepciones son try y catch. La sintaxis es:

EXCEPCIONES EN JAVA. Las sentencias que tratan las excepciones son try y catch. La sintaxis es: EXCEPCIONES EN JAVA Uno de los problemas más importantes al escribir aplicaciones es el tratamiento de los errores. Errores no previstos que distorsionan la ejecución del programa. Las excepciones de Java

Más detalles

Región de Murcia Consejería de Educación, Ciencia e Investigación. Manual Usuario FCT

Región de Murcia Consejería de Educación, Ciencia e Investigación. Manual Usuario FCT . Manual Usuario FCT Murcia, 9 de Julio de 2007 Manual de Usuario FCT v1.0 pág. 2 de 73 ÍNDICE Manual Usuario FCT...1 1. Tipos de usuarios... 4 2. Modelo de navegación... 5 3. Servicios... 6 3.1. Convenios...

Más detalles

Introducción a Java LSUB. 15 de enero de 2015 GSYC

Introducción a Java LSUB. 15 de enero de 2015 GSYC Introducción a LSUB GSYC 15 de enero de 2015 (cc) 2014 Laboratorio de Sistemas, Algunos derechos reservados. Este trabajo se entrega bajo la licencia Creative Commons Reconocimiento - NoComercial - SinObraDerivada

Más detalles

Programación Concurrente y Paralela. P(S) ; sección crítica P(S);

Programación Concurrente y Paralela. P(S) ; sección crítica P(S); 2.5.2 Monitores Los semáforos, a pesar de su sencillez de uso, son el equivalente a las instrucciones goto y el manejo de apuntadores en los lenguajes de programación imperativos: son muy susceptibles

Más detalles

Preliminares. Tipos de variables y Expresiones

Preliminares. Tipos de variables y Expresiones Preliminares. Tipos de variables y Expresiones Felipe Osorio Instituto de Estadística Pontificia Universidad Católica de Valparaíso Marzo 5, 2015 1 / 20 Preliminares Computadoras desarrollan tareas a un

Más detalles

Concurrencia. Bibliografía: Introducción a los Sistemas de Bases de Datos Date, C.J.

Concurrencia. Bibliografía: Introducción a los Sistemas de Bases de Datos Date, C.J. Concurrencia Bibliografía: Introducción a los Sistemas de Bases de Datos Date, C.J. Concurrencia La mayor parte de los DBMS son sistemas para múltiples usuarios Se permite a cualquier cantidad de transacciones

Más detalles

Solución al Examen de Prácticas de Programación (Ingeniería Informática)

Solución al Examen de Prácticas de Programación (Ingeniería Informática) Solución al Examen de Prácticas de Programación (Ingeniería Informática) Junio 2006 Parte I. Cuestiones (3 puntos=50% nota del examen) 1) Se desea crear un conjunto de clases para representar en un programa

Más detalles

Monitores Ing. Iván Medrano Valencia

Monitores Ing. Iván Medrano Valencia Universidad Nacional de San Antonio Abad del Cusco Departamento Académico de Informática Programación Concurrente y Distribuida Práctica 5 1. OBJETIVO. Ing. Iván Medrano Valencia En esta práctica, comprobaremos

Más detalles

Q-flow Patrones básicos de Workflow

Q-flow Patrones básicos de Workflow How to Q-flow Patrones básicos de Workflow Versión: 2.0 Fecha de publicación 28-03-2011 Aplica a: Q-flow 3.0 y Q-flow 3.1 Índice Introducción... 3 Patrones de control... 4 Patrón: Secuencia... 4 Patrón:

Más detalles

Hilos en Java. Crear un Hilo. Detener un hilo. Fuente: http://www.chuidiang.com/java/hilos/hilos_java.php

Hilos en Java. Crear un Hilo. Detener un hilo. Fuente: http://www.chuidiang.com/java/hilos/hilos_java.php Fuente: http://www.chuidiang.com/java/hilos/hilos_java.php Hilos en Java A veces necesitamos que nuestro programa Java realice varias cosas simultáneamente. Otras veces tiene que realizar una tarea muy

Más detalles

Manual de Palm BlueChat 2.0

Manual de Palm BlueChat 2.0 Manual de Palm BlueChat 2.0 Copyright 2002 Palm, Inc. Todos los derechos reservados. Graffiti, HotSync y Palm OS son marcas registradas de Palm, Inc. El logotipo de HotSync, Palm y el logotipo de Palm

Más detalles

Ingeniería del Software Arquitectura Física en 3 niveles

Ingeniería del Software Arquitectura Física en 3 niveles Introducción En este laboratorio desplegaremos en 3 niveles físicos una aplicación que verifica si una cuenta y un password son correctos, basada en la que fue presentada en el laboratorio Separación entre

Más detalles

Receta general para resolver problemas de sincronización con semáforos

Receta general para resolver problemas de sincronización con semáforos Receta general para resolver problemas de sincronización con semáforos La primera vez que te enfrentas a la tarea de implementar una solución a un problema de sincronización entre procesos, es normal que

Más detalles

Introducción - por qué usarlas?(1)

Introducción - por qué usarlas?(1) Excepciones en Java Introducción - por qué usarlas?(1) En el mundo de la programación hay algo que siempre ocurre: los errores en los programas. Pero qué sucede realmente después de que ha ocurrido el

Más detalles

Programación Orientada a Objetos en Java

Programación Orientada a Objetos en Java Programación Orientada a Objetos en Java Curso 2006-2007 Tema 4 Herencia y Polimorfismo Gonzalo Méndez Pozo Dpto. de Ingeniería de Software e Inteligencia Artificial Universidad Complutense de Madrid Herencia

Más detalles

Introducción a la Programación Orientada a Objetos

Introducción a la Programación Orientada a Objetos Introducción a la Programación Orientada a Objetos El paradigma imperativo. En un programa se tienen una serie de variables con las cuales operamos y modificamos mediante sentencias y funciones para producir

Más detalles

PHP y MySQL. Inicio: - Herencia - Palabra clave Final - Polimorfismo - Type Hinting - Abstracción de clases

PHP y MySQL. Inicio: - Herencia - Palabra clave Final - Polimorfismo - Type Hinting - Abstracción de clases PHP y MySQL Inicio: - Herencia - Palabra clave Final - Polimorfismo - Type Hinting - Abstracción de clases Herencia de Objetos La herencia permite crear muchas clases que son similares entre si, sin tener

Más detalles

Sensor de Temperatura utilizando el Starter Kit Javelin Stamp. Realizado por: Bertha Palomeque A. Rodrigo Barzola J.

Sensor de Temperatura utilizando el Starter Kit Javelin Stamp. Realizado por: Bertha Palomeque A. Rodrigo Barzola J. Sensor de Temperatura utilizando el Starter Kit Javelin Stamp Realizado por: Bertha Palomeque A. Rodrigo Barzola J. INTRODUCCION DIFERENCIAS EJEMPLOS JAVA Orientado a Objetos Multiplataforma Programar

Más detalles

Gestión de la Configuración

Gestión de la Configuración Gestión de la ÍNDICE DESCRIPCIÓN Y OBJETIVOS... 1 ESTUDIO DE VIABILIDAD DEL SISTEMA... 2 ACTIVIDAD EVS-GC 1: DEFINICIÓN DE LOS REQUISITOS DE GESTIÓN DE CONFIGURACIÓN... 2 Tarea EVS-GC 1.1: Definición de

Más detalles

Objetivo: Introducción conceptual y aplicación básica de los lenguajes del lado del servidor.

Objetivo: Introducción conceptual y aplicación básica de los lenguajes del lado del servidor. Sesión 03: Lenguajes web del servidor Competencias a Conseguir: - Conocer el entorno de trabajo a nivel de servidores web. - Instalación del localhost (Servidor Local). - Repaso general de PHP y ejercicios

Más detalles

Examen Junio- Grupo A Lunes 17 de Junio - Programación en C++ Pág. 1

Examen Junio- Grupo A Lunes 17 de Junio - Programación en C++ Pág. 1 Examen Junio- Grupo A Lunes 17 de Junio - Programación en C++ Pág. 1 ÍNDICE ÍNDICE... 1 1.1 Ejercicio 1: Máquina Expendedora (3.5 ptos.)... 1 1.2 Ejercicio 2: Clase Circulo (1.0 pto.)... 3 1.3 Ejercicio

Más detalles

MANUAL DE AYUDA TAREA PROGRAMADA COPIAS DE SEGURIDAD

MANUAL DE AYUDA TAREA PROGRAMADA COPIAS DE SEGURIDAD MANUAL DE AYUDA TAREA PROGRAMADA COPIAS DE SEGURIDAD Fecha última revisión: Diciembre 2010 Tareas Programadas TAREAS PROGRAMADAS... 3 LAS TAREAS PROGRAMADAS EN GOTELGEST.NET... 4 A) DAR DE ALTA UN USUARIO...

Más detalles

Visual Basic 1. Empleo de módulos y Procedimientos. Procedimientos definidos por el usuario

Visual Basic 1. Empleo de módulos y Procedimientos. Procedimientos definidos por el usuario Empleo de módulos y Procedimientos Procedimientos definidos por el usuario Según lo que hemos visto hasta ahora, Visual Basic, almacena el código en módulos. Hay tres clases de módulos: formularios (.frm),

Más detalles

MANUAL DE USUARIO SISTEMA DE ALMACEN DIF SONORA

MANUAL DE USUARIO SISTEMA DE ALMACEN DIF SONORA MANUAL DE USUARIO SISTEMA DE ALMACEN DIF SONORA DICIEMBRE 2007. El Sistema de Almacén fue desarrollado con la finalidad de facilitar a los usuarios el proceso de entradas y salidas del almacén mediante

Más detalles

Curso de Python Inicial

Curso de Python Inicial Logo IAA-CSIC Curso organizado por el Gabinete de Formación del CSIC Curso de Python Inicial Clases Contenidos 1. Paradigmas de la Programación 2. Programación Orientada a objetos 3. Clases 4. Objetos

Más detalles

Sistemas operativos avanzados. 1.3 Algoritmos de planificación del procesador

Sistemas operativos avanzados. 1.3 Algoritmos de planificación del procesador Sistemas operativos avanzados 1.3 Algoritmos de planificación del procesador Parámetros Cuando tenemos más de un proceso en condiciones de ejecutar, debemos escoger uno de entre ellos. Para escogerlo empleamos

Más detalles

dit UPM Tema 3: Concurrencia /ejercicios Análisis y diseño de software José A. Mañas 3.4.2014 http://jungla.dit.upm.es/~pepe/doc/adsw/index.

dit UPM Tema 3: Concurrencia /ejercicios Análisis y diseño de software José A. Mañas 3.4.2014 http://jungla.dit.upm.es/~pepe/doc/adsw/index. Análisis y diseño de software dit UPM Tema 3: Concurrencia /ejercicios José A. Mañas http://jungla.dit.upm.es/~pepe/doc/adsw/index.html 3.4.2014 ejercicio 1.1 programar una cuenta bancaria compartida 1.

Más detalles

3.9 Patrón Distributed callback

3.9 Patrón Distributed callback 3.9 Patrón Distributed callback Motivación (1) Queremos que la aplicación de administración de los termostatos Monitorize la temperatura de algunos termostatos, avisándonos si ésta baja o sube por encima

Más detalles

Definición de clases: Herencia, polimorfismo, ligadura dinámica

Definición de clases: Herencia, polimorfismo, ligadura dinámica Tema 7 Definición de clases: Herencia, polimorfismo, ligadura dinámica Con alguna frecuencia es necesario definir clases de objetos entre las cuales hay elementos comunes. En una aplicación en la cual

Más detalles

En cualquier caso, tampoco es demasiado importante el significado de la "B", si es que lo tiene, lo interesante realmente es el algoritmo.

En cualquier caso, tampoco es demasiado importante el significado de la B, si es que lo tiene, lo interesante realmente es el algoritmo. Arboles-B Características Los árboles-b son árboles de búsqueda. La "B" probablemente se debe a que el algoritmo fue desarrollado por "Rudolf Bayer" y "Eduard M. McCreight", que trabajan para la empresa

Más detalles

Clases abstractas e interfaces

Clases abstractas e interfaces Clases abstractas e interfaces Clases abstractas Una clase abstracta es una clase que no se puede instanciar se usa únicamente para definir subclases Cuándo es una clase abstracta? En cuanto uno de sus

Más detalles

INTRODUCCION A LA PROGRAMACION DE PLC

INTRODUCCION A LA PROGRAMACION DE PLC INTRODUCCION A LA PROGRAMACION DE PLC Esta guía se utilizará para estudiar la estructura general de programación de um PLC Instrucciones y Programas Una instrucción u orden de trabajo consta de dos partes

Más detalles

Manual Oficina Web de Clubes (FBM)

Manual Oficina Web de Clubes (FBM) Manual Oficina Web de Clubes (FBM) INTRODUCCIÓN: La Oficina Web de Clubes de Intrafeb es la oficina virtual desde la que un club podrá realizar las siguientes operaciones durante la temporada: 1. Ver información

Más detalles

Mensajes. (versión preliminar)

Mensajes. (versión preliminar) Mensajes (versión preliminar) Ejemplo: productor/consumidor con buffer de tamaño 0 void produce(item *p_it); void consume(item *p_it); int nmain() { ntask cons= nemittask(consproc); ntask prod= nemittask(prodproc,

Más detalles

PROCEDIMIENTO DE GESTIÓN PARA NOMBRES DE DOMINIO Y CONTACTOS EN.CL

PROCEDIMIENTO DE GESTIÓN PARA NOMBRES DE DOMINIO Y CONTACTOS EN.CL PROCEDIMIENTO DE GESTIÓN PARA NOMBRES DE DOMINIO Y CONTACTOS EN.CL Este documento establece el procedimiento de gestión para Nombres de Dominio y Contactos en.cl, el cual forma parte de la Reglamentación

Más detalles