Programación Concurrente en Java

Documentos relacionados
Programación Orientada a Eventos

1 HILOS (THREADS) EN JAVA

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

PROGRAMACIÓN EN JAVA

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

Federico Peinado

Concurrencia en Java

Concurrencia. Primitivas IPC con bloqueo

Programación Concurrente en Java

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

Benemérita Universidad Autónoma del Estado de Puebla

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

Benemérita Universidad Autónoma del Estado de Puebla

CDI Exclusión mutua a nivel alto. conceptos

Multitarea en Java. Rafa Caballero - UCM

Java: Programación Multithread

Java y JVM: programación concurrente

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

Object 1. Threads en Java

Concurrencia en Android LSUB, GYSC, URJC

Programación Concurrente. Curso Java 2012, 2013 Juan Manuel Fernández Peña

Concurrencia: Exclusión mutua y Sincronización

Procesos. Planificación del Procesador.

Concurrencia en Java

Concurrencia entre Procesos.

Arquitecturas cliente/servidor

Mensajes. Interbloqueo

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

Sistemas Operativos. Curso 2016 Procesos

3.9 Patrón Distributed callback

SIMM: TEORÍA DE LOS S.O. I.E.S. JUAN DE LA CIERVA CURSO 2007/2008

Monitores Ing. Iván Medrano Valencia

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

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

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

4. Programación Paralela

Concurrencia en.net David Jesús Horat Flotats

Hebras y Sincronización en Java

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

Secretos de la Programación Concurrente

Ingeniería Superior de Informática. Curso 3º. Sistemas Operativos. Examen Final. TEORÍA. 31 de Enero de 2005

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

Modulo 1 El lenguaje Java

Caso práctico Alquiler de películas en un vídeo-club

class Nombre_Clase extends Nombre_SuperClase { cuerpo de la clase extendida }

Mensajes. (versión preliminar)

El lenguaje de programación Java

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

Hilos en Java. Crear un Hilo. Detener un hilo. Fuente:

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

Sistemas Operativos. Características de la Multiprogramación. Interacción entre Procesos. Características de la Multiprogramación

Unidad 2: Gestión de Procesos

1. Manejo de memoria estática 2. Manejo de memoria dinámica

Arquitectura de sistema de alta disponibilidad

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

RESUMEN DE CONCEPTOS BASICOS DE PROGRAMACION JAVA

Introducción a la programación orientada a objetos

Gestión de procesos DEFINICIONES DE PROCESOS

Cliente/Servidor en Java

UNIVERSIDAD CARLOS III DE MADRID DEPARTAMENTO DE INGENIERÍA TELEMÁTICA. Daniel Díaz Sánchez

Estructura de datos tipo vector.

Programación multihebra

Programación orientada a objetos

Programación concurrente en Java

Curso de Java POO: Programación orientada a objetos

Programación Avanzada para Sistemas de Telecomunicación. Objetos y clases. J.C. Cruellas. Objetos y clases

un programa concurrente

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

Tema 4. Gestión de entrada/salida

Threads o Hilos. Marco Besteiro y Miguel Rodríguez

Paradigmas de Programación

Procesos. Bibliografía. Threads y procesos. Definiciones

Sistemas Operativos II Febrero 2009 Nombre:

CONCURRENCIA EN JAVA. Diseño de Sistemas Operativos Avanzados 2000/2001. Pedro Pablo Gómez Martín

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

Manual del Protocolo XML-RPC de Mensajería Negocios

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

Computación III. Objetivo de aprendizaje del tema

PROGRAMACIÓN CLIENTE-SERVIDOR MEDIANTE SOCKETS EN JAVA

Trabajo Práctico N 4: Diseño por Contratos

dit UPM Tema 3: Concurrencia /ejercicios Análisis y diseño de software José A. Mañas

2. Estructura de un programa en Java

15. Parámetros o argumentos

Contenido. Qué es el interbloqueo? Cómo prevenirlo? Cómo evitarlo? Cómo detectarlo? Interbloqueo. Cruce en un Puente. Qué es?

Práctica 4: Java Remote Method Invocation (RMI)

Modelo de aplicaciones CUDA

Modelo de Objetos Distribuidos

Examen Febrero de 2012

Introducción a la Programación Orientada a Objetos

