Wuolah Free PCA Practica 6 Monitores

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 7

PCA-Practica-6-Monitores.

pdf

skiLLissue

Programación Concurrente y Avanzada

2º Grado en Ingeniería del Software

Escuela Técnica Superior de Ingeniería de Sistemas


Informáticos
Universidad Politécnica de Madrid

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.
󾠳
Monitores
Sección Práctica

Tema 6

Índice
Configuración
Ejercicio 1
Ejercicio 2

Configuración
ThisBuild / version := "0.1.0-SNAPSHOT"

ThisBuild / scalaVersion := "2.13.10"

lazy val root = (project in file("."))


.settings(
name := "ActorsPCA"
)
//libraryDependencies += "org.scala-lang.modules" %% "scala-parser-combinators" % "2.2.1"
//libraryDependencies += "org.scalatest" %% "scalatest" % "3.2.15" % Test
libraryDependencies += "com.typesafe.akka" %% "akka-actor" % "2.8.0"

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 .

Para conseguir la exclusión mutua en la escritura se crea un semáforo, inicializado


a 1, y se encierran las sentencias writeln entre WAIT y SIGNAL .

VAR output: BINSEM := 1;

Los procesos consumidor no han acabado, pero el programa principal tampoco.

El productor genera 20 elementos y cada consumidor quiere consumir 20


elementos.

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

si lees esto me debes un besito


Programación Concurrente y A...
Banco de apuntes de la UPM
begin
for I := 1 to Values do
begin
P (output);

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

si lees esto me debes un besito


procedure retrasame (quienSoy: INTEGER; intervalo: INTEGER);
begin
retrasado [quienSoy]:= TRUE;
tiempo [quienSoy]:= intervalo;
WAITC (cond[quienSoy]);
end;
begin (* del monitor *)
for i:= 1 to nmrProcesos do begin
retrasado[i]:= false;
tiempo[i]:= 0;
end;
end;

const nmrProcesos = 20;


var i: INTEGER;
tiempoActual: INTEGER:= 0;
salida: BINARYSEM := 1;
procedure reloj;
var i, j: integer;
begin
for i:= 1 to 10 do begin
for j:= 1 to 200 do;
tiempoActual:= tiempoActual + 1;
WAIT (salida);
writeln ("ha pasado 1 segundo. Tiempo actual: ", tiempoActual, " segundos");
SIGNAL (salida);
hapasadoUnSegundo;
end;
end;

procedure proceso (ID: integer);


var I, J: integer;
begin
WAIT(salida);
writeln ("soy el proceso", ID, " y me voy a dormir ", ID*2, " segundos. ");
writeln("Hora actual: ", tiempoActual);
SIGNAL (salida);
retrasame (ID, ID*2);
WAIT (salida);
writeln ("soy el proceso", ID, " y he despertado. Hora actual: ", tiempoActual);
SIGNAL (salida);
end;
begin
cobegin
reloj;
proceso(1); proceso (2); proceso (3);
coend;
end.

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.

También podría gustarte