Está en la página 1de 30

Leccin 9: Programacin mediante paso sncrono de

mensajes
Paso sncrono de mensajes:
notacin simplificada
ejemplo: proceso filtro copiar
notacin general
ejemplo: proceso servidor mcd
Entrada selectiva
o cmo esperar en varios canales a la vez
Ejercicios
Citas y RPC

J. Ezpeleta-P. lvarez 1
Programacin de Sistemas Concurrentes y Distribuidos Univ. de Zaragoza
Paso sncrono de mensajes

Concepto y notacin usados por Hoare (1978)


Communicating Sequential Processes (CSP)
La comunicacin entre procesos se va a llevar a cabo mediante
puertos
una especie
de asignacin
channel of el_tipo ch remota
process producer process consumer
el_tipo x el_tipo y
... ...
x := lo que sea ch => y
ch <= x usar y
... ...

Sentencia de salida Sentencia de entrada

J. Ezpeleta-P. lvarez 2
Programacin de Sistemas Concurrentes y Distribuidos Univ. de Zaragoza
Paso sncrono de mensajes

process oeste process este


cO cE
process copiar

channel of character cE,cO

process oeste process copiar process este


character c character c character c
loop loop loop
cO => c cE => c produce nuevo c
... cO <= c cE <= c

J. Ezpeleta-P. lvarez 3
Programacin de Sistemas Concurrentes y Distribuidos Univ. de Zaragoza
Paso sncrono de mensajes

args
process mcd process client
res

channel of (integer,integer) args


channel of integer res

process mcd process client


integer x,y,m integer a,b,m
integer r := 1 loop
loop obtener a,b
args => (x,y) args <= a,b
... --calcula mcd en m res => m
res <= m

J. Ezpeleta-P. lvarez 4
Programacin de Sistemas Concurrentes y Distribuidos Univ. de Zaragoza
Entrada selectiva
args
process mcd process client
res
res_2 args_2

process client_2

Qu pasa cuando hay ms de un cliente?


Solucin 1: directa
Solucin 2: escuchar selectivamente en varios canales

either ch1 => var1


... either i:1..n
or ch2 => var2 ch[i] => var
... ...
or ch3 => var3
...

J. Ezpeleta-P. lvarez 5
Programacin de Sistemas Concurrentes y Distribuidos Univ. de Zaragoza
Entrada selectiva
channel of (integer,integer) args,args_2
channel of integer res,res_2
process mcd process client
integer x,y,m,cl integer a,b,m
integer r := 1 loop
loop obtener a,b
either args => (x,y) args <= a,b
cl := 1 res => m
or args_2 => (x,y)
cl := 2 process client_2
... --calcula mcd en m integer a,b,m
if cl=1 loop
res <= m obtener a,b
else --cl=2 args_2 <= a,b
res_2 <= m res_2 => m

J. Ezpeleta-P. lvarez 6
Programacin de Sistemas Concurrentes y Distribuidos Univ. de Zaragoza
Entrada selectiva
channel of (integer,integer) args,args_2
channel of integer res,res_2
process mcd process client
integer x,y,m,cl integer a,b,m
integer r := 1 loop
loop obtener a,b
either args => (x,y) args <= a,b
... --calcula mcd en m res => m
res <= m
or args_2 => (x,y) process client_2
... --calcula mcd en m integer a,b,m
res_2 <= m loop
obtener a,b
args_2 <= a,b
res_2 => m

J. Ezpeleta-P. lvarez 7
Programacin de Sistemas Concurrentes y Distribuidos Univ. de Zaragoza
Ejemplo: la criba de Eratstenes

La criba de Eratstenes: encuentra los primos menores o iguales


que un n dado
Secuencial sencillo:
el 2 es primo; tachar su mltiplos.
el primero no tachado (el 3) es primo; tachar sus mltiplos
el primero no tachado (el 5) es primo; tachar sus mltiplos. etc.
Una versin en pipe-line:

P1 P2 P3 P4 ...

obtiene el 2 y deja obtiene el 3 y deja obtiene el 5 y deja


pasar los no pasar los no pasar los no
mltiplos de 2 mltiplos de 3 mltiplos de 5

J. Ezpeleta-P. lvarez 8
Programacin de Sistemas Concurrentes y Distribuidos Univ. de Zaragoza
Ejemplo: "Pipeline sort"

"Pipeline sort": utilizando n procesos y con un flujo de datos


como el que se esquematiza en la figura, proponer un algoritmo
de ordenacin para n datos, de manera que al terminar cada
proceso tiene el valor que le corresponde de la secuencia de datos,
segn el orden ascendente

P1 P2 P3 P4 ... Pn