2.2.- Paradigmas de la POO

El soporte del sistema operativo. Hace que un computador sea más fácil de usar. Permite que los recursos del computador se aprovechen mejor.

DISEÑO DE UNA ARQUITECTURA CLIENTE/SERVIDOR MEDIANTE OBJETOS DISTRIBUIDOS EN JAVA

IMPLEMENTACIÓN DE REDES DE PETRI CON TIEMPO EN JAVA

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

Programación Concurrente Recopilación de teoría referente a la materia

Requerimientos Principales de un Sistema Operativo. Descripción y Control de Procesos. Proceso

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

1. Qué tipos de relación hay entre las siguientes clases?

Guia para examen de Sistemas Operativos Para primer parcial Febrero 2013 Revisión 2 Ing. Julio Cesar Gonzalez Cervantes

Pruebas de unidad con JUnit

Transcripción:

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 en paralelo En un nodo, multiplexa el tiempo de procesador entre las tareas En un sistema distribuido, paralelismo real Las actividades deben cooperar entre sí Comunicación Sincronización Actividades = procesos o threads (hilos) 2

Utilidad de la programación concurrente Mejora las características de: Flexibilidad Interactividad Eficiencia Facilita el diseño de sistemas Reactivos (responden a estímulos externos) Con actividades lógicamente separadas y distintos niveles de prioridad Con actividades periódicas Ej.- atención a varios clientes, timeouts, etc. 3

Dificultades a resolver Puede darse cualquier intercalado de ejecución Los programas deben ser correctos bajo cualquier intercalado posible Ejemplo.- acceso a cuenta bancaria Posibles interferencias entre tareas Resultado incorrecto bajo ciertos intercalados (no determinismo) Vivacidad, interbloqueos 4

Proceso Abstracción proporcionada por el SO (ej Unix) El SO planifica y ejecuta varios procesos Algoritmo de planificación Cooperativo (cada proceso se autolimita) Expulsivo (el sistema limita el tiempo dedicado a cada proceso) Cada proceso mantiene su propio estado Pila Áreas de datos Ficheros abiertos, etc. Existe una jerarquía de objetos (relación padre-hijo) Padre e hijo comparten información Ficheros abiertos Pipes y streams Sockets Pueden comunicarse/sincronizarse 5

Thread (Thread=hilo=proceso ligero) Hilos = Actividades concurrentes dentro de un proceso Comparten el contexto del proceso padre Variables compartidas Ficheros abiertos, etc. Pero cada hilo mantiene una parte local Pila local Variables locales, etc Creación/destrucción/comunicación/cambio estado mucho más eficiente que con procesos La memoria compartida facilita la comunicación y sincronización Pero aparecen posibles interferencias Nos centramos en hilos (Threads) Asumimos acceso a variables comunes 6

Interferencias Muchas operaciones suponen tanto lecturas como escrituras Ej.- i++ consiste a bajo nivel en varias operaciones primitivas r<-[i], inc r, [i]<-r Esas operaciones no se tratan como atómicas El planificador puede interrumpirla en cualquier punto, cediendo el control a otro hilo Puede darse cualquier intercalado de ejecución Ej dos hilos A, B ejecutan concurrentemente sendas instrucciones i++ A ejecuta r<-[i] B ejecuta i++ (todos los pasos) A ejecuta inc r, [i]<-r Hemos perdido el cambio introducido por B Solución Concepto de sección crítica (exlusión mútua) Sincronización (reservas, semáforos, monitores, etc.) 7

Porqué Java? Incorpora construcciones para Programación Concurrente Los hilos forman parte del modelo del lenguaje Aplicación = hilos usuario + hilos sistema (ej.- para GC y GUI) Hilos usuario.- uno para el método main(), y podemos crear otros La aplicación termina cuando finalizan todos sus hilos usuario Facilita el desarrollo de aplicaciones concurrentes Lenguaje conocido (Prog. Avanzada) Demandado por el mercado Además Facilidades para programación en red Plataforma de distribución de bajo nivel Facilidades para Objetos Distribuidos Plataforma de distribución de nivel intermedio 8

Prog. Concurrente en Java Creación de hilos Ej.- Servidor multi-hilo Ciclo de vida de los hilos Estados de un hilo vivo Sincronización Exclusión mútua Espera y notificación Ejemplo Interbloqueos 9

