You are on page 1of 15

Programacin Concurrente.

3 Ingeniera Tcnica de Sistemas y


Gestin.
Dpto. Lenguajes y Sistemas Informticos. ETSI Informtica

Relacin de problemas
Tema 1. Introduccin.
1. Considerar el siguiente fragmento de programa para 2 procesos A y B:
proceso A: for seqA:= 1 to 10 do x:=x+1;
proceso B: for seqB:= 1 to 10 do x:=x+1;
Suponer que la variable x est inicializada a 0, que ambos procesos A y B se ejecutan una
vez y que seqA y seqB no son variables compartidas. Los dos procesos pueden ejecutarse
a cualquier velocidad. Cules son los posibles valores resultantes para x?. Suponer que x
debe ser cargada en un registro para incrementarse.
2. Cmo se podra hacer la copia del fichero "f" en otro "g", de forma concurrente,
utilizando la instruccin concurrente COBEGIN-COEND?.
3. Construir, utilizando las instrucciones concurrentes COBEGIN-COEND y fork-join,
programas concurrentes que se correspondan con los grafos de precedencia que se
muestran a continuacin:
P0
P1

P2

P4

P1
P4

P3

P0

P0

P3

P5

a)

P2

P3
P4

P5

P6

P1

P2

P5

P6

P6
b)

c)

4. Dado el siguiente fragmento de programa concurrente, obtener su grafo de precedencia


asociado:
P0;
COBEGIN
P1;
P2;
COBEGIN
P3;P4;P5;P6;
COEND
P7;
COEND
P8;

Programacin Concurrente. I.T. Sistemas y Gestin.

Relacin de Problemas 2

5. Suponer un sistema de tiempo real que dispone de un captador de impulsos


conectado a un contador de energa elctrica. La funcin del sistema consiste en contar el
nmero de impulsos producidos en 1 hora (cada Kwh consumido se cuenta como un
impulso) e imprimir este nmero en un dispositivo de salida. Para ello se ha de escribir
un programa concurrente con 2 procesos: un proceso acumulador (lleva la cuenta de los
impulsos recibidos) y un proceso escritor (escribe en la impresora). En la variable comn
a los 2 procesos "n" se lleva la cuenta de los impulsos. Suponiendo que el sistema se
encuentra en un estado correspondiente al valor de la variable n=N y en estas
condiciones se presentan simultneamente un nuevo impulso y el final del periodo de 1
hora, obtener las posibles secuencias de ejecucin de los procesos y cules de ellas son
correctas.
6. La inhibicin de las interrupciones no funciona correctamente cuando hay secciones
crticas anidadas. Escribir 2 rutinas: ProtocoloEntrada (conecta las interrupciones) y
ProtocoloSalida (las desconecta) para resolver el problema.
7. En vez de la instruccin TestAndSet, algunos ordenadores proveen de una instruccin
atmica que incrementa en 1 el valor de Lock:
FUNCTION {ATOMICA} TestAndInc(VAR Lock:INTEGER):INTEGER;
BEGIN
TestAndInc:=Lock; Lock:=Lock+1
END;
Escribir protocolos (uno de entrada y otro de salida) para una seccin crtica utilizando
dicha instruccin.
8. Suponer que el siguiente algoritmo (insercin directa):
PROCEDURE sort(inferior,superior:INTEGER);
VAR i,j: INTEGER;
BEGIN
FOR i := inferior TO superior-1 DO
FOR j := i+1 TO superior DO
IF a[j] < a[i] THEN swap(a[i], a[j]);
END;
quisiese ser utilizado en un programa paralelo de la forma siguiente:
COBEGIN sort(1,n);sort(n+1,2n) COEND;merge(1,n+1,2n);
a) Si el tiempo de ejecucin secuencial del algoritmo es t(n)=n(n-1)/2 ( n2/2); Cul
sera el tiempo de ejecucin del programa paralelo si la mezcla lleva en realizarse n
operaciones?
b) Comprubese con una tabla que el nmero de operaciones del algoritmo paralelo
es significativamente menor.
c) Escribir un procedimiento de mezcla que permitiese paralelizar las 3 operaciones:
COBEGIN sort(1,n);sort(n+1,2n);merge(1,n+1,2n) COEND;
9. Escribir un programa concurrente para multiplicar matrices 3x3 con 3 procesos
concurrentes. (Nota: suponer que los elementos de las matrices se pueden leer
simultneamente).
10. Con el grafo de sincronizacin de la figura, escribir 2 protocolos:

