Serwer 4 procesorowy, procesory niezależne, bufor na 6 miejsc, czas obsługi wykładniczy u. Jaki będzie najkrótszy, średni i najdłuższy czas obsługi, narysować model."
MAIN MODULE zad3;
FROM IOMod IMPORT ReadKey;
FROM RandMod IMPORT Random, RandomObj;
FROM ListMod IMPORT QueueList;
FROM SimMod IMPORT SimTime, StartSimulation;
FROM SimMod IMPORT TriggerObj;
FROM StatMod IMPORT SREAL,RStatObj;
TYPE ZadanieRec = RECORD
start: REAL;
END RECORD;
ServerObj = OBJECT; FORWARD;
TYPE
BuforObj = OBJECT(QueueList)
dlugosc: INTEGER;
server: ServerObj;
trig: TriggerObj;
ASK METHOD Dodaj(INOUT zadtemp: ZadanieRec);
ASK METHOD Init(IN servertemp: ServerObj; IN trigtemp:TriggerObj);
END OBJECT;
TYPE
GenZadObj = OBJECT
lambda: REAL;
bufor: BuforObj;
los: RandomObj;
ASK METHOD Init(IN lambdatemp: REAL; IN lostemp: RandomObj; IN bufortemp: BuforObj);
TELL METHOD GenerujZad(IN LZ: INTEGER);
END OBJECT;
TYPE ServerObj = OBJECT;
czasobsl: SREAL;
bufor: BuforObj;
los: RandomObj;
iloscproc: INTEGER;
u: REAL;
ilosczajetych: INTEGER;
trig: TriggerObj;
ASK METHOD Init(IN bufortemp:BuforObj; IN lostemp:RandomObj; IN utemp:REAL; IN trigtemp: TriggerObj);
ASK METHOD Wolny():BOOLEAN;
TELL METHOD Obsluga();
END OBJECT;
OBJECT BuforObj;
ASK METHOD Init(IN servertemp: ServerObj; IN trigtemp:TriggerObj);
BEGIN
server:=servertemp;
trig:=trigtemp;
dlugosc:=6;
END METHOD;
ASK METHOD Dodaj(INOUT zadtemp: ZadanieRec);
BEGIN
IF numberIn >= dlugosc
DISPOSE(zadtemp);
ELSE
Add(zadtemp);
IF ASK server TO Wolny()
ASK trig TO Release();
END IF;
END IF;
END METHOD;
END OBJECT;
OBJECT ServerObj;
ASK METHOD Init(IN bufortemp:BuforObj; IN lostemp:RandomObj; IN utemp:REAL;IN trigtemp: TriggerObj);
BEGIN
bufor:=bufortemp;
los:=lostemp;
u:=utemp;
iloscproc:=4;
ilosczajetych:=0;
trig:=trigtemp;
END METHOD;
ASK METHOD Wolny():BOOLEAN;
BEGIN
IF ilosczajetych<iloscproc
RETURN TRUE;
ELSE
RETURN FALSE;
END IF;
END METHOD;
TELL METHOD Obsluga();
VAR
zadanie: ZadanieRec;
Czas: REAL;
BEGIN
WHILE TRUE
IF ASK bufor TO numberIn > 0
INC(ilosczajetych);
OUTPUT("Aktualny czas: ", SimTime," Obsluga zadania - start");
zadanie := ASK bufor TO Remove();
Czas := ASK los TO Exponential(1.0/u);
WAIT DURATION Czas;
ON INTERRUPT;
END WAIT;
czasobsl:=SimTime-zadanie.start;
DISPOSE(zadanie);
OUTPUT("Aktualny czas: ", SimTime," Obsluga zadania - koniec");
DEC(ilosczajetych);
ELSE
WAIT FOR trig TO Fire();
END WAIT;
END IF;
END WHILE;
END METHOD;
END OBJECT;
OBJECT GenZadObj;
ASK METHOD Init(IN lambdatemp: REAL; IN lostemp: RandomObj; IN bufortemp: BuforObj);
BEGIN
lambda:=lambdatemp;
los:=lostemp;
bufor:=bufortemp;
END METHOD;
TELL METHOD GenerujZad(IN LZ: INTEGER);
VAR
i:INTEGER;
zadanie: ZadanieRec;
dt: REAL;
BEGIN
FOR i:=1 TO LZ
dt:=ASK los TO Exponential(1.0/lambda);
WAIT DURATION dt;
END WAIT;
NEW(zadanie);
OUTPUT("Aktualny czas: ", SimTime," Wygenerowano zadanie nr: ",i);
zadanie.start:=SimTime;
ASK bufor TO Dodaj(zadanie);
END FOR;
END METHOD;
END OBJECT;
VAR
tmp:CHAR;
bufor:BuforObj;
GenZad:GenZadObj;
los:RandomObj;
trig:TriggerObj;
server:ServerObj;
BEGIN
NEW(bufor);
NEW(GenZad);
NEW(server);
NEW(los);
NEW(trig);
ASK bufor TO Init(server,trig);
ASK GenZad TO Init(2.0,los,bufor);
ASK server TO Init(bufor,los,5.0,trig);
TELL server TO Obsluga();
TELL GenZad TO GenerujZad(10);
StartSimulation();
OUTPUT("sredni czas obslugi : ",ASK GETMONITOR(ASK server TO czasobsl,RStatObj) TO Mean());
OUTPUT("maksymalny czas obslugi : ",ASK GETMONITOR(ASK server TO czasobsl,RStatObj) TO Maximum);
OUTPUT("minimalny czas obslugi : ",ASK GETMONITOR(ASK server TO czasobsl,RStatObj) TO Minimum);
tmp:=ReadKey();
END MODULE.