J. Ezpeleta-P. lvarez 9
Programacin de Sistemas Concurrentes y Distribuidos Univ. de Zaragoza
Ejemplo: producto matriz por vector

Problema: calcular x=Ab siendo A una matriz nxn y x y


b vectores nx1
Una solucin sncrona, usando nxn procesadores:
V1: cada P(i,j) tiene almacenado A[i,j]
V2: el valor A[i,j] se tiene que suministrar en una fase previa
b1 bn
b j 0 .... x1
A b
j 1

A b
j
P1,1 P1,n
i j i j
1 1 b1 bn
Pi,j
... ...
b
j b1 bn
0
Pn,1
.... Pn,n
xn

J. Ezpeleta-P. lvarez 10
Programacin de Sistemas Concurrentes y Distribuidos Univ. de Zaragoza
Ejemplo: rbol de evaluacin

J. Ezpeleta-P. lvarez 11
Programacin de Sistemas Concurrentes y Distribuidos Univ. de Zaragoza
Ejercicio: los filsofos
channel of integer[1..n] canFil
channel of (integer,integer) entrada

process servidor
process filosofo(i:1..n) integer who,what
integer kk set of integer tenLibres := {1..n}
set of integer filEsperan := {}
loop forever loop forever
--piensa entrada => (who, what)
entrada <= (i,COGER) switch
canFil[i] => kk what=DEJAR: ...
--come what=COGER: ...
entrada <= (i,DEJAR) end switch
end loop

J. Ezpeleta-P. lvarez 12
Programacin de Sistemas Concurrentes y Distribuidos Univ. de Zaragoza
Ejercicio: los filsofos

switch --operaciones MOD n


what=COGER:
if who IN libres AND who+1 IN libres
canFil[who] <= 1
libres := libres \ {who,who+1}
else
esperan := esperan UNION {who}
end if

J. Ezpeleta-P. lvarez 13
Programacin de Sistemas Concurrentes y Distribuidos Univ. de Zaragoza
Ejercicio: los filsofos
switch --operaciones MOD n
what=COGER: . . .
what=DEJAR:
if (who-1 IN libres) AND (who-1 IN filEsperan)
canFil[who-1] <= 1
libres := libres \ {who-1}
filEsperan := filEsperan \ {who-1}
else
libres := libres UNION {who}
end if

if (who+1 IN filEsperan) AND (who+2 IN libres)


canFil[who+1] <= 1
libres := libres \ {who+2}
filEsperan := filEsperan \ {who+1}
else
libres := libres UNION {who+1}
end if
J. Ezpeleta-P. lvarez 14
Programacin de Sistemas Concurrentes y Distribuidos Univ. de Zaragoza
RPC

Remote Procedure Call: un cliente invoca servicios de un servidor


que puede estar en otro procesador
cliente invoca como una operacin normal
el servidor pone en marcha un proceso para atenderlo
Servidor y cliente se deben
compilar con un interfaz
comn
para parmetros y
operaciones
RMI para Java
Remote Method Invocation

J. Ezpeleta-P. lvarez 15
Programacin de Sistemas Concurrentes y Distribuidos Univ. de Zaragoza
Citas
entry C(x: in ...;
y: in out ...;
z: out ...);
... asimetra
task body T1 is
begin
...
accept C(x,y,z) do
instr
end C2;
...
task body T2 is
end T1;
begin
...
T1.C(a,b,c);
...
end T1;

J. Ezpeleta-P. lvarez 16
Programacin de Sistemas Concurrentes y Distribuidos Univ. de Zaragoza
Canales sncronos en C++ y Java

channel of T canal

process P1 process P2 process P3


T d1 T d2 T d3

... ... ...


canal => d1 canal => d2 canal => d3
... ... ...
canal <= exp canal <= exp2 canal <= exp3
... ... ...

J. Ezpeleta-P. lvarez 17
Programacin de Sistemas Concurrentes y Distribuidos Univ. de Zaragoza
channel of T canal

P1
P2

J. Ezpeleta-P. lvarez 18
Programacin de Sistemas Concurrentes y Distribuidos Univ. de Zaragoza
Socket soc(SERVER_PORT); canal ==== port (no tipado)

int socket_fd = soc.Bind();

int error_code = soc.Listen(nC);

P1 P2
SERVIDOR (IP) CLIENTE
155.210.***.*** J. Ezpeleta-P. lvarez 19
Programacin de Sistemas Concurrentes y Distribuidos Univ. de Zaragoza
Socket soc(SERVER_PORT); canal ==== port (no tipado)

Socket sC(SERVER_ADDRESS,
int socket_fd = soc.Bind();
SERVER_PORT);
int error_code = soc.Listen(nC);

