Programación Concurrente y Distribuida PDF
Document Details

Uploaded by PreferableGingko
Universidad Europea de Madrid
Tags
Summary
Este documento resume los conceptos de programación concurrente y distribuida, incluyendo diferencias y ejemplos prácticos. Explica conceptos como la concurrencia, el paralelismo y la computación distribuida. Se explora la gestión de recursos en programas concurrentes, las condiciones de carrera y los bloqueos. Además, introduce arquitecturas en sistemas concurrentes y las condiciones de Bernstein con sus grafos de precedencia.
Full Transcript
Programación Concurrente y Distribuida Tema 1. Introducción a la programación concurrente Computación en Sistemas Distribuidos Computación concurrente, computación paralela y computación distribuida Programación Concurrente y Distribuida ¡PREGUNTA! ¿Cuál es la diferencia entre computación...
Programación Concurrente y Distribuida Tema 1. Introducción a la programación concurrente Computación en Sistemas Distribuidos Computación concurrente, computación paralela y computación distribuida Programación Concurrente y Distribuida ¡PREGUNTA! ¿Cuál es la diferencia entre computación concurrente y computación distribuida? Programación Concurrente y Distribuida ¿Cuál es la diferencia entre computación concurrente y computación distribuida? Concurrente: Sucede en el mismo intervalo de tiempo. Cuando los computadores tenían una única CPU y todos los procesos que se ejecutaban en un momento dado recibían “porciones” de tiempo de procesador. Los procesos eran concurrentes pero no paralelos. No hay comunicación ni coordinación entre los avances de los procesos. Programación Concurrente y Distribuida ¿Cuál es la diferencia entre computación concurrente y computación distribuida? Paralelismo: Se ejecuta al mismo tiempo. La computación paralela por definición requiere múltiples CPUs. En esta situación, más de un proceso concurrente puede ejecutarse simultáneamente. Al igual que con el procesamiento concurrente, no hay comunicación ni coordinación entre los avances de los procesos. Programación Concurrente y Distribuida ¿Cuál es la diferencia entre computación concurrente y computación distribuida? Programación Concurrente y Distribuida ¿Cuál es la diferencia entre computación concurrente y computación distribuida? Computación paralela Programación Concurrente y Distribuida ¿Cuál es la diferencia entre computación concurrente y computación distribuida? Computación paralela Ejemplo: Cálculo de una nómina Programación Concurrente y Distribuida ¿Cuál es la diferencia entre computación concurrente y computación distribuida? Distribuido: Varios programas se ejecutan simultáneamente y se comunican entre sí para realizar un cómputo colectivamente. La esencia de la computación distribuida es que una computación general se “distribuye” en múltiples procesos (generalmente, casi siempre, pero no necesariamente, usando múltiples procesadores) que realizan la tarea computacional general mediante la comunicación entre los procesos. Programación Concurrente y Distribuida Concepto de concurrencia Programación Concurrente y Distribuida Computación concurrente y computación distribuida Programa secuencial nos referimos a un programa formado por instrucciones que se ejecutan una tras otra. Un proceso secuencial es un programa en ejecución. Un programa concurrente está formado por dos o más programas secuenciales que se ejecutan concurrentemente. Programación Concurrente y Distribuida Computación concurrente y computación distribuida Ejecución paralela o concurrencia real, para que este caso se pueda dar necesitamos que existan tantos procesadores como procesos. Ejecución pseudo paralela o concurrente simulada, en este caso, tendremos más procesos que procesadores, por lo que los procesadores tendrán que repartirse el trabajo de ejecución de los procesos. Programación Concurrente y Distribuida ¡PREGUNTA! ¿Qué es la programación concurrente? Programación Concurrente y Distribuida Computación concurrente y computación distribuida Simplificando … , es cuando se realiza más de una cosa al mismo tiempo. No debe confundirse con el paralelismo, la programación concurrente o de concurrencia es cuando se ejecutan múltiples secuencias de operaciones en períodos de tiempo superpuestos. En el ámbito de la programación, la concurrencia es un tema bastante complejo. Tratar con estructuras como subprocesos (threads) y bloqueos (locks) y evitar problemas como “race conditions” (condiciones de carrera) y “deadlocks”puede ser bastante complicado, lo que dificulta la escritura de programas concurrentes. Programación Concurrente y Distribuida Computación concurrente y computación distribuida “race conditions” (condiciones de carrera) y “deadlocks” Una condición de carrera ocurre cuando dos o más subprocesos pueden acceder a datos compartidos e intentan cambiarlos al mismo tiempo. Debido a que el algoritmo de programación de subprocesos puede cambiar de subproceso en cualquier momento, no se sabe el orden en el que los subprocesos intentarán acceder a los datos compartidos. Por lo tanto, el resultado del cambio de datos depende del algoritmo de programación de subprocesos, es decir, ambos subprocesos están "compitiendo" para acceder a los datos o cambiarlos. Programación Concurrente y Distribuida Computación concurrente y computación distribuida “race conditions” (condiciones de carrera) y “deadlocks” Un bloqueo se produce cuando varios procesos intentan acceder al mismo recurso al mismo tiempo. Un proceso esperar a que el otro termine. Un “deadlocks” o punto muerto se produce cuando el proceso que está esperando todavía tiene otro recurso que el primero necesita antes de poder terminar. Programación Concurrente y Distribuida Computación concurrente y computación distribuida “race conditions” (condiciones de carrera) y “deadlocks” Un “deadlocks” o punto muerto, ejemplo: El proceso X y el proceso Y utilizan el recurso A y el recurso B X empieza a utilizar A. X e Y intentan empezar a utilizar B Y "gana" y obtiene B primero Ahora Y necesita utilizar A X bloquea A y espera a Y Programación Concurrente y Distribuida Arquitecturas en sistemas concurrentes Programación Concurrente y Distribuida Computación concurrente y computación distribuida El paralelismo se puede dar en tres sistemas físicos distintos: Sistemas multiprocesadores. Disponen de una memoria que es común a todos los procesos con independencia de que cada proceso pueda disponer de una memoria local. Sistemas distribuidos. No se disponen de memoria común, sino que cada proceso posee su propia memoria local. Sistemas de tiempo compartido. A los sistemas multiprocesadores y a los de tiempo compartido los podemos agrupar como entornos centralizados. Programación Concurrente y Distribuida Computación concurrente y computación distribuida El paralelismo se puede dar en tres sistemas físicos distintos: Sistemas multiprocesadores. Programación Concurrente y Distribuida Computación concurrente y computación distribuida Sistemas distribuidos. Programación Concurrente y Distribuida Computación concurrente y computación distribuida Sistemas de tiempo compartido. Programación Concurrente y Distribuida Computación concurrente y computación distribuida Algunos sistemas distribuidos se permite que un proceso pueda acceder a la memoria de otro, pero solo para leer. Esto permite conocer el estado de los procesos un proceso no permitirá nunca que otro modifique sus variables. Programación Concurrente y Distribuida ¡PREGUNTA! ¿Ventajas de la Programación Concurrente? Programación Concurrente y Distribuida Computación concurrente y computación distribuida Velocidad de ejecución Existen aplicaciones donde la velocidad de respuesta es crítica. Tenemos un número de procesos > número de procesadores. No es aplicable la programación paralela. No coincide número de procesos y procesadores. La programación concurrente puede mejorar el tiempo de respuesta. Solución de problemas concurrentes Realizar cálculos de forma más rápida si existen varias CPU. Simulaciones físicas que no pueden realizarse de forma secuencial Todo tipo de servidores: atender varias peticiones a la vez. Aplicaciones con GUI. Sistemas empotrados donde se reacciona a diversos tipos de entrada en tiempo real. Programación Concurrente y Distribuida Condiciones de Bernstein en la Programación Concurrente Programación Concurrente y Distribuida ¡PREGUNTA! ¿Qué son las Condiciones de Bernstein? Programación Concurrente y Distribuida Computación concurrente y computación distribuida Las Condiciones de Bernstein sirven para poder determinar si dos conjuntos de instrucciones Si y Sj, pueden ser ejecutadas concurrentemente Sea Sk un conjunto de instrucciones Se definen los siguientes conjuntos sobre las sentencias El conjunto de lectura de una sentencia, son las variables cuyo valor es usado en la sentencia para la lectura, se denomina R(sentencia). El conjunto de escritura de una sentencia son las variables cuyo valor es modificado en la sentencia, a este conjunto se le denomina W(sentencia). Programación Concurrente y Distribuida Computación concurrente y computación distribuida Para que dos conjuntos de instrucciones se puedan ejecutar concurrentemente se tiene que cumplir las siguientes condiciones: 1. R(S1) ∩ W(S2) = {x, y} ∩ {b} = ∅ = { }. El conjunto de lectura de la sentencia S1 intersección con el conjunto de escritura de la sentencia S2 debe de resultar el conjunto vacío, es decir, el conjunto de lectura de S1 y de S2 no tienen variables en común. 2. W(S1) ∩ R(S2) = {a} ∩ {z} = ∅ = { } El conjunto de escritura de la sentencia S1 intersección con el conjunto de lectura de la sentencia S2 debe de resultar el conjunto vacío, es decir, el conjunto de escritura de S1 y el conjunto de lectura de S2 no tienen variables en común. 3. W(S1) ∩ W(S2) = {a} ∩ {b} = ∅ = { } El conjunto de escritura de la sentencia S1 intersección con el conjunto de escritura de la sentencia S2 debe de resultar el conjunto vacío, es decir, el conjunto de escritura de S1 y de S2 no tienen variables en común. También se podría representar como: Read set(Si) ∩ Write set(Sj) = ϕ Write set(Si) ∩ Read set(Sj) = ϕ Write set(Si) ∩ Write set(Sj) = ϕ Programación Concurrente y Distribuida Grafos de Precedencia en la Programación Concurrente Programación Concurrente y Distribuida Computación concurrente y computación distribuida Gráficos de precedencia begin Sentencias S1: par begin par begin - par end begin o S2; Co begin - Co end S6; end begin S3; Los programas con CoBegin/CoEnd S7; continuarán cuando se termine de ejecutar el código end que se encuentra entre las dos sentencias. S4; S5; par end S8; end (*) PARBEGIN/PAREND es también designado como COBEGIN/COEND. Programación Concurrente y Distribuida Computación concurrente y computación distribuida Gráficos de precedencia Sentencias fork y join La sentencia fork hace que un proceso empiece a ejecutarse concurrentemente con las sentencias que se encuentran a continuación del fork en el programa. La sentencia join indica que el programa debe de detenerse hasta que el proceso invocado finalice su ejecución. Fork-join: estilo de paralelización donde el cómputo (task) es partido en sub-cómputos menores (subtasks). Los resultados de estos se unen (join) para construir la solución al cómputo inicial. Programación Concurrente y Distribuida Computación concurrente y computación distribuida Gráficos de precedencia Sentencias fork y join Características principales: Los sub-cómputos son independientes para que el cómputo se pueda realizar en paralelo. Las sub-tareas se pueden crear en cualquier momento de la ejecución de la tarea. Las tareas no deben bloquearse, excepto para esperar el final de las subtareas. Programación Concurrente y Distribuida Computación concurrente y computación distribuida Gráficos de precedencia Sentencias fork y join Programación Concurrente y Distribuida Características de los Sistemas Concurrentes Programación Concurrente y Distribuida Computación concurrente y computación distribuida Características de los sistemas concurrentes vs secuenciales En un programa secuencial se ejecutan las instrucciones en un orden predefinido. El resultado final no depende de la velocidad de ejecución del código, su comportamiento es reproducible, es decir, sabemos cómo se va a ejecutar. Programación Concurrente y Distribuida Computación concurrente y computación distribuida Características de los sistemas concurrentes vs secuenciales En una programación concurrente El resultado depende de la velocidad del código. El comportamiento no es reproducible. Es no determinista, es decir, existe una incertidumbre acerca del orden en que se van a ejecutar las instrucciones. Hay que tomar medidas para no obtener distintos resultados con cada ejecución del programa concurrente. Se producen o no errores transitorios dependiendo de los caminos que se siga en la ejecución. Estos errores son difíciles de detectar. Programación Concurrente y Distribuida Computación concurrente y computación distribuida Características de los sistemas concurrentes vs secuenciales Indeterminismo en la programación concurrente El orden parcial produce consecuentemente un comportamiento indeterminista. Es decir, repetidas ejecuciones sobre un mismo conjunto de datos resultan diferentes resultados. Programación Concurrente y Distribuida Computación concurrente y computación distribuida Características de los sistemas concurrentes vs secuenciales En una programación concurrente Programación Concurrente y Distribuida Problemas en la Programación Concurrente Programación Concurrente y Distribuida Computación concurrente y computación distribuida Problemas en la programación concurrente Un programa secuencial es correcto cuando al terminar el programa produce el resultado esperado. Un programa concurrente no tiene por qué terminar (son varios procesos que se entrelazan) y además no produce siempre el resultado esperado, por tanto, diremos que es correcto si se verifican determinadas propiedades de seguridad y de vivacidad. Programación Concurrente y Distribuida Computación concurrente y computación distribuida Problemas en la programación concurrente Propiedades de seguridad Las propiedades de seguridad que debe cumplir el sistema para no llegar a un estado incorrecto son: Exclusión mutua: todas las secciones críticas se ejecutan de forma indivisible. Sincronización: intercambio de información para coordinar actividades. Programación Concurrente y Distribuida Computación concurrente y computación distribuida Problemas en la programación concurrente Propiedades de vivacidad Las propiedades de vivacidad que debe cumplir el sistema para que tenga un progreso constructivo son: No Deadlock: esta situación se conoce con el nombre de interbloqueo y se produce cuando los procesos quedan parados indefinidamente por falta de vivacidad total o falta de vivacidad parcial: Vivacidad total: aparece cuando todo el sistema se paraliza indefinidamente. Vivacidad parcial: aparece cuando parte del sistema se paraliza indefinidamente. No Livelock: Livelock es la situación que se caracteriza por que todo el sistema o parte de él se encuentra realizando operaciones inútiles o no constructivas indefinidamente. Programación Concurrente y Distribuida Computación concurrente y computación distribuida Problemas en la programación concurrente Propiedades de vivacidad Las propiedades de vivacidad que debe cumplir el sistema para que tenga un progreso constructivo son: Equitatividad: también conocida como Starvation, que se da cuando hay procesos del sistema que son discriminados sistemáticamente. Diferencia entre Livelock y DeadLock: En Livelock el sistema se encuentra en ejecución, pero atrapado en un bucle infinito En Deadlock el proceso se encuentra parado y por tanto no consume tiempo de procesador. Programación Concurrente y Distribuida Computación concurrente y computación distribuida Problemas en la programación concurrente // Counting.java public class Counting { public static void main(String[] args) throws InterruptedException { class Counter { int counter = 0; public void increment() { counter++; } public int get() { return counter; } } final Counter counter = new Counter(); class CountingThread extends Thread { public void run() { for (int x = 0; x < 500000; x++) { counter.increment(); } En cada ejecución del programa obtenemos } diferentes resultados } CountingThread t1 = new CountingThread(); CountingThread t2 = new CountingThread(); t1.start(); t2.start(); t1.join(); t2.join(); System.out.println(counter.get()); } } Computación en Sistemas Distribuidos ¡Muchas Gracias! ¿Preguntas? Programación Concurrente y Distribuida Tema 2. Procesos e hilos Computación en Sistemas Distribuidos Procesos e Hilos Computación en Sistemas Distribuidos Programación Concurrente y Distribuida ¡PREGUNTA! ¿Qué es un proceso? Programación Concurrente y Distribuida Procesos e Hilos Un proceso es la unidad básica de trabajo dentro de un sistema operativo, el cual, sistema operativo, se encarga de que se ejecuten (los procesos) y de proporcionar los recursos necesarios para ello. Programación Concurrente y Distribuida Procesos e Hilos Existen dos aspectos diferenciados dentro de los procesos: ejecución y posesión de recursos. Un proceso se puede observar como una o más unidades de ejecución, denominadas hilos, threads o hebras y un conjunto de recursos vinculados. También hilos o threads también se denominan procesos ligeros. Programación Concurrente y Distribuida Procesos e Hilos Programación Concurrente y Distribuida Procesos e Hilos Programa secuencial (*) https://jarroba.com/multitarea-e-hilos-en-java-con-ejemplos-thread-runnable/ Programación Concurrente y Distribuida Procesos e Hilos Programa multihilo o multitarea o multithread (*) https://jarroba.com/multitarea-e-hilos-en-java-con-ejemplos-thread-runnable/ Programación Concurrente y Distribuida Procesos e Hilos Programa multihilo o multitarea o multithread mkdir programacion_concurrente cd programacion_concurrente vi Cajera.java vi Cliente.java vi Main.java javac -d. *.java java threadsJarroba.Main La cajera Cajera 1 COMIENZA A PROCESAR LA COMPRA DEL CLIENTE Cliente 1 EN EL TIEMPO: 0seg Procesado el producto 1 ->Tiempo: 2seg Procesado el producto 2 ->Tiempo: 4seg Procesado el producto 3 ->Tiempo: 5seg Procesado el producto 4 ->Tiempo: 10seg Procesado el producto 5 ->Tiempo: 12seg Procesado el producto 6 ->Tiempo: 15seg La cajera Cajera 1 HA TERMINADO DE PROCESAR Cliente 1 EN EL TIEMPO: 15seg La cajera Cajera 2 COMIENZA A PROCESAR LA COMPRA DEL CLIENTE Cliente 2 EN EL TIEMPO: 15seg Procesado el producto 1 ->Tiempo: 16seg Procesado el producto 2 ->Tiempo: 19seg Procesado el producto 3 ->Tiempo: 24seg Procesado el producto 4 ->Tiempo: 25seg Procesado el producto 5 ->Tiempo: 26seg La cajera Cajera 2 HA TERMINADO DE PROCESAR Cliente 2 EN EL TIEMPO: 26seg Computación en Sistemas Distribuidos Ventajas e inconvenientes Programación Concurrente y Distribuida Procesos e Hilos Programa multihilo o multitarea o multithread Programación Concurrente y Distribuida Procesos e Hilos Programa multihilo o multitarea o multithread La creación de un hilo dentro de un proceso requiere menos tiempo que la creación del propio proceso, ya que su ámbito se encuentra dentro del propio proceso, además de compartir memoria y ficheros asignados al proceso, lo que hace más rápida la comunicación y sincronización. Pueden comunicarse entre sí sin invocar al núcleo (no hay necesidad de protección). La coordinación es más rápida (vs. procesos, que deben enviarse mensajes). Aumenta eficiencia. Programación Concurrente y Distribuida Procesos e Hilos Programa multihilo o multitarea o multithread Programación Concurrente y Distribuida Procesos e Hilos Programa multihilo o multitarea o multithread Computación en Sistemas Distribuidos Estados de un hilo Programación Concurrente y Distribuida Procesos e Hilos Los cambios de estado de los hilos son: creación, bloqueo, desbloqueo y terminación. Programación Concurrente y Distribuida Procesos e Hilos Cuando un proceso se suspende, todos sus hilos son suspendidos, ya que comparten el mismo espacio de direcciones. Cuando un proceso se termina, todos sus hilos terminan. Programación Concurrente y Distribuida Procesos e Hilos Creación Cuando se crea un proceso, se crea un hilo. Los hilos pueden crear otros hilos pasándole el puntero de instrucción y los argumentos. Los hilos poseen su propio contexto y espacio de pila. De esta manera, un nuevo hilo pasará a la cola de listos. Programación Concurrente y Distribuida Procesos e Hilos Bloqueo Cuando se bloquea un hilo: Cuando se produce el bloqueo, se guarda el contexto del hilo (contador de programa, registros, puntero de pila). En hilos a nivel de núcleo, bloquea solo el hilo. En hilos a nivel de usuario, bloquea el proceso entero. Programación Concurrente y Distribuida Procesos e Hilos Desbloqueo Cuando se desbloquea un hilo: En hilos a nivel de núcleo, el hilo pasa a la cola de listos. En hilos a nivel de usuario, siendo el único, el proceso pasa a la cola de listos. Programación Concurrente y Distribuida Procesos e Hilos Terminación Cuando se termina un hilo, se libera su bloque de control y su pila. Programación Concurrente y Distribuida Procesos e Hilos Computación en Sistemas Distribuidos Niveles de uso de los hilos Computación en Sistemas Distribuidos Hilos a nivel de usuario Programación Concurrente y Distribuida Procesos e Hilos Niveles de uso de los hilos Hilos a nivel de usuario La aplicación realiza todo el trabajo de la gestión de hilos, mientras que el núcleo no tiene noción de la existencia de hilos. La biblioteca de hilos es la zona en la que los hilos se pueden: Crear o destruir (otros hilos). Intercambiar información entre hilos. Planificar la ejecución de los mismos. Salvar y restaurar el contexto de los mismos. Programación Concurrente y Distribuida Procesos e Hilos Ventajas y desventajas del uso de los hilos Computación en Sistemas Distribuidos Hilos a nivel de núcleo Programación Concurrente y Distribuida Procesos e Hilos Hilos a nivel de núcleo El núcleo mantiene la información de contexto del proceso y de los hilos. Los hilos son visibles por el núcleo. La planificación se realiza a nivel de los hilos. Los hilos del mismo o distinto proceso compiten por el procesador. Programación Concurrente y Distribuida Procesos e Hilos Hilos a nivel de núcleo. Ventajas y desventajas. Computación en Sistemas Distribuidos Combinación de los niveles Programación Concurrente y Distribuida Procesos e Hilos Combinación de los niveles La creación de hilos se da en el espacio de usuario. La planificación y sincronización se da en el espacio de usuario. Varios hilos de usuario se asocian con varios hilos a nivel de núcleo. Ventajas: o Los hilos de un mismo proceso se pueden ejecutar en paralelo en varios procesadores. o Las llamadas al sistema bloqueantes no necesitan bloquear todo el proceso. Computación en Sistemas Distribuidos Hilos en Java Programación Concurrente y Distribuida Procesos e Hilos Usando el método run() La manera más inmediata para que un programa sea multihilo pasa por heredar la clase thread, la cual posee el método run (), este método se invoca cuando se inicia un hilo. Para utilizarlo, debemos de redefinirlo y escribir el código que se ejecuta dentro del hilo, dentro de run (). Un hilo termina cuando finaliza el método run (). Programación Concurrente y Distribuida Procesos e Hilos Usando el método run() Programación Concurrente y Distribuida Procesos e Hilos Usando la interfaz runnable Existe otra manera de crear los hilos en Java, mediante la interfaz runnable. Si la clase implementa la interfaz Runnable, el hilo se puede ejecutar pasando una instancia de la clase al constructor de un objeto Thread y luego llamando al método start() del hilo Programación Concurrente y Distribuida Procesos e Hilos Usando la interfaz runnable Programación Concurrente y Distribuida Procesos e Hilos Problemas de concurrencia Dado que los subprocesos se ejecutan al mismo tiempo que otras partes del programa, no hay forma de saber en qué orden se ejecutará el código. Cuando los subprocesos y el programa principal leen y escriben las mismas variables, los valores son impredecibles. Los problemas que surgen de esto se denominan problemas de concurrencia. Programación Concurrente y Distribuida Procesos e Hilos Problemas de concurrencia Ejemplo Un ejemplo de código en el que el valor de la variable amount es impredecible: Programación Concurrente y Distribuida Procesos e Hilos Problemas de concurrencia Para evitar problemas de concurrencia, es mejor compartir la menor cantidad posible de atributos entre subprocesos. Si es necesario compartir atributos, una posible solución es utilizar el método isAlive() del subproceso para comprobar si el subproceso ha terminado de ejecutarse antes de utilizar cualquier atributo que el subproceso pueda cambiar. Programación Concurrente y Distribuida Procesos e Hilos Problemas de concurrencia Uso del método isAlive() Programación Concurrente y Distribuida Procesos e Hilos Hacer que un hilo espere a otros hilos Uso del método join() Programación Concurrente y Distribuida Procesos e Hilos Hacer que un hilo espere a otros hilos Uso del método join() Esta instrucción hace que el subproceso actual espere a que se complete el subproceso t1 antes de continuar. En el programa, el subproceso actual (principal) espera a que se complete el subproceso t1: Programación Concurrente y Distribuida Procesos e Hilos Hacer que un hilo espere a otros hilos Uso del método join() En este programa, el subproceso actual (principal) siempre termina después de que se complete el subproceso t1. Por lo tanto, el mensaje "Soy principal" siempre se imprime al final: Programación Concurrente y Distribuida Procesos e Hilos Hacer que un hilo espere a otros hilos Uso del método join() En este programa, el subproceso actual (principal) siempre termina después de que se complete el subproceso t1. Por lo tanto, el mensaje "Soy principal" siempre se imprime al final: Programación Concurrente y Distribuida Procesos e Hilos Hacer que un hilo espere a otros hilos Uso del método join() También puede unir varios subprocesos con el subproceso actual, por ejemplo: En este caso, el subproceso actual tiene que esperar a que se completen los tres subprocesos t1, t2 y t3 antes de poder reanudar la ejecución. Computación en Sistemas Distribuidos ¡Muchas Gracias! ¿Preguntas? Programación Concurrente y Distribuida Tema 3. Conceptos básicos de programación concurrente Alfonso Antolínez García ® 1 Computación en Sistemas Distribuidos Conceptos básicos de programación concurrente Alfonso Antolínez García ® Programación Concurrente y Distribuida ¡PREGUNTA! ¿Cuáles son los conceptos básicos de programación concurrente? Alfonso Antolínez García ® Programación Concurrente y Distribuida Conceptos básicos de programación concurrente Abstracción, Interfoliación (Intercalación, mezclado, etc.), Atomicidad, Corrección, Seguridad Vivacidad Equidad Alfonso Antolínez García ® Programación Concurrente y Distribuida Conceptos básicos de programación concurrente Abstracción/Abstraction Entendemos por abstracción la capacidad de aislar y encapsular la información del diseño y la ejecución. La principal abstracción, que nos permite desarrollar y describir sistemas complejos, es la que denominamos encapsulamiento. La abstracción en programación concurrente es el estudio de la ejecución interfoliada/interleaved de secuencias de instrucciones atómicas que pertenecen a procesos secuenciales (procesos secuenciales normales (con E/S) y ejecutados simultáneamente). Alfonso Antolínez García ® Programación Concurrente y Distribuida Conceptos básicos de programación concurrente Interfoliación/Intercalación Interfoliar equivale a mezclar. Un programa concurrente consta de un conjunto de procesos secuenciales que se ejecutan simultáneamente. Alfonso Antolínez García ® Programación Concurrente y Distribuida Conceptos básicos de programación concurrente Interfoliación/Intercalación Suponemos: Dos procesos en la misma computadora, pero distintas CPU (abstracción), y dos tipos de interacciones entre procesos: - Contención: dos procesos o más compiten por el mismo recurso o deben acceder a la misma información. - Comunicación: dos procesos o más deben comunicarse entre sí para intercambiar algún tipo de información. Este paso de mensajes de un proceso a otro permite la sincronización. Alfonso Antolínez García ® Programación Concurrente y Distribuida Conceptos básicos de programación concurrente Interfoliación Alfonso Antolínez García ® Programación Concurrente y Distribuida Conceptos básicos de programación concurrente Atomicidad En la definición de modelo de concurrencia aparece el concepto de instrucciones atómicas. Instrucciones atómicas son aquellas instrucciones cuya ejecución no puede ser interfoliada. Una definición más formal …→ Alfonso Antolínez García ® Programación Concurrente y Distribuida Conceptos básicos de programación concurrente Atomicidad Una operación atómica se refiere a un concepto fundamental en informática y programación, que representa una unidad de trabajo que es indivisible y que se garantiza que se ejecutará como una operación única, coherente e ininterrumpida. En esencia, una operación atómica es un conjunto de instrucciones que se ejecutan secuencialmente sin ninguna interrupción o interferencia de otros procesos o subprocesos concurrentes. Alfonso Antolínez García ® Programación Concurrente y Distribuida ¡PREGUNTA! ¿Por qué son importantes las operaciones atómicas? Alfonso Antolínez García ® Programación Concurrente y Distribuida Conceptos básicos de programación concurrente Atomicidad La importancia de las operaciones atómicas radica en su capacidad para mantener la integridad y coherencia de los datos frente al acceso concurrente. Cuando varios procesos o subprocesos intentan modificar un recurso compartido simultáneamente, pueden ocurrir condiciones de carrera, lo que lleva a resultados impredecibles y erróneos. Las operaciones atómicas proporcionan un mecanismo para mitigar estos problemas al garantizar que se acceda al recurso compartido de manera mutuamente excluyente, evitando conflictos y asegurando que las operaciones se ejecuten de forma atómica. Alfonso Antolínez García ® Programación Concurrente y Distribuida Conceptos básicos de programación concurrente Atomicidad El resultado es el mismo independientemente de la interfoliación que se produzca. Alfonso Antolínez García ® Programación Concurrente y Distribuida Conceptos básicos de programación concurrente Corrección Los programas concurrentes son una tarea compleja dado que la interfoliación nos lleva a una infinidad de trazas que pueden provocar la irrepetibilidad de una ejecución. Alfonso Antolínez García ® Programación Concurrente y Distribuida Conceptos básicos de programación concurrente Corrección Analizando los distintos aspectos que intervienen en la corrección de los programas concurrentes. Cuando nos referimos a corrección, queremos indicar que las soluciones propuestas cumplen con los criterios de satisfacción del problema a resolver. En los algoritmos, deberemos comprobar si cumplen unas sentencias iniciales, denominadas invariantes. Estas sentencias deben de cumplirse antes de realizar el algoritmo, y al finalizar el mismo deben de permanecer sin cambios. En el caso de que se cumpla podremos indicar que el algoritmo es correcto. Alfonso Antolínez García ® Programación Concurrente y Distribuida Conceptos básicos de programación concurrente Corrección Invariantes Una invariante es una condición o relación que siempre es verdadera. La definición se modifica un poco para la ejecución concurrente: una invariante es una condición o relación que es verdadera cuando se establece el bloqueo asociado. Una vez establecido el bloqueo, el invariante puede ser falso. Sin embargo, el código que sostiene el bloqueo debe restablecer la invariante antes de liberar el bloqueo. Alfonso Antolínez García ® Programación Concurrente y Distribuida Conceptos básicos de programación concurrente Corrección Invariantes Una invariante también puede ser una condición o relación que es verdadera cuando se establece un bloqueo. Se puede considerar que las variables de condición tienen una invariante que es la condición. La declaración assert () está probando el invariante. La función cond_wait() no conserva el invariante, por lo que el invariante debe reevaluarse cuando finaliza el hilo. Alfonso Antolínez García ® Programación Concurrente y Distribuida Conceptos básicos de programación concurrente Seguridad Características que se han de cumplir siempre para que podamos decir que un sistema es correcto: Exclusión mutua: imposibilidad de cohabitar en la misma zona. Podemos entender por exclusión mutua un cruce de carreteras, donde el propio cruce es la zona donde no pueden existir dos vehículos al mismo tiempo, ya que si no colisionarían. Alfonso Antolínez García ® Programación Concurrente y Distribuida Conceptos básicos de programación concurrente Seguridad Características que se han de cumplir siempre para que podamos decir que un sistema es correcto: Interbloqueo: bloqueo permanente de (y debido a) un conjunto de procesos que compiten por algún recurso compartido o se comunican entre ellos. Podemos entender por interbloqueo cuando dos personas coinciden para pasar por una puerta y ninguna de las dos se pone de acuerdo para entrar. Alfonso Antolínez García ® Programación Concurrente y Distribuida Conceptos básicos de programación concurrente Seguridad Características que se han de cumplir siempre para que podamos decir que un sistema es correcto: Interbloqueo (punto muerto, deadlock): Alfonso Antolínez García ® Programación Concurrente y Distribuida Conceptos básicos de programación concurrente Seguridad Características que se han de cumplir siempre para que podamos decir que un sistema es correcto: Inanición: podemos entender por inanición cuando de tres procesos, dos se alían para que el tercero no participe nunca, copando ellos el uso del recurso. Alfonso Antolínez García ® Programación Concurrente y Distribuida Conceptos básicos de programación concurrente Vivacidad Las exigencias de vivacidad son exigencias que podríamos catalogar como exigencias finales. La característica de viveza indica que la ejecución de un programa con el tiempo llega a su estado deseable. Alfonso Antolínez García ® Programación Concurrente y Distribuida Conceptos básicos de programación concurrente Vivacidad Propiedades de vivacidad ("liveness"): cada sentencia que se ejecute conduce en algún modo a un avance constructivo para alcanzar el objetivo funcional del programa. Son, en general, dependientes de la política de planificación que se utilice. Ejemplos de propiedades de vivacidad son: Alfonso Antolínez García ® Programación Concurrente y Distribuida Conceptos básicos de programación concurrente Vivacidad Ejemplos de propiedades de vivacidad son: No deben producirse bloqueos activos (livelock). Conjuntos de procesos que ejecutan de forma continuada sentencias que no conducen a un progreso constructivo. Alfonso Antolínez García ® Programación Concurrente y Distribuida Conceptos básicos de programación concurrente Vivacidad Ejemplos de propiedades de vivacidad son: Aplazamiento indefinido (starvation): es el estado al que puede llegar un programa que aunque potencialmente puede avanzar de forma constructiva no consigue recursos para ello. Esto puede suceder, como consecuencia de que no se le asigna tiempo de procesador en la política de planificación; o porque en las condiciones de sincronización, hemos establecido criterios de prioridad que perjudican siempre al mismo proceso. Alfonso Antolínez García ® Programación Concurrente y Distribuida Conceptos básicos de programación concurrente Vivacidad Ejemplos de propiedades de vivacidad son: Interbloqueo (deadlock): se produce cuando los procesos no pueden obtener, nunca, los recursos necesarios para finalizar su tarea. Alfonso Antolínez García ® Programación Concurrente y Distribuida Conceptos básicos de programación concurrente Equidad Esta propiedad tiene que ver con el reparto de recursos: Débil: aquella forma de equidad que garantiza que si un proceso hace una petición continuada al final será satisfecha. Fuerte: aquella forma de equidad que garantiza que si un proceso realiza una petición infinitamente, al final será satisfecha. Lineal: aquella forma de equidad que garantiza que si un proceso realiza una petición, esta será satisfecha antes de que a otro proceso se le satisfagan dos veces. Alfonso Antolínez García ® Programación Concurrente y Distribuida Conceptos básicos de programación concurrente Equidad Esta propiedad tiene que ver con el reparto de recursos. FIFO típica de cola: aquella forma de equidad que garantiza que el primer proceso en hacer la petición será el primero en ser servido. En orden de llegada. La FIFO es la más restrictiva y además solo es útil en el caso de sistemas centralizados Alfonso Antolínez García ® Computación en Sistemas Distribuidos Corrección de programas concurrentes Alfonso Antolínez García ® Programación Concurrente y Distribuida Conceptos básicos de programación concurrente Además de las especificaciones funcionales, un programa concurrente debe cumplir… Propiedades de seguridad: Son aquéllas que aseguran que nada malo va a pasar durante la ejecución del programa Propiedades de viveza: Son aquellas que aseguran que algo bueno pasará eventualmente durante la ejecución del programa Alfonso Antolínez García ® Programación Concurrente y Distribuida Conceptos básicos de programación concurrente Propiedades de seguridad: Exclusión mutua Condición de sincronización Interbloqueo: se produce cuando todos los procesos están esperando que ocurra un evento que nunca se producirá. Se le denomina también interbloqueo pasivo. (deadlock o abrazo mortal) Alfonso Antolínez García ® Computación en Sistemas Distribuidos Ejemplo ilustrativo de las propiedades (juego del pañuelo) Alfonso Antolínez García ® Programación Concurrente y Distribuida Conceptos básicos de programación concurrente En el juego del pañuelo hay dos equipos A y B, y un juez con un pañuelo. Cada jugador de un equipo tiene un número del 1 al 3. No puede haber dos jugadores en el mismo equipo con el mismo número. El juez dice un número y entonces los dos rivales con el mismo número salen corriendo a coger el pañuelo. El jugador que lo coja ha de volver corriendo a su sitio sin que su rival logre tocarle la espalda. En este escenario plantearemos las propiedades de seguridad y viveza Alfonso Antolínez García ® Programación Concurrente y Distribuida Conceptos básicos de programación concurrente Propiedades de seguridad: Exclusión mutua Condición de sincronización Interbloqueo (punto muerto): se produce cuando todos los procesos están esperando que ocurra un evento que nunca se producirá. Se le denomina también interbloqueo pasivo. (deadlock o abrazo mortal) Alfonso Antolínez García ® Programación Concurrente y Distribuida Conceptos básicos de programación concurrente Propiedades de vivacidad: Interbloqueo activo: Se produce cuando un sistema ejecuta una serie de instrucciones sin hacer ningún progreso (livelock) Inanición: Existen un grupo de procesos que nunca progresan pues no se les otorga tiempo de procesador para avanzar Alfonso Antolínez García ® Programación Concurrente y Distribuida Conceptos básicos de programación concurrente Exclusion mutua: Hay recursos que deben ser accedidos en exclusión mutua y si otros procesos quieren acceder a este recurso tienen que esperar a que sea liberado. Ejemplo: basado en el ejemplo del pañuelo … ha de adquirirse por un jugador o por otro, en exclusion mutua, ya que si lo adquieren los dos puede llegar a romperse → mal funcionamiento del sistema. Alfonso Antolínez García ® Programación Concurrente y Distribuida Conceptos básicos de programación concurrente Condición de sincronización: Hay situaciones, en las que un proceso debe esperar a que se produzca un determinado evento para poder avanzar y no debería de avanzar antes de que ese evento ocurra. Ejemplo: el jugador debe esperar a que digan su número para poder salir en busca del pañuelo. Alfonso Antolínez García ® Programación Concurrente y Distribuida Conceptos básicos de programación concurrente Interbloqueo: En el juego del pañuelo, se daría si uno de los jugadores coge el pañuelo y se lo lleva fuera del juego. El juez debería esperar a que le devuelva el pañuelo y los jugadores a que el juez diga su número, pero esto puede nunca pasar. Alfonso Antolínez García ® Programación Concurrente y Distribuida Conceptos básicos de programación concurrente Interbloqueo activo: En el ejemplo del pañuelo … si los jugadores que salen a por el pañuelo, simulan cogerlo, pero nunca llegan a cogerlo. Inanición: En nuestro ejemplo se produciría si el juez nunca dice el número de un jugador en concreto. Hay que garantizar equidad en el trato a los procesos a no ser que las especificaciones del sistema digan lo contrario. Alfonso Antolínez García ® Programación Concurrente y Distribuida Conceptos básicos de programación concurrente Ejemplo: supongamos que la variable x se actualiza con dos funciones que se ejecutan concurrentemente, ¿qué valor tendría x al acabar el programa? Alfonso Antolínez García ® Programación Concurrente y Distribuida Conceptos básicos de programación concurrente Pregunta: ¿De qué problema(s) de los nombrados adolece el programa? Alfonso Antolínez García ® Programación Concurrente y Distribuida Conceptos básicos de programación concurrente Pregunta: ¿De qué problemas de los nombrados en esta sesión adolece el programa? Inanición, si incrementa_5_A() o incrementa_5_B() toman el control de x y no deja a la otra entra actualizar la variable Alfonso Antolínez García ® Programación Concurrente y Distribuida Conceptos básicos de programación concurrente Pregunta: ¿Por qué el programa podría ser considerado indeterminista? Alfonso Antolínez García ® Programación Concurrente y Distribuida Conceptos básicos de programación concurrente Pregunta: ¿Por qué el programa podría ser considerado indeterminista? El resultado es indeterminado dependiendo del camino y velocidad de ejecución de los procesos. Alfonso Antolínez García ® Programación Concurrente y Distribuida Conceptos básicos de programación concurrente Pregunta: ¿Es posible la programación concurrente en arquitecturas hardware monoprocesador? Respuesta: ¿... ? Alfonso Antolínez García ® Programación Concurrente y Distribuida Conceptos básicos de programación concurrente Pregunta: ¿Es posible la programación concurrente en arquitecturas hardware monoprocesador? Respuesta: En arquitecturas hardware monoprocesador … También es posible tener ejecución concurrente de procesos No todos los procesos se ejecutan al mismo tiempo, sólo uno de ellos los estará haciendo en un momento dado, pero la sensación del usuario es de estar ejecutándose al mismo tiempo El sistema operativo irá alternando el tiempo de procesador entre los distintos procesos Alfonso Antolínez García ® Programación Concurrente y Distribuida Conceptos básicos de programación concurrente Pregunta: ¿En arquitecturas monoprocesador cuál es la forma de sincronizar los procesos? Respuesta: ¿…? Alfonso Antolínez García ® Programación Concurrente y Distribuida Conceptos básicos de programación concurrente Pregunta: ¿En arquitecturas monoprocesador cuál es la forma de sincronizar los procesos? Respuesta: En arquitecturas hardware monoprocesador todos los procesos comparten la misma memoria. La forma de sincronizar y comunicar es mediante el uso de variables compartidas. Alfonso Antolínez García ® Computación en Sistemas Distribuidos Tipos de arquitecturas (desde el punto de vista de procesos) Alfonso Antolínez García ® Programación Concurrente y Distribuida Conceptos básicos de programación concurrente Las arquitecturas las clasificamos en: Fuertemente acopladas : Se comunican mediante variables en memoria compartida, ya que los procesadores y otros dispositivos están conectados a un bus de datos. Débilmente acopladas : No existe memoria compartida por los procesadores, cada procesador tiene su memoria local. Se trata de un Procesamiento distribuido. El paso de mensajes, es el mecanismo de comunicación más habitual. Alfonso Antolínez García ® Programación Concurrente y Distribuida Conceptos básicos de programación concurrente Ejercicio: ¿Cuál de las siguientes instrucciones se pueden ejecutar concurrentemente? a) x=x+1 b) y= 1 c) x=a+1 d) x=y+a Alfonso Antolínez García ® Programación Concurrente y Distribuida Conceptos básicos de programación concurrente Ejercicio: ¿Cuál de las siguientes instrucciones se pueden ejecutar concurrentemente? a) x=x+1 b) y= 1 c) x=a+1 d) x=y+a Teniendo en cuenta las Condiciones de Bernstein Para que se puedan ejecutar concurrentemente dos conjuntos de instrucciones Si y Sj se debe cumplir que ninguno escriba lo que el otro lee o escribe. Independencia en las entradas, independencia en las salidas y no conflicto en la escritura. Alfonso Antolínez García ® Programación Concurrente y Distribuida Conceptos básicos de programación concurrente Ejercicio: ¿Cuál de las siguientes instrucciones se pueden ejecutar concurrentemente? a) x=x+1 b) y= 1 c) x=a+1 d) x=y+a Teniendo en cuenta las Condiciones de Bernstein (a) y (b) pueden ejecutarse concurrentemente. (a) y (c) no pueden ejecutarse concurrentemente debido a la dependencia de la variable x. (a) y (d) no pueden ejecutarse concurrentemente debido a la dependencia de la variable x. … Alfonso Antolínez García ® Programación Concurrente y Distribuida Conceptos básicos de programación concurrente Ejercicio: ¿Cuál de las siguientes instrucciones se pueden ejecutar concurrentemente? a) x=x+1 a b c d b) y= 1 a Si No No c) x=a+1 d) x=y+a b Si Si c No Teniendo en cuenta las Condiciones de Bernstein d (a) y (b), (b) y (c), (b) y (d) pueden ejecutarse concurrentemente. Alfonso Antolínez García ® Computación en Sistemas Distribuidos ¡Muchas Gracias! ¿Preguntas? Alfonso Antolínez García ® Programación Concurrente y Distribuida Tema 5. Sockets en Java Alfonso Antolínez García ® 1 Computación en Sistemas Distribuidos Sockets en Java Alfonso Antolínez García ® Computación en Sistemas Distribuidos TCP-IP Programación Concurrente y Distribuida Sockets en Java El modelo TCP/IP El TCP/IP (Protocolo de control de transmisión/Protocolo de Internet) es un marco conceptual que se utiliza para transmitir datos a través de una red. El conjunto de protocolos TCP/IP se ha convertido en el estándar de facto para las comunicaciones en el mundo. Alfonso Antolínez García ® Programación Concurrente y Distribuida Sockets en Java El modelo arquitectónico TCP/IP El conjunto de protocolos TCP/IP recibe ese nombre por dos de sus protocolos más importantes: el Protocolo de Control de Transmisión (TCP) y el Protocolo de Internet (IP). El principal objetivo de diseño de TCP/IP era construir una interconexión de redes, o Internet, que proporcionase servicios de comunicación universales a través de redes físicas heterogéneas. Una interconexión de redes de este tipo permite la comunicación entre hosts en diferentes redes, quizás separados por una gran área geográfica. Alfonso Antolínez García ® Programación Concurrente y Distribuida Sockets en Java Internet consta de los siguientes grupos de redes: Redes troncales: grandes redes que existen principalmente para interconectar otras redes. Actualmente, las redes troncales son NSFNET en EE. UU., EBONE en Europa y grandes redes troncales comerciales. Redes regionales que conectan, por ejemplo, universidades. Redes comerciales que brindan acceso a las redes troncales a los suscriptores, y redes propiedad de organizaciones comerciales para uso interno que también tienen conexiones a Internet. Redes locales, como redes universitarias de todo el campus. Alfonso Antolínez García ® Programación Concurrente y Distribuida Sockets en Java Alfonso Antolínez García ® Programación Concurrente y Distribuida Sockets en Java Alfonso Antolínez García ® Programación Concurrente y Distribuida Sockets en Java Otro aspecto importante de la interconexión de redes TCP/IP es la creación de una abstracción estandarizada de los mecanismos de comunicación proporcionados por cada tipo de red. Cada red física tiene su propia interfaz de comunicación dependiente de la tecnología, en forma de una interfaz de programación que proporciona funciones de comunicación básicas (primitivas). Alfonso Antolínez García ® Programación Concurrente y Distribuida Sockets en Java TCP/IP proporciona servicios de comunicación que se ejecutan entre la interfaz de programación de una red física y las aplicaciones de usuario. Permite una interfaz común para todas las aplicaciones, independientemente de la red física subyacente. Por lo tanto, la arquitectura de la red física queda oculta para el usuario y el desarrollador de una aplicación. La aplicación solo necesita codificar la abstracción de comunicación estandarizada para poder funcionar en cualquier tipo de red física y plataforma operativa. Alfonso Antolínez García ® Programación Concurrente y Distribuida Sockets en Java Capas de la arquitectura TCP/IP Alfonso Antolínez García ® Programación Concurrente y Distribuida Sockets en Java El modelo cliente/servidor TCP es un protocolo punto a punto orientado a la conexión. No existen relaciones maestro/esclavo. Sin embargo, las aplicaciones suelen utilizar un modelo cliente/servidor para las comunicaciones. Alfonso Antolínez García ® Programación Concurrente y Distribuida Sockets en Java El modelo cliente/servidor Un servidor es una aplicación que ofrece un servicio a los usuarios de Internet; un cliente es un solicitante de un servicio. Una aplicación consta de una parte de servidor y una parte de cliente, que pueden ejecutarse en el mismo sistema o en sistemas diferentes. Los usuarios suelen invocar la parte de cliente de la aplicación, que crea una solicitud para un servicio en particular y la envía a la parte de servidor de la aplicación utilizando TCP/IP como vehículo de transporte. Alfonso Antolínez García ® Programación Concurrente y Distribuida Sockets en Java El modelo cliente/servidor El servidor es un programa que recibe una solicitud, realiza el servicio requerido y envía los resultados en una respuesta. Un servidor normalmente puede gestionar varias solicitudes y varios clientes solicitantes al mismo tiempo Alfonso Antolínez García ® Programación Concurrente y Distribuida Sockets en Java El modelo cliente/servidor La mayoría de los servidores esperan las solicitudes en un puerto conocido para que sus clientes sepan a qué puerto deben dirigir sus solicitudes. El cliente normalmente utiliza un puerto arbitrario llamado puerto efímero para su comunicación. Los clientes que desean comunicarse con un servidor que no utiliza un puerto conocido deben tener otro mecanismo para saber a qué puerto deben dirigir sus solicitudes. Este mecanismo puede emplear un servicio de registro como portmap, que sí utiliza un puerto conocido. Alfonso Antolínez García ® Programación Concurrente y Distribuida Sockets en Java El modelo cliente/servidor Alfonso Antolínez García ® Computación en Sistemas Distribuidos Bridges, routers, switches y gateways Alfonso Antolínez García ® Programación Concurrente y Distribuida Sockets en Java Existen muchas formas de proporcionar acceso a otras redes. En una interconexión de redes, esto se hace por medio de routers (enrutadores). En esta sección, veremos veremos los conceptos de enrutador, puente (bridge) y una gateway (puerta de enlace) para permitir el acceso remoto a la red. Alfonso Antolínez García ® Programación Concurrente y Distribuida Sockets en Java Existen muchas formas de proporcionar acceso a otras redes. Alfonso Antolínez García ® Programación Concurrente y Distribuida Sockets en Java Bridge Un puente o bridge es un dispositivo de interconexión de redes de ordenadores que opera en la capa 2 (nivel de enlace de datos) del modelo OSI. Interconecta segmentos de LAN en el nivel de capa de interfaz de red y reenvía tramas entre ellos. Un puente realiza la función de un relé MAC y es independiente de cualquier protocolo de capa superior (incluido el protocolo de enlace lógico). Proporciona conversión de protocolo de capa MAC, si es necesario. Alfonso Antolínez García ® Programación Concurrente y Distribuida Sockets en Java Bridge Se dice que un puente es transparente a IP. Es decir, cuando un host IP envía un datagrama IP a otro host en una red conectada por un puente, envía el datagrama directamente al host y el datagrama "cruza" el puente sin que el host IP que lo envía sea consciente de ello. Interconecta dos segmentos de red (o divide una red en segmentos) realizando el traspaso de datos de una red hacia otra, con base en la dirección física de destino de cada paquete. Alfonso Antolínez García ® Programación Concurrente y Distribuida Sockets en Java Bridge MAC address Alfonso Antolínez García ® Programación Concurrente y Distribuida Sockets en Java Switch Un conmutador o switch es un dispositivo digital de lógica de interconexión de redes de computadores que opera en la capa 2 (nivel de enlace de datos) del modelo OSI. Su función es interconectar dos o más segmentos de red, de manera similar a los puentes (bridges), pasando datos de un segmento a otro de acuerdo con la dirección MAC de destino de las tramas en la red. Alfonso Antolínez García ® Programación Concurrente y Distribuida Sockets en Java Switch Los conmutadores se utilizan cuando se desea conectar múltiples redes, fusionándolas en una sola. Al igual que los puentes, dado que funcionan como un filtro en la red, mejoran el rendimiento y la seguridad de las LANs (Local Area Network– Red de Área Local). Alfonso Antolínez García ® Programación Concurrente y Distribuida Sockets en Java Switch Los conmutadores poseen la capacidad de aprender y almacenar las direcciones de red de nivel 2 (direcciones MAC) de los dispositivos alcanzables a través de cada uno de sus puertos. Por ejemplo, un equipo conectado directamente a un puerto de un conmutador provoca que el conmutador almacene su dirección MAC. Esto permite que, a diferencia de los concentradores o hubs, la información dirigida a un dispositivo vaya desde el puerto origen al puerto de destino. Alfonso Antolínez García ® Programación Concurrente y Distribuida Sockets en Java Switch En el caso de conectar dos conmutadores o un conmutador y un concentrador, cada conmutador aprenderá las direcciones MAC de los dispositivos accesibles por sus puertos, por lo tanto en el puerto de interconexión se almacenan las MAC de los dispositivos del otro conmutador. Alfonso Antolínez García ® Programación Concurrente y Distribuida Sockets en Java Router El router interconecta redes en el nivel de la capa de red y enruta paquetes entre ellas. Un router pueden seleccionar las mejores rutas de acceso y los tamaños de paquete óptimos. El enrutador (router), es un dispositivo de hardware para interconexión de red de ordenadores que opera en la capa tres (nivel de red). Un router es un dispositivo para la interconexión de redes informáticas que permite asegurar el enrutamiento de paquetes entre redes o determinar la ruta que debe tomar el paquete de datos. Alfonso Antolínez García ® Programación Concurrente y Distribuida Sockets en Java Router La función de enrutamiento básica se implementa en la capa IP de la pila de protocolos TCP/IP, por lo que cualquier host o estación de trabajo que ejecute TCP/IP en más de una interfaz podría, en teoría, reenviar datagramas IP (actuar como router). Sin embargo, los routers dedicados brindan un enrutamiento mucho más sofisticado. Alfonso Antolínez García ® Programación Concurrente y Distribuida Sockets en Java Router Alfonso Antolínez García ® Programación Concurrente y Distribuida Sockets en Java Router Los router pueden estar conectados a dos o más redes a la vez, e implica la realización de tareas que conciernen a los tres niveles inferiores del modelo OSI: físico, enlace de datos y red. Alfonso Antolínez García ® Programación Concurrente y Distribuida Sockets en Java Router La primera función de un router, es saber si el destinatario de un paquete de información está en nuestra propia red o en una remota. 192.168.xx1.xxx Para determinarlo, utiliza la“máscara de subred”. 255.255.255.000 La máscara de subred determina a qué grupo de ordenadores pertenece un equipo. Si la máscara de subred de un paquete de información enviado no se corresponde a la red LAN (red local), el router determinará, que el destino de ese paquete está en otro segmento de red diferente o salir a otra red (WAN), para conectar con otro router. Alfonso Antolínez García ® Programación Concurrente y Distribuida Sockets en Java Gateway (Pasarela) Son routers que implementan software específico (correspondientes a niveles de transporte, sesión, presentación y aplicación, del modelo OSI), que permiten interconectar redes que utilizan distintos protocolos,por ejemplo: TCP/IP, SNA, Netware, VoIP. Los Gateways deben desensamblar las tramas y paquetes para obtener el mensaje original y a partir de éste volver a reconfigurar los paquetes y las tramas, pero de acuerdo con el protocolo de la red donde se encuentra la estación de destino. Alfonso Antolínez García ® Programación Concurrente y Distribuida Sockets en Java Gateway (Pasarela) Alfonso Antolínez García ® Programación Concurrente y Distribuida Sockets en Java Comparativa Modelo TCP/IP – Modelo OSI Alfonso Antolínez García ® Programación Concurrente y Distribuida Sockets en Java Protocolos TCP FTP Protocolo de transferencia de datos (File Transfer Protocol). Interfaz y los servicios para enviar y recibir archivos. SMTP Protocolo simple de transferencia de correo (Simple Mail Transfer Protocol). Servicios para enviar correos electrónicos. TCP Protocolo de control de transporte (Transfer Control Protocol). Implementa la conexión y el manejo de los paquetes de datos. Gestiona la conexión entre el dispositivo emisor y el receptor. UDP Protocolo de datagrama de usuario (User Datagram Protocol). Funciona como transporte sin conexión, proporcionando servicios a la par de TCP. Alfonso Antolínez García ® Programación Concurrente y Distribuida Sockets en Java Protocolos TCP IP Protocolo de Internet (Internet Protocol). Se encarga de realizar el direccionamiento de los paquetes en toda la red de datos; abarca tanto redes locales (LAN) como WAN. ARP Protocolo de resolución de direcciones (Address Resolution Protocol). Se ocupa de que las direcciones IP (software) y su correspondencia con las direcciones MAC (hardware). Examples of OUI for well-known vendors are as follows: CC:46:D6 : Cisco 3C:5A:B4 : Google, Inc. 3C:D9:2B : Hewlett Packard 00:9A:CD : HUAWEI TECHNOLOGIES CO.,LTD Alfonso Antolínez García ® Programación Concurrente y Distribuida Sockets en Java Examples of OUI for well-known vendors are as follows: CC:46:D6 : Cisco 3C:5A:B4 : Google, Inc. 3C:D9:2B : Hewlett Packard 00:9A:CD : HUAWEI TECHNOLOGIES CO.,LTD Alfonso Antolínez García ® Programación Concurrente y Distribuida Sockets en Java Direcciones IP Cuando escribimos el nombre del sitio al cual queremos visitar, como por ejemplo, https://www.eu.es en lugar de escribir la dirección IP, 120.244.466.126. De la conversión entre el nombre de dominio (www.eu.es) y la IP de internet, se encarga el DNS (Domain Name Server) que convierte el nombre en la dirección IP. Alfonso Antolínez García ® Programación Concurrente y Distribuida Sockets en Java Direcciones IP DNS (Domain Name Server) Las direcciones IP actuales pueden ser v4 y v6 … Alfonso Antolínez García ® Programación Concurrente y Distribuida Sockets en Java Direcciones IP v4 Son números de hasta 32 bits que permiten hasta 232=4.294.967.296 posibles combinaciones en total. Estas direcciones se dividen en dos partes: la ID del host y la ID de red. Como vemos, una dirección IP es de 32 Bits pero se divide en cuatro octetos, donde de acuerdo a la clase serán utilizados para definir número de red o número de host. Alfonso Antolínez García ® Programación Concurrente y Distribuida Sockets en Java Direcciones IP v4 La ICANN (Internet Corporation of Assigned Names and Numbers) define las tres clases de direcciones IP A, B y C. Clase A: Primer octeto a ID de Red (8 Bits) y los últimos tres a ID de Host (24 Bits). Lo que determina: 128 redes y 16.777.214 Hosts. Dentro del rengo 1.0.0.0 a 126.255.255.255. Clase B: Primer y segundo octetos a ID de Red (16 Bits) y los dos últimos a ID de Host (16 Bits). Lo que determina: 16.384 redes y 65.534 Hosts. Dentro del rengo 128.0.0.0 a 191.255.255.255. Alfonso Antolínez García ® Programación Concurrente y Distribuida Sockets en Java Direcciones IP v4 Clase C: Los primeros tres octetos a ID de Red (24 Bits) y el último a ID de Host (8 Bits). Lo que determina: 2.097.152 redes y 254 Hosts. Dentro del rengo 192.0.0.0 a 223.255.255.255. Clase D: Se utilizan para grupos de multicast, no hay necesidad de asignar octetos o bits a las distintas direcciones de red y host. En la actualidad no es operativa y ya está obsoleta. Alfonso Antolínez García ® Programación Concurrente y Distribuida Sockets en Java Direcciones IP v6 Las direcciones IPv6 trabajan de forma similar a IPv4. Debido a la gran cantidad de dispositivos que se conectan a internet (IoT), IPv4 ha quedado prácticamente agotada, y se tuvo que desarrollar otra versión que aumentara la cantidad en muchos más millones de direcciones. IPv6 trabaja a 128 bits y expresado en numeración hexadecimal de 32 dígitos (aproximadamente, 2 128 = 3,4028236692093846346337460743177e+38 direcciones). Alfonso Antolínez García ® Programación Concurrente y Distribuida Sockets en Java Estructura IP v6 Alfonso Antolínez García ® Programación Concurrente y Distribuida Sockets en Java Estructura IP v6 Alfonso Antolínez García ® Computación en Sistemas Distribuidos Sockets en Java Programación Concurrente y Distribuida ¡PREGUNTA! ¿Qué es un socket en TCP/IP y UDP y para qué sirven? Alfonso Antolínez García ® Programación Concurrente y Distribuida Sockets en Java Los sockets son esenciales para la comunicación en red. Sirven como enlaces para la comunicación entre aplicaciones, tanto dentro de un mismo dispositivo como a través de una red de comunicaciones. Alfonso Antolínez García ® Programación Concurrente y Distribuida Sockets en Java Por lo tanto … Un socket permite el intercambio de datos entre procesos situados en el mismo equipo o diferentes. Un socket se define por el conjunto: dirección(es) IP, protocolo de transporte y número de puerto. Esto facilita una conexión directa entre quien pide un servicio (cliente) y quien lo ofrece (servidor). La tecnología de sockets hace posible la arquitectura cliente-servidor. Alfonso Antolínez García ® Programación Concurrente y Distribuida ¡PREGUNTA! ¿Qué protocolos se emplean para crear un socket? Alfonso Antolínez García ® Programación Concurrente y Distribuida Sockets en Java Se utilizan dos protocolos principales en Internet: TCP y UDP. TCP asegura una conexión estable para intercambiar datos. UDP envía información sin garantizar la recepción. TCP garantiza que los datos lleguen en orden y sin errores. UDP se emplean en servicios que aceptan perder cierta información, por ser más rápidos. Alfonso Antolínez García ® Programación Concurrente y Distribuida Sockets en Java El TCP/IP es vital para Internet. Este protocolo hace posible enviar datos de forma segura. El UDP también es crucial, pero trabaja de manera distinta. A diferencia del TCP, el UDP busca rapidez en vez de precisión. Esto hace que sea perfecto para usos como video o juegos online. Su diseño optimiza la velocidad aunque no garantiza que los datos llegarán completos. Alfonso Antolínez García ® Programación Concurrente y Distribuida Sockets en Java Para asegurar la entrega de datos, TCP incluye un proceso de handshake o negociación, mediante el cual se establece una conexión antes de la transferencia de información. Este método previene la pérdida de datos y facilita la corrección de errores en tiempo real. Alfonso Antolínez García ® Programación Concurrente y Distribuida Sockets en Java Diagrama TCP/IP Three-Way Handshake Server o negociación, Alfonso Antolínez García ® Programación Concurrente y Distribuida Sockets en Java A diferencia de TCP, el Protocolo de Datagrama de Usuario (UDP) es un protocolo que opera sin conexión, lo que implica una transferencia de datos menos fiable, pero significativamente más rápida. UDP envía los datos sin establecer previamente una conexión entre el remitente y el receptor, sacrificando la garantía de entrega por la velocidad. Es ampliamente utilizado en aplicaciones donde la rapidez es más importante que la precisión, como juegos en línea, llamadas de voz sobre IP (VoIP), y streaming de video. La ligera naturaleza del UDP, que minimiza la sobrecarga de verificar la recepción de los paquetes, ideal para usos donde la velocidad es prioritaria. Alfonso Antolínez García ® Computación en Sistemas Distribuidos Comparativa entre TCP y UDP Alfonso Antolínez García ® Programación Concurrente y Distribuida Sockets en Java Comparativa entre TCP y UDP Alfonso Antolínez García ® Programación Concurrente y Distribuida ¡PREGUNTA! ¿Para qué se han concebido los puertos? Alfonso Antolínez García ® Programación Concurrente y Distribuida Sockets en Java Dentro de la comunicación a través de redes (internet u otras), los protocolos TCP y UDP se encargan de establecer la conexión, ensamblar los paquetes de datos tras la transmisión y a continuación, enviarlos a los programas a los que se dirigían en el receptor. Para que esta transferencia pueda tener lugar, el sistema operativo debe generar y abrir entradas. Programación Concurrente y Distribuida Sockets en Java TCP y UDP permiten la conexión entre dispositivos a través de internet u otras redes. No obstante, para que los paquetes de datos puedan dar con una entrada en el ordenador o servidor del otro lado de la conexión, debe haber entradas abiertas. A cada entrada se le asigna un número de identificación específico. Este tipo de entradas al sistema se denominan puertos. Tras la transmisión, el sistema receptor sabe a dónde hay que suministrar los datos gracias al número de puerto. En el paquete de datos siempre se incluyen dos números de puerto, el del emisor y el del receptor. Alfonso Antolínez García ® Programación Concurrente y Distribuida ¡PREGUNTA! ¿Sockets TCP/IP y UDP y la Arquitectura cliente/servidor? Alfonso Antolínez García ® Programación Concurrente y Distribuida Sockets en Java En la arquitectura cliente/servidor … El cliente manda solicitudes que el servidor procesa y responde. Alfonso Antolínez García ® Programación Concurrente y Distribuida Sockets en Java Usan protocolos como TCP para una transmisión de datos segura evitando pérdidas de información. En la comunicación se utilizan puertos que van desde 0 hasta 65535, recomendándose usar los que van entre el 1024 y el 65535. Los números más bajos se reservan para servicios específicos. El puerto 1234 es común en Java. Alfonso Antolínez García ® Programación Concurrente y Distribuida Sockets en Java Algunos de estos números de puertos están estandarizados y se asignan a determinadas aplicaciones. Estos puertos estándar también se llaman puertos bien conocidos o well-known ports, ya que los números de identificación son fijos. Los puertos registrados o registered ports, por su parte, son puertos que una organización o un fabricante de software ha reservado para su aplicación. Alfonso Antolínez García ® Programación Concurrente y Distribuida Sockets en Java El responsable del registro es la Internet Assigned Numbers Authority (IANA). Junto a estos, también hay un amplio rango de números de puerto que se asignan de forma dinámica. Un navegador usa un puerto de este tipo durante una visita a una página web. Una vez el usuario abandona la página, el número vuelve a quedar libre. Alfonso Antolínez García ® Computación en Sistemas Distribuidos Lista de los puertos más importantes Alfonso Antolínez García ® Programación Concurrente y Distribuida Sockets en Java Entre los más de 65000 puertos TCP y UDP disponibles, hay algunos códigos de identificación que son muy importantes para la comunicación en internet. Hay puertos que solo cuentan con autorización para uno de los dos protocolos (TCP o UDP). Hay otros puertos que no se han reservado oficialmente para un servicio determinado, pero que, en la práctica, se han ido asentando con el tiempo. Algunos puertos incluso cuentan con una ocupación doble. Alfonso Antolínez García ® Programación Concurrente y Distribuida Sockets en Java Los puertos bien conocidos y registrados más importantes son: Alfonso Antolínez García ® Programación Concurrente y Distribuida Sockets en Java Los puertos bien conocidos y registrados más importantes son: Alfonso Antolínez García ® Programación Concurrente y Distribuida Sockets en Java Los puertos bien conocidos y registrados más importantes son: Alfonso Antolínez García ® Programación Concurrente y Distribuida Sockets en Java Los puertos con un número superior al 49152 son puertos dinámicos. Estos puertos no los asigna la IANA. Cada aplicación puede usar un puerto de este tipo de manera local o dinámica, por lo que es probable que alguno de estos puertos ya esté ocupado. Alfonso Antolínez García ® Programación Concurrente y Distribuida Sockets en Java Los puertos como IP, IMAP, SMTP y POP3 facilitan la comunicación y el envío de emails … por ejemplo. Alfonso Antolínez García ® Computación en Sistemas Distribuidos Ciclo de vida de un socket Alfonso Antolínez García ® Programación Concurrente y Distribuida Sockets en Java Creación: apertura del socket. Lectura: recibir información (InputStream). Escritura: enviar información (OutputStream). Cierre: cierre del socket. Alfonso Antolínez García ® Programación Concurrente y Distribuida Sockets en Java Alfonso Antolínez García ® Programación Concurrente y Distribuida Sockets en Java Alfonso Antolínez García ® Computación en Sistemas Distribuidos Fases típicas de una comunicación entre cliente y servidor Alfonso Antolínez García ® Programación Concurrente y Distribuida Sockets en Java A continuación, se presentan las fases típicas de una comunicación entre cliente y servidor: Alfonso Antolínez García ® Programación Concurrente y Distribuida Sockets en Java Tanto clientes como servidores pueden usar distintos lenguajes de programación. Lo importante es conocer las IPs y puertos de conexión. Esto permite infinitas aplicaciones y escenarios de uso distintos. En entornos con muchas conexiones concurrentes, como los servidores web o las bbdd, cada conexión usa un socket único. Alfonso Antolínez García ® Computación en Sistemas Distribuidos Funciones esenciales de los sockets Alfonso Antolínez García ® Programación Concurrente y Distribuida Sockets en Java Las más usadas están send(), recv(), bind(), listen() y accept(). Alfonso Antolínez García ® Programación Concurrente y Distribuida Sockets en Java send(): Envía datos a través de un socket. Es esencial en apps de chat, donde se comparten datos constantemente. recv(): Recibe datos de otro socket. Importante para recibir info del servidor o otros clientes. bind(): Asocia un socket a una dirección y puerto locales. Los servidores lo usan para escuchar conexiones entrantes. listen(): Prepara el socket para escuchar conexiones. Se usa después de bind() del lado del servidor. accept(): Acepta conexiones entrantes, creando un nuevo socket para comunicarse con el cliente. Alfonso Antolínez García ® Computación en Sistemas Distribuidos Conexiones bloqueantes y no bloqueantes Alfonso Antolínez García ® Programación Concurrente y Distribuida Sockets en Java Con conexiones bloqueantes, el socket espera a que termine una operación. Esto puede hacer que algunas aplicaciones sean lentas. Las conexiones no bloqueantes dejan que el programa siga trabajando. Así, mientras espera respuestas, la aplicación puede ser más reactiva. Alfonso Antolínez García ® Programación Concurrente y Distribuida ¡Muchas Gracias! ¿Preguntas? Alfonso Antolínez García ® Computación en Sistemas Distribuidos Sockets en Java Programación Concurrente y Distribuida Unidad 2. Tema 8 Sincronización entre procesos Alfonso Antolínez García ® 1 Programación Concurrente y Distribuida La sincronización entre procesos en Java Alfonso Antolínez García ® Computación en Sistemas Distribuidos Sincronización entre Sincronización entre procesos procesos Alfonso Antolínez García ® Programación Concurrente y Distribuida ¡PREGUNTA! ¿Qué es la sincronización? Alfonso Antolínez García ® Programación Concurrente y Distribuida Sincronización entre procesos La sincronización consiste en asegurar que los procesos o hilos independientes que ejecutan un determinado bloque de código en el mismo tiempo. Definición genérica de sincronización Sincronización de procesos: La ejecución simultánea de múltiples hilos o procesos para alcanzar un handshake tal que comprometan una cierta secuencia de acciones. Alfonso Antolínez García ® Computación en Sistemas Distribuidos El subprocesamiento múltiple en Java Alfonso Antolínez García ® Programación Concurrente y Distribuida Sincronización entre procesos El concepto de subprocesamiento múltiple en Java Los subprocesos múltiples de Java permiten la ejecución simultánea de dos o más partes de un programa para la máxima utilización de la CPU. Cada parte de un programa de este tipo es un hilo, y los hilos son subprocesos ligeros dentro de un proceso más amplio. Alfonso Antolínez García ® Programación Concurrente y Distribuida ¡PREGUNTA! ¿Por qué es necesaria la sincronización entre procesos? Alfonso Antolínez García ® Programación Concurrente y Distribuida Sincronización entre procesos Por que varios subprocesos de un programa pueden intentar acceder a los mismos recursos y producir resultados inexactos. Por lo tanto, debe haber alguna sincronización para garantizar que sólo un subproceso tenga acceso a los recursos en un momento dado. Alfonso Antolínez García ® Programación Concurrente y Distribuida ¡PREGUNTA! ¿Qué es la sincronización en Java? Alfonso Antolínez García ® Programación Concurrente y Distribuida Sincronización entre procesos La sincronización de Java es la capacidad de controlar el acceso de varios subprocesos a un recurso compartido. Alfonso Antolínez García ® Programación Concurrente y Distribuida Sincronización entre procesos La sincronización de Java es necesaria cuando los programas Java de subprocesos múltiples intentan acceder al mismo recurso y producen (o pueden producir) resultados erróneos. Con la función de sincronización de Java, un único subproceso puede acceder a un mismo recurso en un momento dado. Alfonso Antolínez García ® Programación Concurrente y Distribuida Sincronización entre procesos Java proporciona una forma de sincronizar la tarea de los subprocesos utilizando bloques sincronizados que se sincronizan en el mismo objeto y solo pueden tener un subproceso ejecutándose dentro de ellos a la vez. Estos bloques están marcados con la palabra clave sincronizada synchronized(sync_object) (synchronized), { bloqueando cualquier otro subproceso // Acceso a variables y otros recursos compartidos } que intente ingresar al bloque sincronizado hasta que el subproceso que ya está dentro del bloque finaliza su ejecución y abandona el bloque. Alfonso Antolínez García ® Programación Concurrente y Distribuida Sincronización entre procesos Sincronización en Java usando synchronized Alfonso Antolínez García ® Programación Concurrente y Distribuida Sincronización entre procesos El acceso concurrente a la información/recursos en un mismo instante de tiempo, por diversos procesos, puede afectar a la: - Comunicación entre procesos. - Compartición y competencia por los recursos. - Sincronización de la ejecución de varios procesos. - Asignación del tiempo de procesador a los procesos. Alfonso Antolínez García ® Programación Concurrente y Distribuida ¡PREGUNTA! ¿Por qué utilizar la sincronización en Java? Alfonso Antolínez García ® Programación Concurrente y Distribuida Sincronización entre procesos La sincronización en Java se utiliza para garantizar mediante algún medio de sincronización que sólo un subproceso pueda acceder al recurso en un momento determinado. Alfonso Antolínez García ® Programación Concurrente y Distribuida Sincronización entre procesos Bloques sincronizados en Java Java ofrece una forma de crear subprocesos y sincronizar sus tareas mediante bloques sincronizados. Todos los bloques sincronizados se sincronizan en el mismo objeto y solo se puede ejecutar un subproceso dentro de ellos a la vez. Todos los demás subprocesos que intenten ingresar al bloque sincronizado se bloquean hasta que el subproceso dentro del bloque sincronizado salga del bloque. Alfonso Antolínez García ® Programación Concurrente y Distribuida Sincronización entre procesos Bloques sincronizados en Java Los bloques sincronizados en Java se marcan con la palabra clave “synchronized”. Forma general de bloque sincronizado // Solo se puede ejecutar un hilo a la vez. synchronized(sync_object) { // Acceso a variables y otros recursos compartidos } Alfonso Antolínez García ® Programación Concurrente y Distribuida Sincronización entre procesos Bloques sincronizados en Java Esta sincronización también se implementa en Java con un concepto llamado monitores o bloqueos (y semáforos). Solo un hilo puede poseer un monitor en un momento dado. Cuando un hilo adquiere un bloqueo, se dice que ha ingresado al monitor. Todos los demás hilos que intenten ingresar al monitor bloqueado se suspenderán hasta que el primer hilo salga del monitor. del bloque. Alfonso Antolínez García ® Programación Concurrente y Distribuida Sincronización entre procesos Tipos de sincronización Dos tipos de sincronizaciones en Java: Sincronización de procesos Sincronización de subprocesos Alfonso Antolínez García ® Programación Concurrente y Distribuida Sincronización entre procesos Tipos de sincronización 1. Sincronización de procesos en Java La sincronización de procesos es una técnica que se utiliza para coordinar la ejecución de múltiples procesos. Garantiza que los recursos compartidos sean seguros y estén en orden. Alfonso Antolínez García ® Programación Concurrente y Distribuida Sincronización entre procesos Tipos de sincronización 2. Sincronización de subprocesos en Java La sincronización de subprocesos se utiliza para coordinar y ordenar la ejecución de los subprocesos en un programa multiproceso. Dos tipos de sincronización de subprocesos: Exclusiva mutua Cooperación (comunicación entre subprocesos en Java) Alfonso Antolínez García ® Programación Concurrente y Distribuida Sincronización entre procesos Tipos de sincronización 2. Sincronización de subprocesos en Java Exclusión mutua La exclusión mutua ayuda a evitar que los subprocesos interfieran entre sí mientras comparten datos. Tres tipos de exclusiva mutua: Método sincronizado. Bloque sincronizado. Sincronización estática. Alfonso Antolínez García ® Programación Concurrente y Distribuida Sincronización entre procesos Ejemplo // Clase para enviar un mensaje utilizando subprocesos // Clase driver class ThreadedSend extends Thread { class JavaSynchronization{ import java.io.*; private String msg; public static void main(String args[]) import java.util.*; Sender sender; { Sender send = new Sender(); // Una clase utilizada p