Programacin Concurrente. I.T. Sistemas y Gestin.

Relacin de Problemas 3

EsperarPor (A:actividad) {espera que acabe la actividad A}


Acabar (A:actividad) {hace constar, actividad A acabada}
A
B
C
D

que permitan la sincronizacin perfecta de las actividades del grafo. Prever que el grafo de
actividades puede ser ejecutado ms de una vez.
11. Qu significa un ciclo en un grafo de sincronizacin?
Tema 2. Exclusin Mutua.
12. Qu diferencia fundamental existe entre un bucle de espera activa y una variable
interruptor que da turnos para la sincronizacin de los procesos?
13. Utiliza espera ocupada el Algoritmo de Dekker, si el segundo proceso est en su
seccin, Turno= 1 y el proceso 1 est intentando entrar en su seccin?
14. Demostrar que el A. de Dekker hace posible que un proceso espere indefinidamente
("inanicin") a entrar en su seccin Crtica, con la suposicin de que siempre que un
proceso entra en la seccin Crtica eventualmente la abandonar.
15. Generalizar el A. de Dekker para 3 procesos.
16. Podra pensarse que una posible solucin al problema de la exclusin mutua, Sera el
siguiente algoritmo que no necesita compartir una variable "Turno" entre los 2 procesos?
a) Se satisface la exclusin mutua?
b) Se satisfacen las propiedades de vivacidad?
Compararlo con el Algoritmo de Dekker. Imaginar escenarios que demuestren las
contestaciones.
Proceso i
ci=0;
while cj=0 do
begin
ci:=1;
while cj=0 do;ci=0;
end;
(*Seccion Critica*)
ci:=1;
17. No se podra construir una solucin ms simple al problema de la exclusin mutua que
el Algoritmo de Dekker utilizando la instruccin atmica TestAndSet(l)? Cul Sera dicha
solucin?.

Programacin Concurrente. I.T. Sistemas y Gestin.

Relacin de Problemas 4

18. Qu ocurrira si el A. de Dekker se hubiera programado as?


Proceso Pi;
BEGIN
REPEAT
Turno:=i;
WHILE Turno<>i DO ;
(*Seccion Critica*)
Turno:=j;
FOREVER
END;
19. Al siguiente algoritmo se le conoce como solucin de Hyman al problema de la exclusin
mutua. Es correcta dicha solucin?
Proceso i
(* inicialmente: c1,c2<-1, turno<-1 *)
ci=0;
while Turno<>i do
begin
while cj=0 do;
Turno:=i;
end;
(*Seccion Critica*)
ci=1;
20. Se tienen 2 procesos concurrentes que representan 2 mquinas expendedoras de
tickets (sealan el turno en que ha de ser atendido el cliente), los nmeros de los tickets
se representan por dos variables n1 y n2 que valen inicialmente 0. El proceso con el
nmero de ticket ms bajo entra en su seccin Crtica. En caso de tener 2 nmeros
iguales se procesa primero el proceso nmero 1.
a) Demostrar que se verifican las propiedades de vivacidad de la solucin.
b) Demostrar que los valores ni=1 son necesarios.
PROGRAM PanaderiaDeLamport;
VAR n1,n2:INTEGER;
PROCEDURE P1;
PROCEDURE P2;
BEGIN
BEGIN
REPEAT
REPEAT
n1:=1;
n2:=1;
n1:=n2+1;
n2:=n1+1;
WHILE (n2<>0) AND
WHILE (n1<>0) AND
(n2<n1) DO;
(n1<=n2) DO;
(*Region Critica*) (*Region Critica*)
n1:=0;
n2:=0;
...
...
FOREVER
FOREVER
END;
END;
BEGIN
n1:=0; n2:=0;
COBEGIN P1;P2 COEND;
END.
21. El siguiente programa es una solucin al problema de la