P1 P2
SERVIDOR (IP) CLIENTE
155.210.***.*** J. Ezpeleta-P. lvarez 20
Programacin de Sistemas Concurrentes y Distribuidos Univ. de Zaragoza
Socket soc(SERVER_PORT); canal ==== port (no tipado)

Socket sC(SERVER_ADDRESS,
int socket_fd = soc.Bind();
SERVER_PORT);
int error_code = soc.Listen(nC);
int socket_fd = sC.Connect();
int client_fd = soc.Accept();

P1 P2
SERVIDOR (IP) CLIENTE
155.210.***.*** J. Ezpeleta-P. lvarez 21
Programacin de Sistemas Concurrentes y Distribuidos Univ. de Zaragoza
Socket soc(SERVER_PORT); canal ==== port (no tipado)

Socket sC(SERVER_ADDRESS,
int socket_fd = soc.Bind();
SERVER_PORT);
int error_code = soc.Listen(nC);
int socket_fd = sC.Connect();
int client_fd = soc.Accept();

int rcv_bytes = soc.Rcv( int send_bytes = sC.Send(


client_fd, buffer, length); socket_fd, message);

int send_bytes = soc.Send(


client_fd, buffer);
int read_bytes = sC.Recv(
socket_fd, buffer, length);
error_code = soc.Close(
client_fd);

error_code = soc.Close( int error_code = sC.Close(


socket_fd); socket_fd);

P1 P2
SERVIDOR (IP) CLIENTE
155.210.***.*** J. Ezpeleta-P. lvarez 22
Programacin de Sistemas Concurrentes y Distribuidos Univ. de Zaragoza
channel of T canal

P1
P2

J. Ezpeleta-P. lvarez 23
Programacin de Sistemas Concurrentes y Distribuidos Univ. de Zaragoza
ss=new ServerSocket(PORT#)
canal ==== port (no tipado)

import java.net.Socket;
import java.net.ServerSocket;
can=ss.accept()

P1
P2
SERVIDOR (IP)
CLIENTE
155.210.***.***

J. Ezpeleta-P. lvarez 24
Programacin de Sistemas Concurrentes y Distribuidos Univ. de Zaragoza
ss=new ServerSocket(PORT#) cs=new Socket(IP,PORT#)

can=ss.accept()

P1
P2
SERVIDOR (IP)
CLIENTE
155.210.***.***

J. Ezpeleta-P. lvarez 25
Programacin de Sistemas Concurrentes y Distribuidos Univ. de Zaragoza
ss=new ServerSocket(PORT#) cs=new Socket(IP,PORT#)

can=ss.accept()

oS=cs.getOutputStream()

iS=can.getInputStream()

iS=cs.getInputStream()

out=can.getOutputStream()

P1
P2
SERVIDOR (IP)
CLIENTE
155.210.***.***

J. Ezpeleta-P. lvarez 26
Programacin de Sistemas Concurrentes y Distribuidos Univ. de Zaragoza
ss=new ServerSocket(PORT#) cs=new Socket(IP,PORT#)

can=ss.accept()

oS=cs.getOutputStream();
pW=new PrintWriter(
iS=can.getInputStream() oS,
true);

pW.println("Hola");

out=can.getOutputStream()

P1
P2
SERVIDOR (IP)
CLIENTE
155.210.***.***

J. Ezpeleta-P. lvarez 27
Programacin de Sistemas Concurrentes y Distribuidos Univ. de Zaragoza
ss=new ServerSocket(PORT#) cs=new Socket(IP,PORT#)

can=ss.accept()

iS=can.getInputStream()

iS=cs.getInputStream();
bR=new BufferedReader(
new InputStreamReader(
iS)
out=can.getOutputStream() )
);

mens=bR.readLine();
P1
P2
SERVIDOR (IP)
CLIENTE
155.210.***.***

J. Ezpeleta-P. lvarez 28
Programacin de Sistemas Concurrentes y Distribuidos Univ. de Zaragoza
ss=new ServerSocket(PORT#)

can=ss.accept()
cs=new Socket(IP,PORT#)

P2
CLIENTE

can2=ss.accept()

cs=new Socket(IP,PORT#)

P3
P1 CLIENTE
SERVIDOR (IP)
155.210.***.***

J. Ezpeleta-P. lvarez 29
Programacin de Sistemas Concurrentes y Distribuidos Univ. de Zaragoza
ss=new ServerSocket(PORT#)

can=ss.accept()
cs=new Socket(IP,PORT#)

thread P2
CLIENTE

can2=ss.accept()

thread
cs=new Socket(IP,PORT#)

P3
P1 CLIENTE
SERVIDOR (IP)
155.210.***.***

J. Ezpeleta-P. lvarez 30
Programacin de Sistemas Concurrentes y Distribuidos Univ. de Zaragoza

También podría gustarte