La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

1 Programación Distribuida. Pasaje de mensajes sincrónicos.(SMP) La primitiva de trasmisión sync_send es bloqueante. Es decir el trasmisor queda esperando.

Presentaciones similares


Presentación del tema: "1 Programación Distribuida. Pasaje de mensajes sincrónicos.(SMP) La primitiva de trasmisión sync_send es bloqueante. Es decir el trasmisor queda esperando."— Transcripción de la presentación:

1 1 Programación Distribuida. Pasaje de mensajes sincrónicos.(SMP) La primitiva de trasmisión sync_send es bloqueante. Es decir el trasmisor queda esperando que el mensaje sea recibido. La cola de mensajes asociada con un sync_send sobre un canal se reduce a 1 mensaje. Esto significa menor memoria. Si bien send y sync_send son similares (en algunos casos intercambiables) la semántica es diferente y las posibilidades de deadlock mayores en comunicación sincrónica. Sistemas Distribuidos Clase 2 Naturalmente el grado de concurrencia se reduce respecto de la sincronización por mensajes asincrónicos. Como contrapartida los casos de falla y recuperación de errores son más fáciles de manejar.

2 2 Pasaje de mensajes sincrónicos. Chan values(INT); Process Producer { INT data[n]; FOR [i=0 to n-1] { #Hacer cálculos productor sync_send values (data[i]); } Process Consumer { INT results[n]; FOR [i=0 to n-1] { receive values (results[i]); #Hacer cálculos consumidor } Sistemas Distribuidos Clase 2

3 3 Pasaje de mensajes sincrónicos. Comentarios. Si los cálculos del productor se realizarán mucho más rápido que los del consumidor en las primeras n1 operaciones y luego se realizaran mucho más lento durante otras n1 interacciones. Con el esquema sincrónico los pares send/receive se completaran asumiendo la demora del proceso que más tiempo consuma. Si la relación de tiempo fuera 10-1 esto significaría multiplicar por 10 los tiempos totales. En cambio la misma solución con mensajes asincrónicos, al principio el productor es más rápido y sus mensajes se encolan. Luego el consumidor es más rápido y descuenta tiempo consumiendo la cola de mensajes. --> Mayor concurrencia en AMP. Sistemas Distribuidos Clase 2

4 4 Pasaje de mensajes sincrónicos. El tema del deadlock. Supongamos dos procesos que intercambian valores: chan in1(INT), in2(INT); Process P1 { INT value1 = 1, value2; sync_send in2(value1); receive in1 (value2); } Process P2 { INT value1, value2=2; sync_send in1(value2); receive in2 (value1); } Con mensajes sincrónicos esta solución entra en deadlock. Por qué?? En cambio con AMP esta resolución es perfectamente posible. Sistemas Distribuidos Clase 2

5 5 Mensajes sincrónicos: el lenguaje formal CSP de Hoare. CSP (Hoare 1978) fue uno de los desarrollos fundamentales en Programación Concurrente. Muchos lenguajes reales (OCCAM, ADA, SR) se basan en CSP. La idea básica de Hoare fue la de comunicación guardada: es decir pasaje de mensajes con waiting selectivo. Canal: link directo entre dos procesos en lugar de mailbox global. Son half-duplex y nominados. Sentencias de Entrada y Salida ( ? ! ) : único medio por el cual los procesos se comunican. Efecto de la comunicación sentencia de asignación distribuida. Sistemas Distribuidos Clase 2

6 6 El lenguaje CSP de Hoare. Primeros ejemplos. Formas generales de sentencias de comunicación: Destino ! port(e 1,..., e n ); Fuente ? port(x 1,..., x n ); Destino y Fuente nombran un proceso. port es un canal de comunicación simple en el proceso destino o un elemento de un arreglo de ports en el proceso destino. Los ports son usados (declarados) para distinguir entre distintas clases de mensajes que un proceso podría recibir. Dos procesos se comunican cuando ejecutan sentencias de comunicación que hacen matching. A! canaluno(dato); #el proceso A envia por canaluno B? canaluno(resultado); #el proceso B recibe por canaluno Sistemas Distribuidos Clase 2

7 7 El lenguaje CSP de Hoare. Primeros ejemplos. El nombre de los ports sirve para distinguir los tipos de mensajes que maneja un proceso. Si hay sólo un tipo de mensajes, port se puede omitir. Asimismo si hay un solo dato en juego, los paréntesis se pueden omitir. Un proceso filtro que copia caracteres recibidos del proceso West al proceso East: Process Copy { CHAR c; do true West ? c; East ! c ; od } Las operaciones de comunicación (? ! ) pueden ser guardadas, es decir hacer un AWAIT hasta que una condición sea verdadera. Sistemas Distribuidos Clase 2

8 8 El lenguaje CSP de Hoare. Primeros ejemplos. Server que calcula el Máximo Común Divisor de dos enteros con algoritmo de Euclides: GCD espera recibir entrada en su port args desde un único cliente. Envía la respuesta al port result del cliente. Process GCD { INT Id, x, y; do true Client[*] ? args(Id, x,y); #Lo que sigue se repite hasta que x==y do x > y x := x - y;  x < y y := y - x; od Client[Id] ! result(x); od } Client se comunica con GCD ejecutando:... GCD ! args(v1, v2); GCD ? result(r)... Sistemas Distribuidos Clase 2

9 9 CSP: comunicación guardada. Un proceso puede tener que realizar una comunicación sólo si se da una condición: IF B1; comunicación1----> S1;  B2; comunicación2----> S2; FI Asimismo en el ejemplo del COPY, si manejamos un buffer de tamaño 2, el proceso que copia puede estar recibiendo un segundo caráter de West o enviando un carácter a East. Process Copy2 { CHAR c1, c2; West ? c1; DO West ? C2--> East ! c1 ; c1=c2;  East ! c1 ; West? C1; od } Sistemas Distribuidos Clase 2

10 10 Generalización del COPY en CSP para un buffer limitado.. Process Copy { CHAR buffer[80]; INT front = 0, rear = 0, count = 0 do count < 80; West ? buffer[rear] count = count + 1; rear = (rear + 1)MOD 80;  count > 0; East ! buffer[front] count := count - 1; front := (front + 1) MOD 80; od } Notar que: ۷con AMP, procesos como West e East ejecutan a su propia velocidad pues hay buffering implícito. ۷con SMP, es necesario programar un proceso adicional para implementar buffering si es necesario. Sistemas Distribuidos Clase 2

11 11 Proceso de asignación de recursos en CSP. Process Allocator { INT avail = MaxUnits; SET units = valores iniciales; INT index, unitid; DO avail >0; client[*] ? acquire(index)---> avail = avail -1; remove (units, unitid); client[index] ! reply(unitid);  client[*] ? release(index, unitid)---> avail=avail +1; insert (units, unitid); OD } La solución sincrónica utiliza la definición de múltiples ports de CSP y resulta muy simple y clara. Sistemas Distribuidos Clase 2

12 12 Intercambio de valores entre dos procesos en CSP. Supongamos dos procesos que intercambian valores: Process P1 { INT value1 = 1, value2; IF P2 ! value1 ---> P2 ? value2;  P2 ? value2 ---> P2 ! value1; FI } Process P2 { INT value1, value2=2; IF P1 ! value2 ---> P1 ? value1;  P1 ? value1 ---> P1 ! value2; FI } Esta solución simétrica NO tiene deadlock porque el no determinismo en ambos procesos hace que se acoplen las comunicaciones correctamente. Sistemas Distribuidos Clase 2

13 13 CSP: Generación de números primos: la criba de Eratóstenes. Idea: generar todos los primos entre 2 y n n Comenzando con el primer número, 2, recorremos la lista y borramos los múltiplos de ese número. Si n es impar: n Pasamos al próximo número, 3, y borramos sus múltiplos. Si seguimos hasta que todo número fue considerado, los que quedan son todos los primos entre 2 y n. Sistemas Distribuidos Clase 2

14 14 La criba de Eratóstenes: solución paralela en CSP. Process Sieve[i = 2 TO L] { INT p, next; Sieve[i-1] ? p # p es primo DO Sieve[i-1] ? Next ---> #recibe el proximo candidato IF (next MOD p) <> 0 ---> #podría ser primo Sieve[i+1] ! Next; #entonces lo pasa FI OD } El número total L de procesos Sieve debe ser lo suficientemente grande para garantizar que todos los primos hasta n se generan. Sistemas Distribuidos Clase 2

15 15 Resumiendo... Pasaje de mensajes sincrónicos. La primitiva de trasmisión sync_send es bloqueante. Es decir el trasmisor queda esperando que el mensaje sea recibido. La cola de mensajes asociada con un sync_send sobre un canal se reduce a 1 mensaje. Esto significa menor memoria. En mensajes sincrónicos las posibilidades de deadlock son mayores. Sistemas Distribuidos Clase 2 El grado de concurrencia se reduce respecto de la sincronización por mensajes asincrónicos. Como contrapartida los casos de falla y recuperación de errores son más fáciles de manejar.

16 16 Resumiendo... El lenguaje CSP de Hoare. CSP (Hoare 1978) fue uno de los desarrollos fundamentales en Programación Concurrente. Muchos lenguajes reales (OCCAM, ADA, SR) se basan en CSP. La idea básica de Hoare fue la de comunicación guardada: es decir pasaje de mensajes con waiting selectivo. Canal: link directo entre dos procesos en lugar de mailbox global. Son half-duplex y nominados. Sentencias de Entrada y Salida ( ? ! ) : único medio por el cual los procesos se comunican. Efecto de la comunicación sentencia de asignación distribuida. Sistemas Distribuidos Clase 2

17 17 El lenguaje de programación OCCAM Hoare introdujo CSP como lenguaje formal que sigue el modelo de pasaje de mensajes sincrónicos, pero nunca fue implementado. OCCAM es un lenguaje real, que implementa lo esencial de CSP sobre una arquitectura modelo que físicamente se ha desarrollado y que son los trasputers. Trasputers + OCCAM constituyen una combinación que permite hablar de sistema multiprocesador para procesamiento concurrente, donde tanto la arquitectura como el lenguaje son simples y perfectamente adecuadas a la programación concurrente con mensajes sincrónicos. Sistemas Distribuidos Clase 2

18 18 El lenguaje de programación OCCAM. Lenguaje simple con una sintaxis rígida: Cada proceso primitivo, constructor o declaración ocupa una línea; se usa : al final de una declaración y hay una rígida indentación. Los procesos y los caminos de comunicación entre ellos son estáticos (definidos al momento de la compilación).Un programa en OCCAM tiene un número estático de procesos y comunicaciones estáticas entre ellos. Las sentencias básicas (asignación y comunicación) son vistas como procesos primitivos. Sistemas Distribuidos Clase 2 El modelo de comunicación es sincrónico por canales half duplex.

19 19 Conceptos del lenguaje de programación OCCAM Occam no soporta recursión o cualquier forma de creación o nombrado dinámico. Esto hace que muchos algoritmos sean difíciles de programar. Sin embargo, asegura que un compilador Occam puede determinar exactamente cuántos procesos contiene un programa y cómo se comunican uno con otro. Esto, y el hecho de que distintos constructores no pueden compartir variables, hace posible para un compilador asignar procesos y datos a procesadores en una máquina de memoria distribuida tal como un transputer. Sistemas Distribuidos Clase 2

20 20 El lenguaje de programación OCCAM Las unidades básicas de un programa Occam son declaraciones y tres "procesos" primitivos: asignación, input(receive),output (sync_send). Los canales son declarados globales a los procesos. Sin embargo, cada canal debe tener exactamente un emisor y un receptor. Los procesos primitivos se combinan en procesos convencionales usando constructores (sentencias estructuradas). Estos incluyen un constructor secuencial SEQ, un constructor paralelo PAR similar a la sentencia co, y una sentencia de comunicación guardada. Un constructor puede ser precedido por declaraciones de variables y canales; el alcance de estos ítems es el constructor. Sistemas Distribuidos Clase 2

21 21 El lenguaje OCCAM: constructores SEQ y PAR En la mayoría de los lenguajes, el default es ejecutar sentencias secuencialmente; el programador tiene que decir explícitamente cuándo ejecutar sentencias concurrentemente. Occam toma una aproximación distinta: no hay default. En lugar de esto, contiene dos constructores básicos: SEQ para ejecución secuencial y PAR para ejecución paralela. Por ejemplo, el siguiente programa incrementa x, luego y: INT x,y : SEQ x := x + 1 y := y + 1 Sistemas Distribuidos Clase 2

22 22 El lenguaje OCCAM: constructores SEQ y PAR En el ejemplo anterior, dado que las dos sentencias acceden variables distintas, pueden ser ejecutadas concurrentemente. Esto se expresa por: INT x,y : PAR x := x + 1 y := y + 1 Lo que cambia es el nombre del constructor, para indicarle al compilador y el monitor de ejecución si puede haber concurrencia. PAR no es tan poderoso como la sentencia co pues los procesos Occam no pueden compartir variables. Sistemas Distribuidos Clase 2

23 23 Comentarios sobre el constructor PAR en OCCAM Los procesos especificados usando PAR ejecutan con igual prioridad y sobre cualquier procesador. El constructor PRI PAR puede usarse para especificar que el primer proceso tiene la prioridad más alta, el segundo la siguiente, etc. El constructor PLACED PAR puede usarse para especificar explícitamente dónde es ubicado y por lo tanto ejecutado cada proceso Sistemas Distribuidos Clase 2

24 24 El lenguaje de programación OCCAM: otros constructores El constructor IF se usa para alternativas: es similar a la sentencia IF guardada usada en el texto, pero hay dos diferencias: las guardas son evaluadas en el orden en que están listadas, y al menos una guarda debe ser TRUE. El constructor CASE es una variante de IF que puede ser usada para alternativas múltiples. El constructor WHILE es uno de los mecanismos de iteración; es como la sentencia while de Pascal. El constructor ALT soporta comunicación guardada. Cada guarda consta de un input process, una expresión booleana y un input process, o una expresión booleana y un SKIP (lo cual se reduce esencialmente a una expresión booleana pura). Sistemas Distribuidos Clase 2

25 25 Replicadores en OCCAM. Occam también contiene un mecanismo interesante llamado replicador. Es similar a un cuantificador y se usa del mismo modo. Por ejemplo, lo siguiente declara un arreglo pepe de 21 elementos e iterativamente asigna un valor a cada elemento: [20] INT pepe : SEQ i = 0 FOR 10 pepe[i] := i Como vemos, solo el límite superior del arreglo se declara; el límite inferior es implícitamente 0 para todos los arreglos. Las matrices se declaran como arreglos de arreglos. Un replicador no agrega nueva funcionalidad al lenguaje, solo es una abreviación para un conjunto de componentes. Occam requiere que el límite superior sea una constante, y por lo tanto un replicador siempre puede ser expandido para dar un programa equivalente pero más largo. Sistemas Distribuidos Clase 2

26 26 Comunicación y sincronización en OCCAM Como dijimos, las sentencias en los distintos constructores de Occam no pueden compartir variables. Para comunicarse y sincronizar, deben usar canales. Una declaración de canal tiene la forma: CHAN OF protocol name : El protocolo define el tipo de valores que son transmitidos por el canal. Pueden ser tipos básicos, arreglos de longitud fija o variable, o registros fijos o variantes. Los procesos pueden ser creados con el constructor PAR. Los canales son accedidos por los procesos primitivos input (?) y output (!). A lo sumo un proceso puede emitir por un canal, y a lo sumo uno puede recibir por un canal. Dado que el nombrado es estático, un compilador Occam puede forzar este requerimiento. Sistemas Distribuidos Clase 2

27 27 Comunicación y sincronización en OCCAM. Un ejemplo. WHILE TRUE BYTE ch : SEQ keyboard ? ch ch ! screen Aquí, keyboard y screen son canales que se asume que están conectados a dispositivos periféricos. Aunque Occam no define mecanismos de E/S como parte del lenguaje, provee mecanismos para ligar canales de E/S a dispositivos. El sistema de desarrollo en transputer, por ejemplo, contiene una librería de procedures de E/S de modo de vincular canales lógicos y dispositivos físicos. Sistemas Distribuidos Clase 2

28 28 Comunicación y sincronización en OCCAM. Un ejemplo. El programa anterior usa un buffer simple, ch. Puede convertirse en un programa concurrente que use doble buffering empleando dos procesos, uno para leer desde el teclado y uno para escribir en la pantalla. El proceso se comunica usando un canal adicional comm; cada uno tiene un carácter local ch: CHAN OF BYTE comm : PAR WHILE TRUE BYTE ch : SEQ keyboard ? ch comm ! ch WHILE TRUE BYTE ch : SEQ comm ? ch keyboard ! ch Sistemas Distribuidos Clase 2

29 29 Uso del constructor ALT en OCCAM El constructor ALT soporta comunicación guardada. Cada guarda consta de un input process, una expresión booleana y un input process. Puede usarse un replicador como abreviatura, por ejemplo, para esperar recibir entrada de uno de un arreglo de canales. Por ejemplo, lo siguiente implementa un alocador de recursos simple: ALT i = 0 FOR n avail > 0 & acquire[i] ? unitid SEQ avail := avail and select unit to allocate reply[i] ! Unitid release[i] ? unitid avail := avail and return unit Sistemas Distribuidos Clase 2

30 30 Uso del constructor ALT en OCCAM. Comentarios. Acquire, reply y release son arreglos de canales, con un elemento para cada cliente i. Se necesitan arreglos pues un canal puede ser usado por solo dos procesos. Occam no permite mensajes nulos (señales) de modo que se debe enviar algún valor por el canal acquire aunque no se use este valor. No se permiten output processes en guardas de un constructor ALT. Esto hace que algunos algoritmos sean duros de programar, pero simplifica la implementación. Esto último es especialmente importante pues Occam es el lenguaje de máquina del transputer. Las guardas en un ALT son evaluadas en orden indefinido(no determinístico). El constructor PRI ALT puede usarse para forzar que las guardas sean evaluadas en el orden deseado. Sistemas Distribuidos Clase 2

31 31 Proceso reloj en OCCAM. Occam también contiene una facilidad de timer. Un timer es una clase especial de canal. Un proceso hardware está siempre listo para enviar hacia algún canal timer declarado en un programa. Si un proceso declara el canal timer myclock, puede leer la hora ejecutando: myclock ? time El proceso también puede demorarse hasta que el reloj alcance un cierto valor ejecutando: myclock ? time AFTER value Aquí, value es un tiempo absoluto, no un intervalo. Un timer también puede usarse en una guarda en un constructor ALT; esto sirve para programar un interval timer. Sistemas Distribuidos Clase 2

32 32 La extensión de lenguajes secuenciales c/bibliotecas específicas Una técnica muy utilizada es el desarrollo de bibliotecas de funciones que permiten comunicar/sincronizar procesos, NO dependientes de un lenguaje de programación determinado. Las soluciones basadas en bibliotecas (tales como LINDA, MPI, PVM) tienden a ser menos eficientes que los lenguajes realesde programación concurrente, aunque tienen la facilidad de agregarseal código secuencial con bajo costo de desarrollo. Las arquitecturas distribuidas han potenciado las soluciones basadas en PVM o MPI (que son básicamente bibliotecas de comunicaciones). Un esquema anterior (y original) es el de LINDA que veremos más adelante. Sistemas Distribuidos Clase 2

33 33 Programación Paralela con el concepto de bag of tasks Se parte del concepto de tener una bolsade tareas que pueden ser compartidas por procesos worker. Cada worker ejecuta un código básico: WHILE (true) { obtener un task de la bolsa IF (no hay más tareas) BREAK; # exit del WHILE ejecutar la tarea, incluyendo la creación de otras tareas; } Este enfoque puede usarse para resolver problemas con un número fijo de tareas y también para soluciones recursivas con nuevas tareas creadas dinámicamente. El paradigma del bag of tasks es sencillo, escalable y favorece el balance de carga entre los procesos. Sistemas Distribuidos Clase 2

34 34 Concepto de bag of tasks. Ejemplo. Consideraremos la multiplicación de 2 matrices a y b de nxn. El ejemplo requiere n 2 productos internos entre filas de a y columnas de b. Cada producto interno es independiente y se puede realizar en paralelo. Suponemos que se dispone de una máquina multiprocesador con PR procesadores físicos, PR < n. Tratando de balancear la carga, puede pensarse en n tareas en la bolsa, una por fila y que cada PR haga uso de un número de tareas de modo de distribuir la carga. Podemos representar la bolsa, simplemente contando filas: INT nextrow = 0; Un worker saca una tarea de la bolsa ejecutando una acción atómica: donde row es una variable local. Notar que lo podemos implementar con un FETCH and ADD. Sistemas Distribuidos Clase 2

35 35 Multiplicación de matrices con el bag of tasks. INT nextrow =0 # la bolsa de tareas DOUBLE a[n,n], b[n,n], c[n,n]; PROCESS Worker [w=1 TO PR] { INT row; DOUBLE sum; WHILE (true) { # obtener una tarea IF (row >= n) BREAK; Calcular los productos internos para c[row, *] ; } Para terminar el proceso se pueden contar los BREAK, al llegar a n se tiene la matriz c completa y se puede finalizar el cálculo. Sistemas Distribuidos Clase 2


Descargar ppt "1 Programación Distribuida. Pasaje de mensajes sincrónicos.(SMP) La primitiva de trasmisión sync_send es bloqueante. Es decir el trasmisor queda esperando."

Presentaciones similares


Anuncios Google