Introducción - Departamento de Lenguajes y Sistemas Informáticos

Anuncio
Programación Concurrente.
3º Ingeniería Técnica de Sistemas y
Gestión.
Dpto. Lenguajes y Sistemas Informáticos. ETSI Informática
Relación de problemas
Tema 1. Introducción.
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. ¿Cuáles son los posibles valores resultantes para x?. Suponer que x
debe ser cargada en un registro para incrementarse.
2. ¿Cómo se podría hacer la copia del fichero "f" en otro "g", de forma concurrente,
utilizando la instrucción 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 continuación:
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;
Programación Concurrente. I.T. Sistemas y Gestión.
Relación de Problemas 2
5. Suponer un sistema de tiempo real que dispone de un captador de impulsos
conectado a un contador de energía eléctrica. La función del sistema consiste en contar el
número de impulsos producidos en 1 hora (cada Kwh consumido se cuenta como un
impulso) e imprimir este número 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 común
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 simultáneamente un nuevo impulso y el final del periodo de 1
hora, obtener las posibles secuencias de ejecución de los procesos y cuáles de ellas son
correctas.
6. La inhibición de las interrupciones no funciona correctamente cuando hay secciones
críticas anidadas. Escribir 2 rutinas: ProtocoloEntrada (conecta las interrupciones) y
ProtocoloSalida (las desconecta) para resolver el problema.
7. En vez de la instrucción TestAndSet, algunos ordenadores proveen de una instrucción
atómica 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 sección crítica utilizando
dicha instrucción.
8. Suponer que el siguiente algoritmo (inserción 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 ejecución secuencial del algoritmo es t(n)=n(n-1)/2 (≈ n2/2); ¿Cuál
sería el tiempo de ejecución del programa paralelo si la mezcla lleva en realizarse n
operaciones?
b) Compruébese con una tabla que el número 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
simultáneamente).
10. Con el grafo de sincronización de la figura, escribir 2 protocolos:
Programación Concurrente. I.T. Sistemas y Gestión.
Relación de Problemas 3
EsperarPor (A:actividad) {espera que acabe la actividad A}
Acabar (A:actividad) {hace constar, actividad A acabada}
A
B
C
D
E
F
G
H
I
que permitan la sincronización perfecta de las actividades del grafo. Prever que el grafo de
actividades puede ser ejecutado más de una vez.
11. ¿Qué significa un ciclo en un grafo de sincronización?
Tema 2. Exclusión Mutua.
12. ¿Qué diferencia fundamental existe entre un bucle de espera activa y una variable
interruptor que da turnos para la sincronización de los procesos?
13. ¿Utiliza espera ocupada el Algoritmo de Dekker, si el segundo proceso está en su
sección, Turno= 1 y el proceso 1 está intentando entrar en su sección?
14. Demostrar que el A. de Dekker hace posible que un proceso espere indefinidamente
("inanición") a entrar en su sección Crítica, con la suposición de que siempre que un
proceso entra en la sección Crítica eventualmente la abandonará.
15. Generalizar el A. de Dekker para 3 procesos.
16. ¿Podría pensarse que una posible solución al problema de la exclusión mutua, Sería el
siguiente algoritmo que no necesita compartir una variable "Turno" entre los 2 procesos?
a) ¿Se satisface la exclusión 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 podría construir una solución más simple al problema de la exclusión mutua que
el Algoritmo de Dekker utilizando la instrucción atómica TestAndSet(l)? ¿Cuál Sería dicha
solución?.
Programación Concurrente. I.T. Sistemas y Gestión.
Relación de Problemas 4
18. ¿Qué ocurriría 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 solución de Hyman al problema de la exclusión
mutua. ¿Es correcta dicha solución?
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 máquinas expendedoras de
tickets (señalan el turno en que ha de ser atendido el cliente), los números de los tickets
se representan por dos variables n1 y n2 que valen inicialmente 0. El proceso con el
número de ticket más bajo entra en su sección Crítica. En caso de tener 2 números
iguales se procesa primero el proceso número 1.
a) Demostrar que se verifican las propiedades de vivacidad de la solución.
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 solución al problema de la
exclusión mutua
para 2
Programación Concurrente. I.T. Sistemas y Gestión.
Relación de Problemas 5
procesos. Discutir la corrección de esta solución: si es correcta, entonces probarlo. Si no
fuese correcta, escribir escenarios que demuestren que la solución 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 instrucción llamada TST(TestAndSet).
Existe una variable global del sistema (en memoria común a los procesadores) llamada
código de condición. Ejecutando TST(l) para la variable local l se obtendría lo mismo que
con las 2 sentencias siguientes:
l:=c;
c:=1;
Discutir la corrección de la solución al problema de la exclusión mutua del siguiente
algoritmo.
¿Qué ocurriría si la instrucción 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 instrucción EX intercambia los contenidos de 2 posiciones de memoria. EX(a,b) es
equivalente a una ejecución indivisible de las 3 operaciones siguientes:
temp:=a;
a:=b;
b:=temp;
a) Discutir la corrección de la solución para el algoritmo de exclusión mutua siguiente.
Programación Concurrente. I.T. Sistemas y Gestión.
Relación de Problemas 6
b) ¿Qué ocurriría si la instrucción 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.
Programación Concurrente. I.T. Sistemas y Gestión.
Relación de Problemas 7
24. Considerar el siguiente algoritmo de exclusión 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 instrucción (7),
suponiendo que el turno lo tiene inicialmente el proceso P(0).
25. Demostrar que en la generalización 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 demás
b) no estaba solo en la etapa que ha dejado
Programación Concurrente. I.T. Sistemas y Gestión.
Relación de Problemas 8
Tema 3. Monitores.
26. Aunque un monitor garantiza la exclusión mútua, los procedimientos tienen que ser
re-entrantes. Explicar porqué.
27. Demostrar que incluso si la implementación del semáforo es FIFO, la simulación del
monitor con semáforos 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 asignación 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 solución 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 solución 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 río. Sólo
existe un carril sobre dicho puente. Por lo tanto, en un momento dado, sólo puede ser
cruzado por uno o más coches en la misma dirección (pero no en direcciones opuestas).
a) Completar el código 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
dirección del trafico a través del puente cambie
cada vez que lo hayan cruzado 10 coches en una
dirección, mientras 1 ó más coches estuviesen
esperando cruzar el puente en dirección opuesta.
MONITOR
GestionaTrafico
VAR
................
PROCEDIMIENTO EntrarCocheDelNorte
...................
PROCEDIMIENTO SalirCocheDelNorte
....................
PROCEDIMIENTO EntrarCocheDelSur
.....................
Programación Concurrente. I.T. Sistemas y Gestión.
Relación de Problemas 9
PROCEDIMIENTO SalirCocheDelSur
Inicialización
.......................
31. Una tribu de antropófagos comparte una olla en la que caben M misioneros. Cuando
algún salvaje quiere comer, se sirve directamente de la olla, a no ser que ésta esté vacía.
Si la olla está vacía, 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 sincronización requerida, teniendo en cuenta que:
• la solución no debe producir interbloqueo,
• los salvajes podrán comer siempre que haya comida en la olla,
• solamente se despertará al cocinero cuando la olla esté vacía.
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 depósitos 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 petición. 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 según 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
función denominada cantidad(cond) que devuelve el valor de la cantidad (parámetro c
de los procedimientos retirar y depositar) que espera retirar el primer proceso que se
bloqueó (tras ejecutar WAIT en la señal cond).
33. Los procesos P1, P2,...,Pn comparten un único recurso R, pero sólo 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 números 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
sincronización 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 operación de sincronización, y no hay (al menos) 10
procesos de tipo B bloqueados en la operación de sincronización, entonces el proceso
Programación Concurrente. I.T. Sistemas y Gestión.
Relación de Problemas 10
de tipo A se bloquea.
• Si un proceso de tipo B llama a la operación de sincronización, y no hay (al menos) 1
proceso del tipo A y 9 procesos del tipo B (aparte de él mismo) bloqueados en la
operación de sincronización, entonces el proceso de tipo B se bloquea.
• Si un proceso de tipo A llama a la operación de sincronización y hay (al menos) 10
procesos bloqueados en dicha operación, entonces el proceso de tipo A no se bloquea
y además deberán desbloquearse exactamente 10 procesos de tipo B.
• Si un proceso de tipo B llama a la operación de sincronización y hay (al menos) 1 proceso
de tipo A y 9 procesos de tipo B bloqueados en dicha operación, entonces el proceso
de tipo B no se bloquea y además deberán desbloquearse exactamente 1 proceso del
tipo A y 9 procesos del tipo B.
• No se requiere que los procesos se desbloqueen en orden FIFO.
Programación Concurrente. I.T. Sistemas y Gestión.
Relación 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 continuación. Los procesos realizan una serie de iteraciones para hacer circular
sus valores locales por el anillo. En la primera iteración, cada proceso envía su valor local
al siguiente proceso del anillo, al mismo tiempo que recibe del proceso anterior el valor
local de éste. A continuación acumula la suma de su valor local y el recibido desde el
proceso anterior. En las siguientes iteraciones, cada proceso envía al siguiente proceso
siguiente el valor recibido en la anterior iteración, al mismo tiempo que recibe del proceso
anterior un nuevo valor. Después 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
ITERACIÓN
1
suma = 5
0
2
2
1
suma = 6
ITERACIÓN 2
mi_valor=
1
suma =
11
suma = 3
mi_valor=
2
suma = 2
suma = 5
suma = 4
3
2
suma = 1
0
1
suma = 3
ITERACIÓN 2
suma = 6
suma = 6
suma = 6
suma = 6
3
0
suma = 3
RESULTADO
Programación Concurrente. I.T. Sistemas y Gestión.
Relación 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 comunicación directamente, la haremos a través de un proceso
multiplexor y un proceso demultiplexor. Cuando un proceso P(j) quiere enviarle un valor a
su Q(j) lo envía 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
terminarán.
a) Implementar este sistema en MPI.
b) Modificar el sistema implementado para que cada proceso P(j) reciba una señal de
confirmación cuando su proceso Q(j) reciba el valor enviado.
Programación Concurrente. I.T. Sistemas y Gestión.
Relación de Problemas 13
37. En un sistema distribuido, 6 procesos clientes necesitan sincronizarse de forma
específica para realizar cierta tarea, de forma que dicha tarea sólo podrá ser realizada
cuando tres procesos estén preparados para realizarla. Para ello, envían peticiones a un
proceso controlador del recurso y esperan respuesta para poder realizar la tarea
específica.
El proceso controlador se encarga de asegurar la sincronización adecuada. Para ello,
recibe y cuenta las peticiones que le llegan de los procesos, las dos primeras no son
respondidas y producen la suspensión del proceso que envía la petición (debido a que se
bloquea esperando respuesta) pero la tercera petición produce el desbloqueo de los tres
procesos pendientes de respuesta. A continuación, una vez desbloqueados los tres
procesos que han pedido (al recibir respuesta), inicializa la cuenta y procede cíclicamente
de la misma forma sobre otras peticiones.
El código 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 pseudocódigo, dentro del espacio reservado abajo, el código del proceso
controlador, utilizando una orden de espera selectiva que permita implementar la
sincronización requerida entre los procesos.
Controlador
While (true)
{
...
}
Programación Concurrente. I.T. Sistemas y Gestión.
Relación de Problemas 14
38. En un sistema distribuido, 3 procesos productores producen continuamente valores
enteros y los envían a un proceso buffer que los almacena temporalmente en un array
local de 4 celdas enteras para ir enviándoselos a un proceso consumidor. A su vez, el
proceso buffer realiza lo siguiente, sirviendo de forma equitativa al resto de procesos:
a) Envía enteros al proceso consumidor siempre que su array local tenga al menos dos
elementos disponibles.
b) Acepta envíos de los productores mientras el array no esté lleno, pero no acepta que
cualquier productor pueda escribir dos veces consecutivas en el búfer.
El código 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 pseudocódigo el código del proceso Buffer, utilizando una orden de espera
selectiva que permita implementar la sincronización requerida entre los procesos.
Buffer
Programación Concurrente. I.T. Sistemas y Gestión.
Relación de Problemas 15
39. Suponer un proceso productor y 3 procesos consumidores que comparten un buffer
acotado de tamaño 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 más rápido podría retirar hasta B elementos más que el consumidor más
lento.
Escribir el pseudocódigo de un proceso que implemente el buffer de acuerdo con el
esquema de interacción descrito usando una construcción de espera selectiva, así como
el pseudocódigo del proceso productor y de los procesos consumidores . Comenzar
identificando qué información es necesario representar, para después resolver las
cuestiones de sincronización. Una posible implementación del bufffer mantendría, para
cada proceso consumidor, el puntero de salida y el número 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 algún
salvaje quiere comer, se sirve directamente de la olla, a no ser que ésta esté vacía. Si la olla
está vacía, 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 construcción de espera selectiva que sirve peticiones de los salvajes y el
cocinero para mantener la sincronización requerida, teniendo en cuenta que:
• la solución no debe producir interbloqueo,
• los salvajes podrán comer siempre que haya comida en la olla,
• solamente se despertará al cocinero cuando la olla esté vacía.
Descargar