Creación de hilos Crear nueva clase como extensión de Thread class X extends Thread { public void run() {.. // codigo del hilo X h= new X(); h.start(); Implementar interface Runnable class X implements Runnable { Public void run() {.. // codigo del hilo.. Thread h= new Thread(new X()); h.start(); La actividad se inicia al aplicar el método start sobre el objeto hilo 10

Creación de hilos.- ej 11 import java.io.*; public class T extends Thread { protected int n; Public static void main(string[] argv) { for (int i = 0; i<3; i++) new T(i).start(); public T(int n) {this.n = n; public void run() { int i = 0; while (count < 5) { System.out.println( Hilo " + n + " iteracion " + i++); try {sleep((n + 1) * 1000); catch(interruptedexception e) {e.printstacktrace(); System.out.println( El hilo " + n + " ha terminado");

Estructura de un servidor Servidor secuencial while (msg = getmessage()) Gestiona el mensaje Servidor concurrente while (msg = getmessage()) Crea nueva tarea para gestionar el mensaje El servidor concurrente puede atender varios clientes simultáneamente 12

Ciclo de vida de los hilos new() Creado start() Vivo Stop() Stop(), end() Finalizado 13

Estados de un hilo vivo start() Preparado dispatch yield() Ejecución Stop() suspend() resume() Espera sleep(), suspend() end 14

Estados de un hilo vivo start inicia la ejecución de run isalive cierto si tarea iniciada y no finalizada stop Finaliza la tarea suspend Suspende temporalmente la tarea (hasta resume ) sleep Suspende la tarea un periodo especificado (en milisegundos) join Suspende hasta que finaliza otra tarea interrupt Aborta la espera iniciada con sleep, wait o join 15

Ejemplo de interferencias Suponemos un conjunto de cuentas bancarias Varios hilos utilizan esas cuentas Cada hilo usa dos cuentas, transfiriendo n unidades de la primera a la segunda La selección de la cuenta destino y la cantidad son aleatorias Cada hilo cede el control (yield) en mitad de una transferencia Simula una posible expulsión por parte del SO Con ello aumentamos la probabilidad de interferencias La suma total (valor acumulado de todas las cuentas) debe ser constante 16

Ejemplo de interferencias 17 import java.io.*; public class Interferencias { public static void main(string[] args) { Banco b = new Banco(10, 1000); for (int i =0; i <numcuentas; i++) (new Transf(b, i, sadoinicial)).start(); class Banco { private int[] cuenta; private long ntransf = 0; public int size() {return cuenta.length; public Banco(int n, int v0) { cuenta = new int[n]; ntransf = 0; for (int i = 0; i < size(); i++) cuenta[i] = v0; public void transfiere(int from, int to, int n) { if (cuenta[from] < n) return; cuenta[from] -= n; Thread.currentThread().yield(); cuenta[to] += n; if (++ntransf % 10 == 0) test(); public void test() { int total = 0; for (int i = 0; i<size(); i++) total+= cuenta[i]; System.out.println("Transferencias:"+ catch(interruptedexception e) { ntransf + 09/02/2007 Prog. Distribuida " Total: " + total); bajo Internet class Transf extends Thread { private Banco banco; private int from, max; private int rand(int n) {(int)n*math.random(); public Transf (Banco b, int from, int max) { banco = b; This.from = from; this.max = max; public void run() { try { while (!interrupted()) { banco.transfiere(from, rand(banco.size()), rand(max)); sleep(1);

Sincronización y exclusión mútua 18 Las tareas deben cooperar entre sí Comparten objetos Ej. una tarea modifica el estado del objeto, otra lo consulta Pueden haber interferencias Sólo pueden aparecer en fragmentos de código que acceden a objetos compartidos Solución = garantizar ejecución secuencial de dichos fragmentos de código = exclusión mútua Palabra reservada synchronized Puede aplicarse a métodos: synchronized void m() {.. Y a bloques de código: synchronized(objeto) {.. Se interpreta como una sección crítica que impide la ejecución simultánea de otros métodos sincronizados La usamos para todo recurso que requiere acceso atómico

Ejemplo revisado En el ejemplo anterior teníamos problemas de interferencias en el acceso a las cuentas Usamos synchronized en las funciones que acceden a las cuentas (transferencia y test) public synchronized void transferencia(..).. public synchronized void test(..).. Con ello corregimos el problema Pero restringimos demasiado la concurrencia Dos transferencias que trabajan sobre cuentas distintas no pueden interferir entre sí, pero las ejecutamos en exclusión mútua La solución es restringir el acceso únicamente a las dos cuentas utilizadas por cada hilo 19

Espera y notificación 20 Método parcial = método que sólo debe activarse en determinados estados del objeto Ej.- extraer de una lista (sólo si no vacía) Métodos parciales en objetos compartidos Si un hilo invoca un método parcial en un estado incorrecto, debe esperar Cuando otro hilo modifica el estado debe notificar el cambio a un hipotético hilo en espera (notificación) Métodos de sincronización wait.- suspende hilo, libera exclusión mútua notify.- reactiva uno de los hilos suspendidos por wait notifyall.- idem., pero los reactiva todos

Ejemplo de espera y notificación 21 Productor consumidor Una hilo genera valores y los inserta en una cola Otro hilo extrae valores de la cola y los escribe en pantalla La cola mantiene orden FIFO (first-in first-out) Implementamos la cola como vector circular Vector de enteros de talla N Permite almacenar hasta N valores generados y todavía no consumidos Tres variables que representan el índice donde insertar, índice donde extraer, y número de elementos (i,e,n) Operaciones void put(int x) int get() boolean lleno() boolean vacio()

Ejemplo de espera y notificación 22 public class prodcons { public static void main(char[] args) { Buffer b= new Buffer(4); (new Productor(b,20)).start(); (new Consumidor(b)).start(); class Productor extends Thread { private int N; public Productor (int max) {N=max; public void run() { for (int i=0; i<n; i++) b.put(i); b.put(-1); System.out.println( Fin del productor ); class Consumidor extends Thread { public void run() { do{ int x=b.get(); System.out.println( +x); while (x>=0); System.out.println( Fin del consumidor ); class Buffer { private int[] v; private int N, n, i, e; private boolean lleno() {return n==n; private boolean vacio() {return n==0; public Buffer(int max) { N=max; n=e=i=0; v=new int[n]; public synchronized void put(int x) { while (lleno()) wait(); v[i]=x; i=(i+1)%n; n++; notifyall(); public synchronized int get() { while (vacio()) wait(); int x=v[e]; e=(e+1)%n; n--; notifyall(); return x;

Interbloqueos Interbloqueo = dos o más procesos se están esperando mutuamente Los hilos utilizan recursos (hard o soft). Ej.- cuentas del banco Para evitar interferencias los recursos se solicitan antes de su uso, y se liberan tras su uso Si un hilo solicita un recurso asignado a otro hilo, debe esperar Es posible que A espera un recurso asigando a B, mientras B espera un recurso asignado a A Nunca podrán salir de esa situación Ej Dos procesos Unix establecen comunicación bidireccional con dos pipes Cruce de calles con prioridad para derecha libre Puente estrecho Banco cuando bloqueamos sólo las cuentas afectadas por la transferencia pide(from); pide(to); transfiere(n); libera(from); libera(to); 23

Análisis del problema Condiciones de Coffman (necesarias para interbloqueo) Exclusión mútua.- queremos compartir recursos que no se pueden usar de forma simultánea Uso y espera.- los recursos se solicitan y obtienen progresivamente No expulsión.- sólo puede liberar un recurso quien lo usa Espera circular.- espera mútua (ciclo en el GAR) Grafo de asignación de recursos (GAR) Representamos hilos y recursos Si un hilo solicita un recurso, dibujamos un arco del hilo al recurso Si un recurso está asignado a un hilo, dibujamos un arco del recurso al hilo 24

Solución Prevención Consiste en romper alguna de las condiciones de Coffman En muchos casos costoso o imposible La más fácil de romper suele ser la espera circular Ej.- En el caso del banco siempre ordenamos las cuentas en orden creciente (pedimos primero la menor, y luego la mayor) Evitación.- Antes de asignar un recurso solicitado, analizamos si puede conducir a interbloqueos (algoritmo del banquero) Detección Detección de ciclos en el GAR 25