exclusin mutua

para 2

Programacin Concurrente. I.T. Sistemas y Gestin.

Relacin de Problemas 5

procesos. Discutir la correccin de esta solucin: si es correcta, entonces probarlo. Si no


fuese correcta, escribir escenarios que demuestren que la solucin es incorrecta.
PROGRAM intento; (Inicialmente c1,c2<- 1)
VAR c1,c2:INTEGER;
PROCEDURE P1;
BEGIN
REPEAT
REM1;
REPEAT
c1:=1-c2;
UNTIL c2<>0;
CRIT1;
C1:=1;
FOREVER;
END;

PROCEDURE P2;
BEGIN
REPEAT
REM2;
REPEAT
c2:=1-c1;
UNTIL c1<>0;
CRIT2;
C2:=1;
FOREVER;
END;

BEGIN
c1:=1;c2:=1;
COBEGIN P1;P2 COEND
END.
22. Los ordenadores IBM 360/370 tienen una instruccin llamada TST(TestAndSet).
Existe una variable global del sistema (en memoria comn a los procesadores) llamada
cdigo de condicin. Ejecutando TST(l) para la variable local l se obtendra lo mismo que
con las 2 sentencias siguientes:
l:=c;
c:=1;
Discutir la correccin de la solucin al problema de la exclusin mutua del siguiente
algoritmo.
Qu ocurrira si la instruccin TST fuese reemplazada por las 2 sentencias?
PROGRAM TestAndSet;
VAR c:INTEGER;
PROCEDURE P1;
PROCEDURE P2;
VAR l:INTEGER;
VAR l:INTEGER;
BEGIN
BEGIN
REPEAT
REPEAT
REM1;
REM2;
REPEAT
REPEAT
TST(l)
TST(l)
UNTIL l=0;
UNTIL l=0;
CRIT1;
CRIT2;
c:=0;
c:=0;
FOREVER
FOREVER
END;
END;

| BEGIN
| c:= 0;
| COBEGIN
|
P1;P2
| COEND
| END.

23. La instruccin EX intercambia los contenidos de 2 posiciones de memoria. EX(a,b) es


equivalente a una ejecucin indivisible de las 3 operaciones siguientes:
temp:=a;
a:=b;
b:=temp;
a) Discutir la correccin de la solucin para el algoritmo de exclusin mutua siguiente.

Programacin Concurrente. I.T. Sistemas y Gestin.

Relacin de Problemas 6

b) Qu ocurrira si la instruccin primitiva EX fuese reemplazada por las 3 asignaciones


anteriores?
PROGRAM Intercambio;
VAR c:INTEGER;
PROCEDURE P1;
PROCEDURE P2;
VAR l:INTEGER;
VAR l:INTEGER;
BEGIN
BEGIN
l:=0;
l:=0;
REPEAT
REPEAT
REM1;
REM2;
REPEAT
REPEAT
EX(c,l);
EX(c,l);
UNTIL l=1;
UNTIL l=1;
CRIT1;
CRIT2;
EX(c,l);
EX(c,l);
FOREVER;
FOREVER; END;
END;
END;

|
|
|
|
|
|

BEGIN
c:=1;
COBEGIN
P1;P2
COEND
END.

Programacin Concurrente. I.T. Sistemas y Gestin.

Relacin de Problemas 7

