Clase 7 - Programacin Concurrente - 2021
Clase 7 - Programacin Concurrente - 2021
Clase 7 - Programacin Concurrente - 2021
Clase 7
Facultad de Informática
UNLP
Links al archivo con audio
La teoría con los audios está en formato MP4. Debe descargar los
archivos comprimidos de los siguientes links:
Programación concurrente en memoria distribuida:
https://drive.google.com/uc?id=1Xdh_8do7D0XmRQBNDHmHf6
MA3usfZaUS&export=download
Pasaje de Mensajes Asincrónicos (PMA):
https://drive.google.com/uc?id=1h3mD73WydEjYSlGXMxQCiJL
wsyM3QEbt&export=download
Clase 7 2
Programación concurrente en
memoria distribuida
Conceptos generales
Clase 7 4
Características
Clase 7 5
Relación entre mecanismos de sincronización
Busy waiting
Semáforos
Asincrónico
Monitores Pasaje de mensajes Sincrónico
RPC Rendezvous
Clase 7 6
Pasaje de Mensajes
Asincrónicos (PMA)
Uso de canales en PMA
PMA ⇒ canales = colas de mensajes enviados y aún no recibidos.
Declaración de canales → chan ch (id1 : tipo1, ... , idn : tipon )
• chan entrada (char);
• chan acceso_disco (INT cilindro, INT bloque, INT cant, CHAR* buffer);
• chan resultado[n] (INT);
Clase 7 9
Características de los canales
Clase 7 10
Ejemplo
Entrada Salida
Proceso_1 Carac_a_ Proceso_2
linea
Clase 7 11
Productores y consumidores (filtro)
Red de Ordenación
Filtro: proceso que recibe mensajes de uno o más canales de entrada y envía
mensajes a uno o más canales de salida. La salida de un filtro es función de su estado
inicial y de los valores recibidos.
Esta función del filtro puede especificarse por un predicado que relacione los valores
de los mensajes de salida con los de entrada.
Problema: ordenar una lista de N números de modo ascendente. Podemos pensar en
un filtro Sort con un canal de entrada (N números desordenados) y un canal de salida
(N números ordenados).
Process Sort
{ receive todos los números del canal entrada;
ordenar los números;
send de los números ordenados por el canal OUTPUT;
}
Clase 7 12
Productores y consumidores (filtro)
Red de Ordenación
Solución más eficiente que la “secuencial” ⇒ red de pequeños procesos que ejecutan
en paralelo e interactúan para “armar” la salida ordenada (merge network).
Idea: mezclar repetidamente y en paralelo dos listas ordenadas de N1 elementos cada
una en una lista ordenada de 2*N1 elementos.
Con PMA, pensamos en 2 canales de entrada por cada canal de salida, y un carácter
especial EOS cerrará cada lista parcial ordenada.
La red es construida con filtros Merge:
• Cada Merge recibe valores de dos streams de entrada ordenados, in1 e in2, y produce un
stream de salida ordenado, out.
• Los streams terminan en EOS, y Merge agrega EOS al final.
• ¿Cómo implemento Merge?. Comparar repetidamente los próximos dos valores recibidos
desde in1 e in2 y enviar el menor a out.
in1
EOS 9 8 5 5 3 1 1 out
Merge EOS 9 8 8 5 5 5 4 3 2 1 1 1
in2
EOS 8 5 4 2 2 1
Clase 7 13
Productores y consumidores (filtro)
Red de Ordenación
Process Merge
{ int v1, v2;
receive in1(v1);
receive in2(v2);
while (v1 ≠ EOS) and (v2 ≠ EOS)
{ if (v1 ≤ v2) { send out(v1); receive in1(v1); }
else { send out(v2); receive in2(v2); }
}
Clase 7 14
Productores y consumidores (filtro)
Red de Ordenación
EOS 5 EOS 5 2
Merge
EOS 2
Merge EOS 8 5 2 1
EOS 1
Merge
EOS 8 1 EOS 8 7 6 5 4 3 2 1
EOS 8
Merge
EOS 3 EOS 7 3
Merge
EOS 7
EOS 7 6 4 3
Merge
EOS 4
Merge
EOS 6 EOS 6 4
Clase 7 15
Productores y consumidores (filtro)
Red de Ordenación
Clase 7 16
Clientes y Servidores.
Monitores Activos
Servidor: proceso que maneja pedidos (“requests”) de otros procesos clientes.
¿Cómo implementamos C/S con PMA?
Dualidad entre monitores y PM: cada uno de ellos puede simular al otro.
monitor Mname
{ declaración de variables permanentes;
código de inicialización;
procedure op(formales) { cuerpo de op;}
}
Clase 7 17
Clientes y Servidores.
Monitores Activos
Clase 7 18
Clientes y Servidores.
Monitores Activos – 1 operación
Cliente[1]
Servidor
requerimiento
Cliente[n]
Clase 7 19
Clientes y Servidores.
Monitores Activos – 1 operación
chan requerimiento (int idCliente, tipos de los valores de entrada );
chan respuesta[n] (tipos de los resultados );
Process Servidor
{ int idCliente;
declaración de variables permanentes;
código de inicialización;
while (true)
{ receive requerimiento (IdCliente, valores de entrada);
cuerpo de la operación op;
send respuesta[IdCliente] (resultados);
}
}
Process Cliente [i = 1 to n]
{ send requerimiento (i, argumentos);
receive respuesta[i] (resultados);
}
Clase 7 20
Clientes y Servidores.
Monitores Activos – Múltiples operaciones
Podemos generalizar esta solución de C/S con una única operación para considerar
múltiples operaciones.
El IF del Servidor será un CASE con las distintas clases de operaciones.
El cuerpo de cada operación toma datos de un canal de entrada en args y los
devuelve al cliente adecuado en resultados.
Clase 7 21
Clientes y Servidores.
Monitores Activos – Múltiples operaciones
Process Servidor
{ int IdCliente; clase_op oper; tipo_arg args;
tipo_result resultados;
código de inicialización;
while ( true)
{ receive request(IdCliente, oper, args);
if ( oper == op1 ) { cuerpo de op1;}
.......
elsif ( oper == opn ) { cuerpo de opn;}
send respuesta[IdCliente](resultados);
}
}
Process Cliente [i = 1 to n]
{ tipo_arg mis_args;
tipo_result mis_resultados;
send request(i, opk, mis_args);
receive respuesta[i] (mis_resultados);
}
Clase 7 22
Clientes y Servidores.
Monitores Activos – Múltiples operaciones y variables condición
Hasta ahora el monitor no requería variables condición ya que el Servidor no
requería demorar la atención de un pedido de servicio. Caso general: monitor con
múltiples operaciones y con sincronización por condición. Para los clientes, la
situación es transparente ⇒ cambia el servidor.
Clase 7 23
Clientes y Servidores.
Monitores Activos – Múltiples operaciones y variables condición
Clase 7 24
Clientes y Servidores.
Monitores Activos – Múltiples operaciones y variables condición
Clase 7 26
Clientes y Servidores.
Continuidad Conversacional
Los alumnos son los procesos “clientes”, y los docentes los procesos
“Servidores”. Los procesos servidores son idénticos, y cualquiera de ellos
que esté libre puede atender un requerimiento de un alumno.
Todos los alumnos pueden pedir atención por un canal global y recibirán
respuesta de un docente dado por un canal propio. ¿Por qué?
Clase 7 27
Clientes y Servidores.
Continuidad Conversacional
rta_atención[j]
consulta[i]
respuesta[j] Docente[i]
Alumno[j]
Docente[D]
Alumno[A]
Clase 7 28
Clientes y Servidores.
Continuidad Conversacional
chan atención (int); Process Docente [d = 1 to D]
chan consulta[D] (string); { string preg, res;
chan rta_atención[A](int); int idAlumno;
chan respuesta[A] (string); bool seguir = false;
Clase 7 30
Pares (peers) interactuantes.
Intercambio de Valores – Solución centralizada
Cada proceso tiene un valor V local. Al final todos los procesos deben
conocer el mínimo y máximo valor de todo el sistema.
La arquitectura centralizada es apta para una solución en que todos envían
su dato local V al procesador central, éste ordena los N datos y reenvía la
información del mayor y menor a todos los procesos ⇒ 2(N-1) mensajes.
chan valores(int), resultados[n-1] (int minimo, int maximo);
Process P[0] Process P[i=1 to n-1]
{ int v; int nuevo, minimo = v, máximo = v; { int v; int minimo, máximo;
for [i=1 to n-1] send valores (v);
{ receive valores (nuevo); receive resultados[i-1](minimo, maximo);
if (nuevo < minimo) minimo = nuevo; }
if (nuevo > maximo) maximo = nuevo;
}
for [i=1 to n-1]
send resultados [i-1] (minimo, maximo);
}
Clase 7 32
Pares (peers) interactuantes.
Intercambio de Valores – Solución en anillo circular
Un tercer modo de organizar la solución es tener un anillo donde P[i] recibe
mensajes de P[i-1] y envía mensajes a P[i+1]. P[n-1] tiene como sucesor a P[0].
Esquema de 2 etapas. En la primera cada proceso recibe dos valores y los compara
con su valor local, trasmitiendo un máximo local y un mínimo local a su sucesor. En
la segunda etapa todos deben recibir la circulación del máximo y el mínimo global.
• P[0] deberá ser algo diferente para chan valores[n] (int minimo, int maximo);
“arrancar” el procesamiento. Process P[0]
• Se requerirán (2N)-1 mensajes. { int v=…, minimo = v, máximo=v;
send valores[1] (minimo, maximo);
• Notar que si bien el número de receive valores[0] (minimo, maximo);
mensajes es lineal (igual que en la send valores[1] (minimo, maximo);
centralizada) los tiempos pueden ser }
muy diferentes. ¿Por qué?. Process P[i=1 to n-1]
{ int v=…, minimo, máximo;
receive valores[i] (minimo, maximo);
if (v<minimo) minimo = v;
if (v> maximo) maximo = v;
send valores[(i+1) mod n] (minimo, maximo);
receive valores[i] (minimo, maximo);
if (i < n-1) send valores[i+1] (minimo, maximo);
};
Clase 7 33
Pares (peers) interactuantes.
Comentarios sobre las soluciones
Clase 7 34