Wuolah Free PCA Practica 6 Monitores
Wuolah Free PCA Practica 6 Monitores
Wuolah Free PCA Practica 6 Monitores
skiLLissue
Tema 6
Índice
Configuración
Ejercicio 1
Ejercicio 2
Configuración
ThisBuild / version := "0.1.0-SNAPSHOT"
Monitores 1
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-8212089
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
Ejercicio 1
La declaración del monitor debe estar dentro de PROGRAM .
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
«A deadlock occurred»: las sentencias de salida están mezcladas .
program ProducerConsumer;
monitor PC;
const N = 5;
var Oldest: integer;
Newest: integer;
Count: integer;
NotEmpty: Condition;
NotFull: Condition;
Buffer: array[0..N] of integer;
procedure Append(V: integer);
begin
if Count = N then
WaitC(NotFull);
Buffer[Newest] := V;
Newest := (Newest + 1) mod N;
Count := Count + 1;
SignalC(NotEmpty);
end;
procedure Take(var V: Integer);
begin
if Count = 0 then
WaitC(NotEmpty);
V := Buffer[Oldest];
Oldest := (Oldest + 1) mod N;
Count := Count - 1;
SignalC(NotFull);
end;
begin
Count := 0; Oldest := 0; Newest := 0;
end;
VAR output: BINARYSEM;
const Values = 20;
procedure Producer(ID: integer);
var I: integer;
Monitores 2
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-8212089
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
writeln ("Producer ", ID, " producing ", ID*100+I);
V (output);
Append(ID*100+I);
end;
end;
procedure Consumer(ID: integer);
var I, J: integer;
begin
for I := 1 to 10 do
begin
Take(J);
P (output);
writeln ("Consumer ", ID, " consuming ", J);
V (output);
end;
end;
begin
INITIALSEM (output, 1);
cobegin
Producer(1); Consumer(1); Consumer(2);
coend;
end.
Ejercicio 2
Program Suspension;
monitor PC;
const nmrProcesos = 20;
var i: INTEGER;
retrasado: array[0..nmrProcesos] of boolean;
tiempo: array[0..nmrProcesos] of integer;
cond: array[0..nmrProcesos] of CONDITION;
procedure haPasadoUnSegundo;
var i: INTEGER;
begin
for i:= 1 to nmrProcesos do
IF retrasado[i] then begin
tiempo[i]:= tiempo[i] - 1;
IF tiempo[i] = 0 then begin
retrasado[i]:= false;
SIGNALC (cond[i]);
end
end
end;
Monitores 3
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-8212089
Monitores 4
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-8212089
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.