24. Considerar el siguiente algoritmo de exclusin mutua para n procesos (algoritmo de


Knuth):
Proceso(i)
c: ARRAY[0..n] OF (pasivo, solicitando, enS_C);
c:= pasivo;
Turno:= 0;
. . .
REPEAT
c[i]:= solicitando;
j:= Turno;
WHILE j<>i DO
IF c[j]<>pasivo THEN j:=Turno
ELSE j:=(j-1) MOD n ;
c[i]:= en_SC;
k:= 0;
WHILE k<=n AND (k=i OR c[k]<>enS_C) DO
k:=k + 1;
UNTIL k >= n;
Turno:= i;
(* SECCION CRITICA *)
Turno:= (i-1) MOD n ;
c[i]:= pasivo;
Escribir un escenario en el que 2 procesos consiguen pasar el bucle de la instruccin (7),
suponiendo que el turno lo tiene inicialmente el proceso P(0).
25. Demostrar que en la generalizacin del algoritmo de Peterson para "n" procesos :
REPEAT
FOR j:= 1 TO n-1 DO
BEGIN
q[i]:=j;
turno[j]:=i;
WHILE (k<>i: q[k]>=j) AND (turno[j]=i) DO;
END;
.....SECCION CRITICA........
q[i]:=0;
UNTIL FALSE;
cuando un proceso pasa a la etapa siguiente, se verifica una de estas dos condiciones:
a) precede a todos los dems
b) no estaba solo en la etapa que ha dejado

Programacin Concurrente. I.T. Sistemas y Gestin.

Relacin de Problemas 8

Tema 3. Monitores.
26. Aunque un monitor garantiza la exclusin mtua, los procedimientos tienen que ser
re-entrantes. Explicar porqu.
27. Demostrar que incluso si la implementacin del semforo es FIFO, la simulacin del
monitor con semforos no lo es.
28. Se consideran dos recursos denominados r1 y r2. Del recurso r1 existen N1 ejemplares
y del recurso r2 existen N2 ejemplares. Escribir un monitor que gestione la asignacin de
los recursos a los procesos de usuario, suponiendo que cada proceso puede pedir:
un ejemplar del recurso r1
un ejemplar del recurso r2
un ejemplar del recurso r1 y otro del recurso r2
La solucin deber satisfacer estas dos condiciones:
Un recurso no ser asignado a un proceso que demande un ejemplar de r1 o un
ejemplar de r2 hasta que al menos un ejemplar de dicho recurso quede libre
Se dar prioridad a los procesos que demanden un ejemplar de ambos recursos
29. Escribir una solucin al problema de "lectores-escritores" con monitores:
a) Con prioridad a los lectores.
b) Con prioridad a los escritores:
c) Con prioridades iguales
30. Coches que vienen del norte y del sur pretenden cruzar un puente sobre un ro. Slo
existe un carril sobre dicho puente. Por lo tanto, en un momento dado, slo puede ser
cruzado por uno o ms coches en la misma direccin (pero no en direcciones opuestas).
a) Completar el cdigo del siguiente monitor que
resuelve el problema del acceso al puente
suponiendo que llega un coche del norte (sur) y
cruza el puente si no hay otro coche del sur (norte)
cruzando el puente en ese momento.
b) Mejorar el monitor anterior, de forma que la
direccin del trafico a travs del puente cambie
cada vez que lo hayan cruzado 10 coches en una
direccin, mientras 1 ms coches estuviesen
esperando cruzar el puente en direccin opuesta.
MONITOR
GestionaTrafico
VAR
................
PROCEDIMIENTO EntrarCocheDelNorte
...................
PROCEDIMIENTO SalirCocheDelNorte
....................
PROCEDIMIENTO EntrarCocheDelSur
.....................

Programacin Concurrente. I.T. Sistemas y Gestin.

Relacin de Problemas 9

