Programación Concurrente y Distribuida PDF
Document Details
Uploaded by PreferableGingko
Universidad Europea de Madrid
Alfonso Antolínez García
Tags
Summary
This document covers concurrent and distributed programming, specifically focusing on synchronization between processes. It examines the importance of synchronization in Java programs and provides examples and explanations. The document details topics such as thread synchronization, concurrent access to resources, and potential issues.
Full Transcript
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...
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 para enviar un mensaje // Recibe un objeto mensaje y una cadena que sera enviada como mensaje ThreadedSend S1 = new class Sender { ThreadedSend(String m, Sender obj) ThreadedSend(" Hola ", send); public void send(String msg) { ThreadedSend S2 = new { msg = m; ThreadedSend(" Adios ", send); System.out.println("Enviando\t" + msg); sender = obj; try { } // Arranca 2 hilos de tipo ThreadedSend Thread.sleep(1000); S1.start(); } public void run() S2.start(); catch (Exception e) { { System.out.println("Hilo interrupido."); // Solo un hilo puede enviar un mensaje en este momento // Espera a que finalicen los hilos } synchronized (sender) try { System.out.println("\n" + msg + "Enviado"); { S1.join(); } // Sincronizando el send(mensaje) S2.join(); } sender.send(msg); } } catch (Exception e) { } System.out.println("Interrumpido } proceso"); } } } Alfonso Antolínez García ® Programación Concurrente y Distribuida Sincronización entre procesos Ejemplo salida del programa Alfonso Antolínez García ® Programación Concurrente y Distribuida Sincronización entre procesos Ejercicio individual de práctica Modifica el programa de la actividad 1, para que el cliente establezca varias conexiones (sockets) con el servidor, pero de forma sincronizada, es decir, un segundo socket no se puede establecer, hasta no haber cerrado el primero. Implementa el ejercicio usando: Método sincronizado. Bloque sincronizado. Sincronización estática. Alfonso Antolínez García ® Computación en Sistemas Distribuidos Problemas de la ejecución concurrente Alfonso Antolínez García ® Programación Concurrente y Distribuida Sincronización entre procesos La ejecución concurrente/intercalada de procesos mejora el rendimiento, aprovechando más los ciclos de las CPUs pero la velocidad relativa de ejecución de los procesos en la CPU no puede predecirse, esta depende de: Las actividades de otros procesos La forma de tratar interrupciones. Las políticas de planificación. Alfonso Antolínez García ® Computación en Sistemas Distribuidos Iteración entre procesos Alfonso Antolínez García ® Programación Concurrente y Distribuida Sincronización entre procesos Toda ejecución concurrente entre procesos implica que exista una iteración. Podemos considerar de dos formas de iteración: Contención, los procesos compiten por el mismo recurso. Comunicación, la iteración entre los procesos implica que necesiten comunicarse mutuamente. Alfonso Antolínez García ® Programación Concurrente y Distribuida Sincronización entre procesos Por iteración entre procesos entendemos (premisas): Se consideran las secuencias de instrucciones ejecutadas por cada proceso. Se ignoran la velocidad del procesador y el tiempo de llegada de señales. Garantizar corrección de la ejecución de procesos concurrentes bajo cualquier secuencia de intercalado de instrucciones. - Independiente del hardware usado o la secuencia llegada señales. Aunque el intercalado de instrucciones sea distinto, el programa sigue siendo correcto. Alfonso Antolínez García ® Programación Concurrente y Distribuida Sincronización entre procesos Ejemplo práctico. Dadas dos instrucciones I1 y I2 de dos procesos P1 y P2, podemos distinguir dos casos: Comienzo (l2) a fin de Fin (l1) : ejecución secuencial. I1 I2 Comienzo (l2) antes de fin Fin (l1): debemos garantizar que el resultado es el mismo tras cualquiera de las dos posibles secuencias de ejecución, (l2) finaliza antes de fin (l1) e (l1) finaliza antes de fin (l2). I1 I2 Alfonso Antolínez García ® Computación en Sistemas Distribuidos Competencia de procesos Alfonso Antolínez García ® Programación Concurrente y Distribuida Sincronización entre procesos Importante recordar que … Se habla de concurrencia cuando ocurren varios sucesos de manera simultánea. En base a esto, la concurrencia en computación está asociada a la “ejecución” de varios procesos que coexisten temporalmente. La concurrencia aparece cuando dos o más procesos son contemporáneos. (*) Contemporánea (simultánea), que existente en el mismo tiempo que otra persona o cosa. Alfonso Antolínez García ® Programación Concurrente y Distribuida Sincronización entre procesos En esta situación los procesos pueden “competir” o colaborar entre sí por los recursos del sistema. Por tanto, existen tareas de colaboración y sincronización. Alfonso Antolínez García ® Programación Concurrente y Distribuida Sincronización entre procesos En base a lo anteriormente expuesto … Se produce competencia entre procesos cuando tenemos varios procesos con la necesidad de acceder a un recurso compartido. Procesos independientes, implica la competencia entre los mismos, por lo que debemos garantizar que: La ejecución de un proceso no afecta ni es afectado por la ejecución de otros procesos en el sistema. Que si existe un conflicto entre procesos, en el que compiten por el uso de recursos, se debe garantizar que: - Se produce acceso exclusivo a recursos no compartibles. - Sólo un proceso accede al recurso en un momento determinado. Alfonso Antolínez García ® Programación Concurrente y Distribuida Sincronización entre procesos En esta situación se puede dar el caso de bloqueo de procesos o incluso una espera indefinida (si un recurso no se libera, punto muerto). Alfonso Antolínez García ® Computación en Sistemas Distribuidos Cooperación entre procesos Alfonso Antolínez García ® Programación Concurrente y Distribuida Sincronización entre procesos La cooperación entre procesos se da cuando varios procesos colaboran entre sí, para llegar a un objetivo común Sus características son: - Comparten datos, por tanto, su ejecución afecta o puede ser afectada por la ejecución de otros procesos. - Ej. una tarea modifica el estado del objeto, otra lo consulta - No son totalmente independientes, sino que su ejecución se conoce en cierta medida. - La cooperación implica comunicación, por lo tanto una necesidad de intercambio de mensajes. - Precisan mecanismos que permitan a los procesos comunicarse y sincronizarse. Alfonso Antolínez García ® Programación Concurrente y Distribuida Sincronización entre procesos En la cooperación se debe asegurar la gestión correcta de los datos compartidos, y el sistema operativo debe proporcionar mecanismos de control que ayuden a garantizar la integridad de tales datos. Ejemplo. Datos a y b en que deben cumplir a = b. Alfonso Antolínez García ® Programación Concurrente y Distribuida Sincronización entre procesos Otra forma de cooperación puede ser mediante la comunicación entre procesos. La comunicación es una forma de coordinar o sincronizar las distintas actividades. No es necesario compartir recursos por lo que no existe problema de acceso exclusivo a ellos. Sin embargo, esta técnica puede producir efectos indeseados como: Bloqueo de procesos. Espera indefinida, debida a la necesidad de la comunicación entre procesos. Alfonso Antolínez García ® Computación en Sistemas Distribuidos Exclusión mutua entre procesos Alfonso Antolínez García ® Programación Concurrente y Distribuida Sincronización entre procesos De la sincronización entre procesos y sus diferentes formas de cooperar surge la necesidad de la exclusión mutua. - Sincronización necesaria cuando los procesos desean utilizar un recurso no compartible - Cuando un proceso está accediendo a este tipo de recursos se dice que está en su sección crítica - Ejemplos: - Acceso en modo escritura a una variable global compartida - Acceso a un disco externo o impresora - Garantizar la exclusión mutua en la ejecución de secciones críticas consiste en diseñar un protocolo de entrada y uno de salida mediante el cual se sincronice la entrada de los procesos a su sección crítica. Alfonso Antolínez García ® Programación Concurrente y Distribuida Sincronización entre procesos - Los protocolos de E/S en la sección crítica deben cumplir: - En la exclusión mutua pura sólo un proceso puede estar en un determinado momento en su sección crítica - Cuando un proceso sale de la sección crítica debe permitir pasar a otro proceso que estaba esperando para acceder a la misma - Por tanto cuando un proceso quiera entrar en su sección crítica y ésta esté libre, podrá hacerlo Un esquema de procesos ejecutando su sección crítica sería: Alfonso Antolínez García ® Computación en Sistemas Distribuidos ¡Muchas Gracias! ¿Preguntas? Alfonso Antolínez García ®