PROCEDIMIENTO SalirCocheDelSur
Inicializacin
.......................
31. Una tribu de antropfagos comparte una olla en la que caben M misioneros. Cuando
algn salvaje quiere comer, se sirve directamente de la olla, a no ser que sta est vaca.
Si la olla est vaca, el salvaje despertar al cocinero y esperar a que ste haya
rellenado la olla con otros M misioneros.
Proceso salvaje
Proceso cocinero
Repetir
Repetir
Servirse_1_misionero;
Dormir;
Comer;
Rellenar_olla;
Siempre;
Siempre;
Implementar un monitor para la sincronizacin requerida, teniendo en cuenta que:
la solucin no debe producir interbloqueo,
los salvajes podrn comer siempre que haya comida en la olla,
solamente se despertar al cocinero cuando la olla est vaca.
32. Una cuenta de ahorros es compartida por varias personas (procesos). Cada persona
puede depositar o retirar fondos de la cuenta. El saldo actual de la cuenta es la suma de
todos los depsitos menos la suma de todos los reintegros. El saldo nunca puede ser
negativo.
a) Programar un monitor para resolver el problema, todo proceso puede retirar fondos
mientras la cantidad solicitada c sea menor o igual que el saldo disponible en la cuenta
en ese momento. Si un proceso intenta retirar una cantidad c mayor que el saldo,
debe quedar bloqueado hasta que el saldo se incremente lo suficiente (como
consecuencia de que otros procesos depositen fondos en la cuenta) para que se pueda
atender la peticin. El monitor debe tener 2 procedimientos: depositar(c) y retirar(c).
Suponer que los argumentos de las 2 operaciones son siempre positivos.
b) Modificar la respuesta del apartado anterior, de tal forma que el reintegro de fondos a
los clientes sea servido segn un orden FIFO. Por ejemplo, suponer que el saldo es 200
unidades y un cliente est esperando un reintegro de 300 unidades. Si llega otro
cliente debe esperarse, incluso si quiere retirar 200 unidades. Suponer que existe una
funcin denominada cantidad(cond) que devuelve el valor de la cantidad (parmetro c
de los procedimientos retirar y depositar) que espera retirar el primer proceso que se
bloque (tras ejecutar WAIT en la seal cond).
33. Los procesos P1, P2,...,Pn comparten un nico recurso R, pero slo un proceso puede
utilizarlo cada vez. Un proceso Pi puede comenzar a utilizar R si est libre; en caso
contrario, el proceso debe esperar a que el recurso sea liberado por otro proceso. Si hay
varios procesos esperando a que quede libre R, se conceder al proceso que tenga mayor
prioridad. La regla de prioridad de los procesos es la siguiente: el proceso P i tiene
prioridad i (1<=i<=n), donde los nmeros menores implican mayor prioridad.
Implementar un monitor que implemente los procedimientos para "pedir" y "liberar" el
recurso
34. En un sistema hay dos tipos de procesos: A y B. Queremos implementar un esquema de
sincronizacin en el que los procesos se sincronizan por bloques de 1 proceso del tipo A y
10 procesos del tipo B. De acuerdo con este esquema:
Si un proceso de tipo A llama a la operacin de sincronizacin, y no hay (al menos) 10
procesos de tipo B bloqueados en la operacin de sincronizacin, entonces el proceso

Programacin Concurrente. I.T. Sistemas y Gestin.

Relacin de Problemas 10

de tipo A se bloquea.
Si un proceso de tipo B llama a la operacin de sincronizacin, y no hay (al menos) 1
proceso del tipo A y 9 procesos del tipo B (aparte de l mismo) bloqueados en la
operacin de sincronizacin, entonces el proceso de tipo B se bloquea.
Si un proceso de tipo A llama a la operacin de sincronizacin y hay (al menos) 10
procesos bloqueados en dicha operacin, entonces el proceso de tipo A no se bloquea
y adems debern desbloquearse exactamente 10 procesos de tipo B.
Si un proceso de tipo B llama a la operacin de sincronizacin y hay (al menos) 1 proceso
de tipo A y 9 procesos de tipo B bloqueados en dicha operacin, entonces el proceso
de tipo B no se bloquea y adems debern desbloquearse exactamente 1 proceso del
tipo A y 9 procesos del tipo B.
No se requiere que los procesos se desbloqueen en orden FIFO.

Programacin Concurrente. I.T. Sistemas y Gestin.

Relacin de Problemas 11

Tema 4. Sistemas de Paso de Mensajes


35. Considerar un conjunto de n procesos conectados en forma de anillo. Cada proceso tiene
un valor local almacenado en su variable local mi_valor. Deseamos calcular la suma de
los valores locales almacenados por los procesos de acuerdo con el algoritmo que se
expone a continuacin. Los procesos realizan una serie de iteraciones para hacer circular
sus valores locales por el anillo. En la primera iteracin, cada proceso enva su valor local
al siguiente proceso del anillo, al mismo tiempo que recibe del proceso anterior el valor
local de ste. A continuacin acumula la suma de su valor local y el recibido desde el
proceso anterior. En las siguientes iteraciones, cada proceso enva al siguiente proceso
siguiente el valor recibido en la anterior iteracin, al mismo tiempo que recibe del proceso
anterior un nuevo valor. Despus acumula la suma. Tras un total de n-1 iteraciones, cada
proceso conocer la suma de todos los valores locales de los procesos. Implementar este
algoritmo en MPI.
mi_valor=
0
suma
3 =0
mi_valor=
3suma =
3
ITERACIN
1

suma = 5

1
suma = 6
ITERACIN 2

mi_valor=
1
suma =
11

suma = 3

mi_valor=
2
suma = 2

suma = 5

suma = 4

suma = 1
0

suma = 3

ITERACIN 2

suma = 6

suma = 6

suma = 6

suma = 6

3
0

suma = 3

RESULTADO

Programacin Concurrente. I.T. Sistemas y Gestin.

Relacin de Problemas 12

36. Sean dos conjuntos de 4 procesos cada uno: P(i:1..4) y Q(i:1..4). Deseamos que cada
proceso P(j) envie una secuencia de valores enteros al proceso correspondiente Q(j). En
lugar de realizar esta comunicacin directamente, la haremos a travs de un proceso
multiplexor y un proceso demultiplexor. Cuando un proceso P(j) quiere enviarle un valor a
su Q(j) lo enva directamente al multiplexor, el cual enviar dicho valor junto con el ndice
(j) del proceso emisor al proceso demultiplexor. El proceso demultiplexor, enviar el valor
transmitido al proceso Q(j) correspondiente, de acuerdo con el valor de ndice recibido.
Cuando todos los procesos P terminen, el multiplexor, el demultiplexor y los procesos Q
terminarn.
a) Implementar este sistema en MPI.
b) Modificar el sistema implementado para que cada proceso P(j) reciba una seal de
confirmacin cuando su proceso Q(j) reciba el valor enviado.

Programacin Concurrente. I.T. Sistemas y Gestin.

Relacin de Problemas 13

37. En un sistema distribuido, 6 procesos clientes necesitan sincronizarse de forma


especfica para realizar cierta tarea, de forma que dicha tarea slo podr ser realizada
cuando tres procesos estn preparados para realizarla. Para ello, envan peticiones a un
proceso controlador del recurso y esperan respuesta para poder realizar la tarea
especfica.
El proceso controlador se encarga de asegurar la sincronizacin adecuada. Para ello,
recibe y cuenta las peticiones que le llegan de los procesos, las dos primeras no son
respondidas y producen la suspensin del proceso que enva la peticin (debido a que se
bloquea esperando respuesta) pero la tercera peticin produce el desbloqueo de los tres
procesos pendientes de respuesta. A continuacin, una vez desbloqueados los tres
procesos que han pedido (al recibir respuesta), inicializa la cuenta y procede cclicamente
de la misma forma sobre otras peticiones.
El cdigo de los procesos clientes es el siguiente, asumiendo que se usan operaciones
bloqueantes no buferizadas.
Cliente(i) (i=0, ... , 5)
While (true)
{ send (&peticion,Controlador);
receive (&permiso, Controlador);
Realiza_tarea_grupal ( ); }
Escribir en pseudocdigo, dentro del espacio reservado abajo, el cdigo del proceso
controlador, utilizando una orden de espera selectiva que permita implementar la
sincronizacin requerida entre los procesos.
Controlador
While (true)
{
...
}

Programacin Concurrente. I.T. Sistemas y Gestin.

Relacin de Problemas 14

38. En un sistema distribuido, 3 procesos productores producen continuamente valores


enteros y los envan a un proceso buffer que los almacena temporalmente en un array
local de 4 celdas enteras para ir envindoselos a un proceso consumidor. A su vez, el
proceso buffer realiza lo siguiente, sirviendo de forma equitativa al resto de procesos:
a) Enva enteros al proceso consumidor siempre que su array local tenga al menos dos
elementos disponibles.
b) Acepta envos de los productores mientras el array no est lleno, pero no acepta que
cualquier productor pueda escribir dos veces consecutivas en el bfer.
El cdigo de los procesos productor y consumidor es el siguiente, asumiendo que se usan
operaciones bloqueantes no buferizadas.
Prod_i (i=0, 1, 2)
{While (true)
{Produce (&dato)
send
(&dato,1,Buffer);}
}

Consumidor
{While (true)
{receive
(&dato,1,Buffer)
Consume (dato);}
}

Escribir en pseudocdigo el cdigo del proceso Buffer, utilizando una orden de espera
selectiva que permita implementar la sincronizacin requerida entre los procesos.
Buffer

Programacin Concurrente. I.T. Sistemas y Gestin.

Relacin de Problemas 15

39. Suponer un proceso productor y 3 procesos consumidores que comparten un buffer


acotado de tamao B. Cada elemento depositado por el proceso productor debe ser
retirado por todos los 3 procesos consumidores para ser eliminado del buffer. Cada
consumidor retirar los datos del buffer en el mismo orden en el que son depositados,
aunque los diferentes consumidores pueden ir retirando los elementos a ritmo diferente
unos de otros. Por ejemplo, mientras un consumidor ha retirado los elementos 1, 2 y 3,
otro consumidor puede haber retirado solamente el elemento 1. De esta forma, el
consumidor ms rpido podra retirar hasta B elementos ms que el consumidor ms
lento.
Escribir el pseudocdigo de un proceso que implemente el buffer de acuerdo con el
esquema de interaccin descrito usando una construccin de espera selectiva, as como
el pseudocdigo del proceso productor y de los procesos consumidores . Comenzar
identificando qu informacin es necesario representar, para despus resolver las
cuestiones de sincronizacin. Una posible implementacin del bufffer mantendra, para
cada proceso consumidor, el puntero de salida y el nmero de elementos que quedan
en el buffer por consumir (ver figura).

40. Una tribu de 3 salvajes comparte una olla en la que caben M misioneros. Cuando algn
salvaje quiere comer, se sirve directamente de la olla, a no ser que sta est vaca. Si la olla
est vaca, el salvaje despertar al cocinero y esperar a que ste haya rellenado la olla con
otros M misioneros.
Proceso salvaje[i], i=0,1,2
while(true)
Servirse_1_misionero;
Comer;

Proceso cocinero
While(true)
Dormir;
Rellenar_olla;

Implementar los procesos salvajes y cocinero usando paso de mensajes, usando un proceso
olla que incluye una construccin de espera selectiva que sirve peticiones de los salvajes y el
cocinero para mantener la sincronizacin requerida, teniendo en cuenta que:
la solucin no debe producir interbloqueo,
los salvajes podrn comer siempre que haya comida en la olla,
solamente se despertar al cocinero cuando la olla est vaca.