|
DataMuseum.dkPresents historical artifacts from the history of: RC4000/8000/9000 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about RC4000/8000/9000 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 54528 (0xd500) Types: TextFile Names: »simulator«
└─⟦667bb35d6⟧ Bits:30007480 RC8000 Dump tape fra HCØ. └─⟦4334b4c0b⟧ └─⟦this⟧ »simulator«
begin simulation class ktassystem; comment ****************************************************** * * * Simulator til et oplysningssystem ved KTAS. * * * ****************************************************** ; begin process class center; begin end; \f center class inputproces; comment ***************************** * * * I N P U T P R O C E S * * * ***************************** ; begin comment **************************************************** * * * Simularer OP-systemets inputproces.Processen si- * * mulerer CPU-tidsforbrug ved analysebehandling af * * inddatalinier. Processen er implementerer ved en * * løkke, der gennemløber køen af ventende fore- * * spørgsler. Hver forespørgsel tildeles tidskvan- * * ter jvf. kvanttildelingsstrategien. Til sidst * * aktiveres processtyring, til bestemmelse af næs- * * te procesbehandlingssted for forespørgslen. * * * **************************************************** ; ref (job) aktualjob;real inputprocestid; while true do begin while not koe(1).empty do begin aktualjob :- koe(1).first; procaktiv(1):=true; if test=1 then spor(aktualjob.jobnr,1,1); inputprocestid:=inputtid; aktualjob.ankinput:=time; aktualjob.cpuinput:=inputprocestid; while inputprocestid > 0 do begin if inputprocestid < resttidskvant then begin hold(inputprocestid); inputsum(tid):=inputsum(tid)+inputprocestid; inputsum(5):=inputsum(5)+inputprocestid; timequantum(1):=timequantum(1)+inputprocestid; resttidskvant:=resttidskvant-inputprocestid; aktualjob.afginput:=time; overgang(aktualjob,inputprocesnr); if test= 1 then spor(aktualjob.jobnr,1,2); inputprocestid:=0; end else begin hold(resttidskvant); inputsum(tid):=inputsum(tid)+resttidskvant; inputsum(5):=inputsum(5)+resttidskvant; inputprocestid:=inputprocestid-resttidskvant; timequantum(1):=timequantum(1)+resttidskvant; activate skift after current; koeindsaet(1); resttidskvant:=tidskvant; passivate; end; end; if koe(1).empty then activate skift after current; procaktiv(1):=false; end; passivate; end; end; \f center class soegeproces; comment **************************** * * * S O E G E P R O C E S * * * **************************** ; begin comment ***************************************************** * * * Simulerer OP-systemets søgeproces. Processen simu-* * lerer CPU-tidsforbrug ved afgrænsning af mulige * * abonnenter ud fra givne kriterier. Processen er * * implementeret efter samme princip som inputproces,* * dog deles tidsforbruget op i et antal lige store * * tidsafsnit. Hvert tidsafsnit simuleres efterfulgt * * af en pladelagertilgang, idet diskkontrol aktive- * * res. * * * ***************************************************** ; ref (job) soegejob; real soegeprocestid,delsoegeprocestid,husktid; integer pladelagertilgange; integer i; integer soegeprocnr; soegeprocnr:=soegeprocesnr; while true do begin while not koe(soegeprocnr).empty do begin soegejob:-koe(soegeprocnr).first; procaktiv(soegeprocnr):=true; if test=1 then spor(soegejob.jobnr,soegeprocnr,1); soegeprocestid := negexp(1/soegetid,startvaerdi); soegejob.anksoeg:=time; soegejob.cpusoeg:=soegeprocestid; pladelagertilgange:= randint(mindst,stoerst,startvaerdi)+1; delsoegeprocestid := soegeprocestid/pladelagertilgange; husktid := delsoegeprocestid; for i:=pladelagertilgange step -1 until 0 do begin while delsoegeprocestid > 0 do begin if delsoegeprocestid <= resttidskvant then begin if test = 1 then begin if soegeprocnr = 2 then outtext(" 1 ") else outtext(" 2 "); outtext("soege proces aktiv til tid "); outfix(time,4,12); outimage; end; hold(delsoegeprocestid); soegesum(tid):=soegesum(tid)+delsoegeprocestid; soegesum(5):=soegesum(5)+delsoegeprocestid; timequantum(soegeprocnr):=timequantum(soegeprocnr)+ delsoegeprocestid; resttidskvant:=resttidskvant-delsoegeprocestid; delsoegeprocestid:=0; if i> 1 then activate skift after current; end else begin if test = 1 then begin if soegeprocnr = 2 then outtext(" 1 ") else outtext(" 2 "); outtext("proces soege aktiv til tid "); outfix(time,4,12); outimage; end; hold(resttidskvant); soegesum(tid):=soegesum(tid)+resttidskvant; soegesum(5):=soegesum(5)+resttidskvant; timequantum(soegeprocnr):= timequantum(soegeprocnr)+resttidskvant; delsoegeprocestid := delsoegeprocestid - resttidskvant; activate skift after current; koeindsaet(soegeprocnr); resttidskvant:=tidskvant; passivate; end; end; if i>1 then begin disknr:=soegeprocnr; diskkonnr:=1; activate kontrol(1) after current; pladelagertilgange := pladelagertilgange - 1; delsoegeprocestid := husktid; passivate; end; end; soegejob.afgsoeg:=time; overgang(soegejob,soegeprocnr); if test=1 then spor(soegejob.jobnr,soegeprocnr,2); if koe(soegeprocnr).empty then activate skift after current; procaktiv(soegeprocnr):=false; end; passivate; end; end; \f center class opslagproces; comment ******************************* * * * O P S L A G S P R O C E S * * * ******************************* ; begin comment ****************************************************** * * * Simulerer OP-systemets opslagsproces.Processen si- * * mulerer CPU-tidsforbruget ved egentlig opslag efter* * abonnenter. Processen er implementeret efter samme * * princip som søgeprocessen. * * * ****************************************************** ; ref (job) opslagjob; real opslagprocestid,delopslagprocestid,husktid; integer pladelagertilgange; integer i; while true do begin while not koe(3).empty do begin opslagjob :- koe(3).first; procaktiv(3):=true; if test = 1 then spor(opslagjob.jobnr,3,1); opslagprocestid := negexp(1/opslagtid,startvaerdi); opslagjob.ankopslag:=time; opslagjob.cpuopslag:=opslagprocestid; pladelagertilgange:= randint(faerrest,flest,startvaerdi)+1; delopslagprocestid := opslagprocestid/pladelagertilgange; husktid := delopslagprocestid; for i:=pladelagertilgange step -1 until 0 do begin while delopslagprocestid > 0 do begin if delopslagprocestid <= resttidskvant then begin hold(delopslagprocestid); opslagssum(tid):=opslagssum(tid)+delopslagprocestid; opslagssum(5):=opslagssum(5)+delopslagprocestid; timequantum(3):=timequantum(3)+delopslagprocestid; resttidskvant:=resttidskvant-delopslagprocestid; delopslagprocestid := 0; if i > 1 then activate skift after current; end else begin hold(resttidskvant); opslagssum(tid):=opslagssum(tid)+resttidskvant; opslagssum(5):=opslagssum(5)+resttidskvant; timequantum(3):= timequantum(3)+resttidskvant; delopslagprocestid := delopslagprocestid - resttidskvant; activate skift after current; koeindsaet(3); resttidskvant:=tidskvant; passivate; end; end; if i>1 then begin disknr:=opslagprocesnr; diskkonnr:=1; if kondublering then begin diskkonnr:=2; activate kontrol(2) after current end else activate kontrol(1) after current; pladelagertilgange := pladelagertilgange - 1; delopslagprocestid := husktid; passivate; end; end; opslagjob.afgopslag:=time; overgang(opslagjob,opslagprocesnr); if test = 1 then spor(opslagjob.jobnr,3,2); if koe(3).empty then activate skift after current; procaktiv(3):=false; end; passivate; end; end; \f center class outputproces; comment ***************************** * * * O U T P U T P R O C E S * * * ***************************** ; begin comment ******************************************************* * * * Simulerer OP-systemet outputproces. Processen simu- * * lerer CPU-tidsforbruget ved rediringsaktioner på in-* * formation modtaget fra de øvrige processer. Proces- * * sen er implementeret som inputproces, dog kan der * * ske pladelagertilgang efter CPU-tidsforbruget. * * * ******************************************************* ; ref (job) udjob; real outputprocestid,pladetilg; while true do begin while not koe(4).empty do begin udjob :- koe(4).first; procaktiv(4):=true; if test = 1 then spor(udjob.jobnr,4,1); outputprocestid:=outputtid; udjob.ankoutput:=time; udjob.cpuoutput:=outputprocestid; while outputprocestid > 0 do begin if outputprocestid < resttidskvant then begin hold(outputprocestid); outputsum(tid):=outputsum(tid)+outputprocestid; outputsum(5):=outputsum(5)+outputprocestid; timequantum(4):=timequantum(4)- outputprocestid; resttidskvant:=resttidskvant-outputprocestid; pladetilg:=uniform(0,1,startvaerdi); if pladetilg <= pladesands then begin disknr:=outputprocesnr; diskkonnr:=1; if kondublering then begin diskkonnr:=2; activate kontrol(2) after current end else activate kontrol(1) after current; passivate; end; udjob.afgoutput:=time; overgang(udjob,outputprocesnr); if test = 1 then spor(udjob.jobnr,4,2); outputprocestid := 0; activate proc(5); statkald:=5; activate proc(5); end else begin hold(resttidskvant); outputsum(tid):=outputsum(tid)+resttidskvant; outputsum(5):=outputsum(5)+resttidskvant; outputprocestid:=outputprocestid-resttidskvant; timequantum(4):= timequantum(4)+resttidskvant; activate skift after current; koeindsaet(4); resttidskvant:=tidskvant; passivate; end; end; if koe(4).empty then activate skift after current; procaktiv(4):=false; end; passivate; end; end; \f process class jobgenerator; comment ***************************** * * * J O B G E N E R A T O R * * * ***************************** ; begin comment ****************************************************** * * * Simulerer ankomst af forespørgsler til OP-systemet.* * Ankomsthyppigheden er beskrevet v.h.a. en tilfæl- * * dighedsfordeling. * * * ****************************************************** ; ref (job) jobgen; integer antaljob,tid; while true do begin antaljob := antaljob + 1; tid:=entier(time/3600000); hold(negexp(ankomstrate(tid),startvaerdi)); jobgen :- new job; jobgen.jobnr := antaljob; if test = 1 then spor(jobgen.jobnr,7,1); jobgen.jobtid := time; koelengde(1); jobgen.into(koe(1)); if not koe(1).cardinal > 1 then koeindsaet(1); if proc(1).idle and proc(2).idle and proc(3).idle and proc(4).idle and proc(6).idle then activate skift; end; end; \f process class diskkontrol; comment ************************** * * * D I S K K O N T R O L * * * ************************** ; begin comment ******************************************************* * * * Simulerer styring af kommunikation mellem processer * * og pladelagre. Processen behandler 3 hovedtilfælde: * * a) Enproces ønsker brug af pladelager. * * b) Et pladelager har foretaget positionering af ho-* * vedet og ønsker tilladelse til overføring af * * data. * * c) En pladelageroverførsel er tilendebragt. * * * ******************************************************* ; ref (soegeproces) check; ref(disk) kig; boolean kanalaktiv,soegecheck,speccheck; real kanalstart; integer konnr; while true do begin konnr:=diskkonnr; if test = 1 then begin outint(disknr,3); outtext("diskkontrol aktiv"); outfix(time,4,12); outimage; end; if (not kontrolkald(konnr)) and (not paratkald(konnr)) then begin if disknr = 2 then proc(2).into(soegediskkoe); if disknr = 6 then begin disknr:=2; proc(6).into(soegediskkoe); end; if not kontrolkoe(konnr).empty then begin if disknr = 3 then proc(3).into(opslagsdiskkoe); if disknr = 4 then proc(4).into(outputdiskkoe); end else if not (disknr = 2 and soegediskkoe.cardinal = 2) then activate pladelager(disknr) after current; end else begin if kontrolkald(konnr) then begin if kontrolkoe(konnr).cardinal = 1 then activate kontrolkoe(konnr).first after current; kontrolkald(konnr):= false; if not kanalaktiv then begin kanalstart:=time; kanalaktiv:=true; end; end else begin if paratkald(1) and not soegediskkoe.empty and disknr=2 then begin check:-soegediskkoe.first; check.out; if dublering and not soegediskkoe.empty then begin speccheck:=true; if pladelager(disknr).idle then activate pladelager(disknr) after current; end; if check.soegeprocnr = 6 then soegecheck:=true; end; paratkald(konnr):=false; if soegecheck then begin soegecheck:=false; koeindsaet(6); end else koeindsaet(disknr); if not soegediskkoe.empty and not speccheck and pladelager(2).idle then begin speccheck:=true; activate pladelager(2) after current ; end else speccheck:=false; if not opslagsdiskkoe.empty then begin disknr:=3; activate pladelager(3) after current; opslagsdiskkoe.first.out; end; if not outputdiskkoe.empty then begin disknr:=4; activate pladelager(4)after current; outputdiskkoe.first.out; end; kig :- kontrolkoe(konnr).first; if (not kontrolkoe(konnr).empty and not speccheck) or (not kontrolkoe(konnr).empty and kig.kontrolnr <> 2) then activate kontrolkoe(konnr).first after current else speccheck:=false; if dublering and kontrolkoe(konnr).empty then begin if konnr = 1 then begin kanalaktiv := false; kanalsum(1,tid):=kanalsum(1,tid)+(time-kanalstart); kanalsum(1,5):=kanalsum(1,5)+(time-kanalstart); end else begin kanalaktiv:=false; kanalsum(2,tid):=kanalsum(2,tid)+(time-kanalstart); kanalsum(2,5):=kanalsum(2,5)+(time-kanalstart); end; end else begin if not dublering and kontrolkoe(konnr).empty then begin kanalaktiv:=false; kanalsum(konnr,tid):=kanalsum(konnr,tid)+(time-kanalstart); kanalsum(konnr,5):=kanalsum(konnr,5)+(time-kanalstart); end; end; end; end; passivate; end; end; \f process class disk; comment ************ * * * D I S K * * * ************ ; begin comment ******************************************************** * * * Simulerer tidsforbruget ved pladelagertilgang. Opdelt* * i hhv. tidsforbruget ved positionering af hovedet og * * tidsforbruget ved overførsel af data. * * * ******************************************************** ; integer kontrolnr; kontrolnr:=disknr; while true do begin if test = 1 then begin outint(kontrolnr,2); outtext("disk starter"); outfix(time,4,12); outimage; end; disktilgange(kontrolnr):=disktilgange(kontrolnr)+1; disktid:=negexp(1/pladelagertid(kontrolnr),startvaerdi); hold(disktid); disksum(kontrolnr,tid):=disksum(kontrolnr,tid)+disktid; disksum(kontrolnr,5):=disksum(kontrolnr,5)+disktid; if kondublering then begin if kontrolnr = 2 then diskkonnr:=1 else diskkonnr:=2; end else diskkonnr:=1; kanalkoe(diskkonnr); into(kontrolkoe(diskkonnr)); kontrolkald(diskkonnr):=true; activate kontrol(diskkonnr) after current; disknr:=kontrolnr; passivate; hold(overfoerselstid); disksum(kontrolnr,tid):= disksum(kontrolnr,tid)+overfoerselstid; disksum(kontrolnr,5):= disksum(kontrolnr,5)+overfoerselstid; if kondublering and kontrolnr <> 2 then kanalkoe(2) else kanalkoe(1); out; disknr:=kontrolnr; if kondublering then begin if kontrolnr = 2 then diskkonnr:=1 else diskkonnr:=2; end else diskkonnr:=1; paratkald(diskkonnr):=true; activate kontrol(diskkonnr) ; if test = 1 then begin outint(kontrolnr,2); outtext("disk faerdig"); outfix(time,4,12); outimage; end; if proc(1).idle and proc(2).idle and proc(3).idle and proc(4).idle and proc(6).idle then activate skift after current; if not kontrolnr=2 or ( kontrolnr = 2 and soegediskkoe.empty) then passivate; end; end; \f process class processtyring; comment ****************************** * * * P R O C E S S T Y R I N G * * * ****************************** ; begin comment ******************************************************** * * * Simulerer aktivering af første proces i ventekø af * * aktive processer. Desuden simuleres tidsforbruget ved* * skift mellem processer. * * * ******************************************************** ; ref (koeobjekt) aktivnu; integer n; while true do begin while not aktivkoe.empty do begin aktivnu:-aktivkoe.first; n:=aktivnu.aktivnr; aktivnu.out; if n = 6 then soegeprocesnr:=6 else soegeprocesnr:=2; activate proc(n) delay skiftetid; antalprocskift:=antalprocskift+1; if resttidskvant > skiftetid then resttidskvant:=resttidskvant-skiftetid else resttidskvant:= (tidskvant+resttidskvant)-skiftetid; if test = 1 then begin outtext("processtyring aktiv "); outfix(time,4,12); outimage; end; processum(tid):=processum(tid)+skiftetid; processum(5):=processum(5)+skiftetid; passivate; end; if test = 1 and time>7800 and time <8000 then begin outtext("process styring passiv"); outfix(time,4,12); outimage; end; passivate; end; end; \f process class koeobjekt; comment ********************* * * * K O E O B J E K T * * * ********************* ; begin comment **************************************************** * * * Simulerer repræsentation af processer i ventekø * * af aktive processer. * * * **************************************************** ; integer aktivnr,prioritet; end; \f procedure koeindsaet(nummer);integer nummer; comment *********************** * * * K O E I N D S A E T * * * *********************** ; begin comment ***************************************************** * * * Simulerer indsættelse af processer på rigtige sted* * i aktivkøen. Indplaceringen sker jvf. indsættel- * * sesstrategien. * * * ***************************************************** ; ref(koeobjekt) hjelp,hjelp1; integer n; n:=nummer; hjelp:-aktivkoe.first; while hjelp =/= none and hjelp.prioritet > objekt(n).prioritet do hjelp:-hjelp.suc; if timequantum(n) >= tidskvant then begin if hjelp == none then objekt(n).into(aktivkoe) else begin if hjelp.prioritet < objekt(n).prioritet then objekt(n).precede(hjelp) else begin hjelp1:-hjelp.suc; while hjelp.suc =/= none and hjelp1.prioritet = objekt(n).prioritet do begin hjelp:-hjelp.suc; hjelp1:-hjelp.suc; end; end; objekt(n).follow(hjelp); end; timequantum(n):=0; if test = 1 and time >7800 and time< 8000 then begin outtext("nummer 1 til tid "); outfix(time,4,12); outtext("aktivkoelengde "); outint(aktivkoe.cardinal,4); outimage; end; end else begin if aktivkoe.empty then begin objekt(n).into(aktivkoe); if test = 1 and time>7800 and time<8000 then begin outtext("nummer 2 til tid "); outfix(time,4,12); outtext("aktivkoelangde "); outint(aktivkoe.cardinal,4); outimage; end; end else begin if hjelp == none then objekt(n).into(aktivkoe) else objekt(n).precede(hjelp); if test = 1 and time >7800 and time<8000 then begin outtext("nummer 3 til tid "); outfix(time,4,12); outtext("aktivkoelengde "); outint(aktivkoe.cardinal,4); outimage; end; end; end; end; \f procedure koelengde(i); integer i; begin comment ************************* * * * K O E L E N G D E * * * *************************; comment ****************************************************** * * * Beregner kontinuerligt længden af køen ved hver af * * de 4 processer (input,søge,opslags og output) * * * ****************************************************** ; real korrtid; antalikoe(i,tid):=koe(i).cardinal; gnstikoe(i,5):= ((sidstmaalt(i)/time)*gnstikoe(i,5)) +(((time-sidstmaalt(i))/time)*antalikoe(i,tid)); sidstmaalt(i):=time; korrtid:=(time-(simtid*(tid-1))); if tid <> 5 then gnstikoe(i,tid):= ((sidstobs(i)/korrtid)*gnstikoe(i,tid))+ (((korrtid-sidstobs(i))/korrtid)*antalikoe(i,tid)); sidstobs(i):=korrtid; end; \f procedure kanalkoe(i); integer i; begin comment ************************* * * * K A N A L K O E * * * ************************* ; comment ****************************************************** * * * Beregner kontinuerligt længden af køen ved dataka- * * nalen (diskkontrol). * * * ****************************************************** ; integer kanalkorr; kanalantal(i,tid):=kontrolkoe(i).cardinal; kanalgnst(i,5):= ((kanalsidst(i)/time)*kanalgnst(i,5))+ (((time-kanalsidst(i))/time)*kanalantal(i,tid)); kanalsidst(i):=time; kanalkorr:=(time-(simtid*(tid-1))); if tid <> 5 then kanalgnst(i,tid):= ((kanalobs(i)/kanalkorr)*kanalgnst(i,tid))+ (((kanalkorr-kanalobs(i))/kanalkorr)* kanalantal(i,tid)); kanalobs(i):=kanalkorr; end; \f procedure overgang(jobreference,procesnr); ref (job) jobreference;integer procesnr; begin ref (job) udtag; boolean snyd; comment ********************* * * * O V E R G A N G * * * ********************* ; comment **************************************************** * * * Bestemmer næste proces for en forespørgsel, givet* * den netop er færdig med en bestemt proces. Fast- * * læggelse sker v.h.a. en indlæst overgangsmatrice.* * Behandler yderligere implementering af en duble- * * ring af søgeprocessen. * * * **************************************************** ; integer procnr; real udtrukket; if test = 1 then begin outtext("overgang kaldt"); outfix(time,4,12); outimage; end; udtrukket := uniform(0,1,startvaerdi); if procesnr = 6 then begin snyd:=true; procesnr:=2; end; procnr:=1; while procnr <= 5 and udtrukket > overgangsmatrix(procesnr,procnr) do procnr := procnr + 1; if snyd then begin procesnr:=6; snyd:=false; end; koelengde(procesnr); if dublering and procnr = 2 and koe(6).empty and not koe(2).empty then procnr:=6;koelengde(procnr); if test= 2 and procesnr = 3 then begin outtext("koened til "); outint(koe(3).cardinal,3); outtext("jobnr - "); outint(jobreference.jobnr,3); outtext("time = "); outfix(time,4,12); outimage; end; if test = 2 and procnr = 3 then begin outtext("koeop til "); outint(koe(3).cardinal,3); outtext("jobnr ="); outint(jobreference.jobnr,4); outtext("tid = "); outfix(time,4,12); outimage; end; jobreference.into(koe(procnr)); if (procnr<5 or procnr = 6) and not procaktiv(procnr) and not koe(procnr).cardinal > 1 then koeindsaet(procnr); if dublering and procesnr = 6 and koe(6).empty and koe(2).cardinal > 1 then begin udtag:-koe(2).first.suc; koelengde(2); udtag.into(koe(6)); end; end; \f process class job; comment ********** * * * J O B * * * ********** ; begin comment **************************************************** * * * Simulerer forekomsten af en forespørgsel i OP- * * systemet. * * * **************************************************** ; integer jobnr; real jobtid,ankinput,afginput,cpuinput, anksoeg,afgsoeg,cpusoeg, ankopslag,afgopslag,cpuopslag, ankoutput,afgoutput,cpuoutput; end; \f center class statistik; comment ********************** * * * S T A T I S T I K * * * ********************** ; begin comment **************************************************** * * * Beregningsprocedure af tidsforbruget ved de 4 * * processer, opdelt i CPU-tid, køtid og samlet tid.* * * **************************************************** ; ref (job) jobref; real hjelptid; integer pointer; real koetid,procestid; integer t; while true do begin if statkald = 5 then begin t:=5; statkald:=0; end else t:=tid; jobref:-koe(5).first; if test = 1 and t = 5 then spor(jobref.jobnr,5,1); antalforsp(1,t):=antalforsp(1,t)+1; procestid:=jobref.afginput-jobref.ankinput; koetid:=jobref.ankinput-jobref.jobtid; snitforsp(1,1,t):=snitforsp(1,1,t)+procestid; varforsp(1,1,t):=varforsp(1,1,t)+procestid*procestid; snitforsp(1,2,t):=snitforsp(1,2,t)+jobref.cpuinput; varforsp(1,2,t):= varforsp(1,2,t)+jobref.cpuinput*jobref.cpuinput; snitforsp(1,3,t):= snitforsp(1,3,t)+koetid; varforsp(1,3,t):= varforsp(1,3,t)+koetid*koetid; if jobref.cpusoeg > 0 then begin antalforsp(2,t):=antalforsp(2,t)+1; procestid:=jobref.afgsoeg-jobref.anksoeg; koetid:=jobref.anksoeg-jobref.afginput; snitforsp(2,1,t):= snitforsp(2,1,t)+procestid; varforsp(2,1,t):= varforsp(2,1,t)+procestid*procestid; snitforsp(2,2,t):= snitforsp(2,2,t)+jobref.cpusoeg; varforsp(2,2,t):= varforsp(2,2,t)+jobref.cpusoeg*jobref.cpusoeg; snitforsp(2,3,t):= snitforsp(2,3,t)+koetid; varforsp(2,3,t):= varforsp(2,3,t)+koetid*koetid; end; if jobref.cpuopslag > 0 then begin procestid:=jobref.afgopslag-jobref.ankopslag; if jobref.cpusoeg > 0 then koetid:=jobref.ankopslag-jobref.afgsoeg else koetid:=jobref.ankopslag-jobref.afginput; antalforsp(3,t):=antalforsp(3,t)+1; snitforsp(3,1,t):= snitforsp(3,1,t)+procestid; varforsp(3,1,t):= varforsp(3,1,t)+procestid*procestid; snitforsp(3,2,t):= snitforsp(3,2,t)+jobref.cpuopslag; varforsp(3,2,t):= varforsp(3,2,t)+jobref.cpuopslag*jobref.cpuopslag; snitforsp(3,3,t):= snitforsp(3,3,t)+koetid; varforsp(3,3,t):= varforsp(3,3,t)+koetid*koetid; end; if jobref.cpuoutput > 0 then begin procestid:=jobref.afgoutput-jobref.ankoutput; if jobref.cpuopslag > 0 then koetid:=jobref.ankoutput-jobref.afgopslag else begin if jobref.cpusoeg > 0 then koetid:=jobref.ankoutput-jobref.afgsoeg else koetid:=jobref.ankoutput-jobref.afginput; antalfejl(t):=antalfejl(t)+1; end; antalforsp(4,t):=antalforsp(4,t)+1; snitforsp(4,1,t):= snitforsp(4,1,t)+procestid; varforsp(4,1,t):= varforsp(4,1,t)+procestid*procestid; snitforsp(4,2,t):= snitforsp(4,2,t)+jobref.cpuoutput; varforsp(4,2,t):= varforsp(4,2,t)+jobref.cpuoutput*jobref.cpuoutput; snitforsp(4,3,t):= snitforsp(4,3,t)+koetid; varforsp(4,3,t):= varforsp(4,3,t)+koetid*koetid; totaltid(t):=totaltid(t)+ (jobref.afgoutput-jobref.ankinput); end; samlettid(t):=samlettid(t)+ (jobref.afgoutput-jobref.jobtid); if t=5 then begin hjelptid:=jobref.afgoutput-jobref.jobtid; pointer:= entier(hjelptid); pointer:= pointer // 250; if pointer > 32 then svarfordel(32):=svarfordel(32)+1 else svarfordel(pointer):=svarfordel(pointer)+1; if minsvartid > hjelptid then minsvartid:=hjelptid; if maxsvartid < hjelptid then maxsvartid:=hjelptid; jobref.out; end; passivate; end; end; \f procedure skrivresultat(tid); integer tid; comment ****************************** * * * S K R I V R E S U L T A T * * * ****************************** ; begin comment **************************************************** * * * Udskrivningsprocedure af tællevariable, beregnede* * og afledte målevariable. * * * **************************************************** ; real procesudnyt,totaludnyt; real procent,accprocent; real procedure beregnsnit(l);integer l; if antalforsp(i,tid)>0 then beregnsnit:=snitforsp(i,l,tid)/antalforsp(i,tid); real procedure beregnvar(l);integer l; if antalforsp(i,tid)>0 then beregnvar:=varforsp(i,l,tid)/antalforsp(i,tid)- snit*snit; real snit; outimage;eject(1); for i:= 1 step 1 until 62 do outchar('*'); outimage;outchar('*'); for i:= 1 step 1 until 60 do outchar(' '); outchar('*'); outimage;outchar('*'); outtext(" R E S U L T A T E R F R A S I M U "); outtext("L A T O R E N *"); outimage;outchar('*'); for i:= 1 step 1 until 60 do outchar(' '); outchar('*');outimage; for i:= 1 step 1 until 62 do outchar('*'); outimage; if tid = 5 then outtext("Samlede resultater: ") else begin outtext("resultater for "); outint(tid,5); outtext(". kvarter"); end; outimage; for i:= 1 step 1 until 4 do begin outimage;outimage; outimage;outimage; if i = 1 then outtext(" INPUT PROCES "); if i = 2 then outtext(" SOEGE PROCES "); if i = 3 then outtext(" OPSLAGS PROCES "); if i = 4 then outtext (" OUTPUT PROCES "); outimage; outtext(" ------------------"); outimage; outimage; outtext(" antal forespoergsel = "); outint(antalforsp(i,tid),10); outimage; outtext(" gennemsnitlig procestid = "); snit:=beregnsnit(1); outfix(snit,2,8); outimage; outtext(" varianse på procestid = "); outfix(beregnvar(1),2,12); outimage; outtext(" genenmsnitlig cputid = "); snit:=beregnsnit(2); outfix(snit,2,8); outimage; outtext(" varianse på cputid = "); outfix(beregnvar(2),2,12); outimage; outtext(" gennemsnitlig koetid = "); snit:=beregnsnit(3); outfix(snit,2,8); outimage; outtext(" varianse på koetid = "); outfix(beregnvar(3),2,12); outimage; end; outimage;outimage; outtext(" totaltid i systemet = "); outfix(totaltid(tid),2,12); outimage;outimage; outtext("Gennemsnitlig svartid med inputproces ="); outfix(samlettid(tid)/antalforsp(1,tid),2,12); outimage; outtext("Gennemsnit svartid ="); outfix(totaltid(tid)/antalforsp(1,tid),2,12); outimage;outimage; outtext(" antal fejl = "); outint(antalfejl(tid),8); outimage;outimage; outtext("Udnyttelsesgrad af inputproces="); procesudnyt:=(inputsum(tid)/simtid)*100; outfix(procesudnyt,2,7); totaludnyt:=procesudnyt; outimage; outtext("Udnyttelsesgrad af soegeproces ="); procesudnyt:= (soegesum(tid)/simtid)*100; outfix(procesudnyt,2,7); totaludnyt:=totaludnyt+procesudnyt; outimage; outtext("Udnyttelsesgrad af opslagsproces ="); procesudnyt:= (opslagssum(tid)/simtid)*100; outfix(procesudnyt,2,7); totaludnyt:=totaludnyt+procesudnyt; outimage; outtext("Udnyttelsesgrad af outputproces ="); procesudnyt:= (outputsum(tid)/simtid)*100; outfix(procesudnyt,2,7); totaludnyt:=totaludnyt+procesudnyt; outimage; outtext("Udnyttelsesgrad af disk 1 ="); procesudnyt:=(disksum(1,tid)/simtid)*100; outfix(procesudnyt,2,7); outimage; outtext("Udnyttelsesgrad af disk 2 ="); procesudnyt:=(disksum(2,tid)/simtid)*100; outfix(procesudnyt,2,7); outimage; outtext("Udnyttelsesgrad af disk 3 ="); procesudnyt:=(disksum(3,tid)/simtid)*100; outfix(procesudnyt,2,7); outimage; outtext("Udnyttelsesgrad af disk 4 ="); procesudnyt:=(disksum(4,tid)/simtid)*100; outfix(procesudnyt,2,7); outimage; if not kondublering then begin outtext("udnyttelsesgrad af diskkanal ="); procesudnyt:=(kanalsum(1,tid)/simtid)*100; outfix(procesudnyt,2,7); outimage; end else begin outtext("udnyttelsesgrad af diskkanal 1 ="); procesudnyt:=(kanalsum(1,tid)/simtid)*100; outfix(procesudnyt,2,7); outimage; outtext("udnyttelsesgrad af diskkanal 2 ="); procesudnyt:=(kanalsum(2,tid)/simtid)*100; outfix(procesudnyt,2,7); outimage; end; outtext("Belastning ved processkift ="); procesudnyt:=(processum(tid)/simtid)*100; totaludnyt:=totaludnyt+procesudnyt; outfix(procesudnyt,2,7); outimage; outtext(" total udnyttelse af cpu = "); outfix(totaludnyt,2,7); outimage; outimage; outtext("Gennemsnit koeleengde for inputproces ="); koelengde(1); outfix(gnstikoe(1,tid),3,5); outimage; if dublering then begin outtext("Gennemsnitlig koelengede for soegeproces 1 ="); koelengde(2); outfix(gnstikoe(2,tid),3,5); outimage; outtext("Gennemsnitlig koelengde for soegeproces 2 ="); koelengde(6); outfix(gnstikoe(6,tid),3,5); outimage; end else begin outtext("Gennemsnitlig koelengde for soegeproces ="); koelengde(2); outfix(gnstikoe(2,tid),3,5); outimage; end; outtext("Gennemsnitlig koelengde for opslagsproces ="); koelengde(3); outfix(gnstikoe(3,tid),3,5); outimage; outtext("Gennemsnitlig koelengde for outputproces="); outfix(gnstikoe(4,tid),3,5); koelengde(4); outimage; if kondublering then begin outtext("Gennemsnitlig koelengde for diskkanal 1="); kanalkoe(1); outfix(kanalgnst(1,tid),3,5); outimage; outtext("Gennemsnitlig koelengde for diskkanal 2="); outfix(kanalgnst(2,tid),3,5); kanalkoe(2); outimage; end else begin outtext("Gennemsnitlig koelengde for diskkanal ="); kanalkoe(1); outfix(kanalgnst(1,tid),3,5); outimage; end; if tid = 5 then begin outimage; outtext("minimal svartid = "); outfix(minsvartid,2,10); outimage; outtext("maksimalsvartid = "); outfix(maxsvartid,2,10); outimage; outtext("antal processkift ="); outint(antalprocskift,10); outimage; for i:= 1 step 1 until 4 do begin outtext(" antal pladelagertilgange ved disc"); outint(i,3);outtext(" er ="); outint(disktilgange(i),10); outimage; end; outimage;eject(1); outtext("svartidsfordeling:"); outimage; outtext("------------------");outimage; outimage; outtext("svartid i ms "); outtext(" antalforsp. "); outtext(" procent af alle "); outtext(" acc.procent "); outimage; for i:=1 step 1 until 60 do outchar('-'); outimage;outimage; for i:=0 step 1 until 32 do begin outint(i*250,5);outtext(" - "); outint((((i+1)*250)-1),5); outtext(" "); outint(svarfordel(i),5); procent:= (svarfordel(i)/antalforsp(1,5))*100; accprocent:=accprocent+procent; outtext(" "); outfix(procent,2,7); outtext(" "); outfix(accprocent,2,7); outimage; end; end; end; \f procedure skrivinput; comment ************************ * * * S K R I V I N P U T * * * ************************ ; begin eject(1); outimage; for i:=1 step 1 until 62 do outchar('*'); outimage;outchar('*'); for i:=1 step 1 until 60 do outchar(' '); outchar('*');outimage;outchar('*'); outtext(" I N P U T"); outtext(" "); outtext(" *"); outimage;outchar('*'); for i:= 1 step 1 until 60 do outchar(' '); outchar('*');outimage; for i:= 1 step 1 until 62 do outchar('*'); outimage;outimage;outimage; outtext("antaljobs pr ms = "); outfix(ankomstrate(0),6,8); outimage; outimage;outimage; for i:=1 step 1 until 4 do begin outtext("pladetid");outchar('(');outint(i,2); outtext(") = ");outfix(pladelagertid(i),2,7); outimage; end; outtext("Overfoerselstid ="); outfix(overfoerselstid,2,7); outimage; outimage;outimage; outtext("Minimale antal diskaccesser i soegeproces ="); outint(mindst,5); outimage; outtext("Maksimale antal diskaccesser i soegeproces ="); outint(stoerst,5); outimage; outtext("Minimale antal diskaccesser i opslagsproces ="); outint(faerrest,5); outimage; outtext("Maksimale antal diskaccesser i opslagsproces ="); outint(flest,5); outimage; outtext("Pladelager tilgangssandsynlighed i outputproces ="); outfix(pladesands,2,5); outimage; outtext("GENNEMSNITLIG CPU-TID FOR : "); outimage; outtext("input proces = ");outfix(inputtid,2,8); outimage; outtext("soege proces = ");outfix(soegetid,2,8); outimage; outtext("opslags proces = ");outfix(opslagtid,2,8); outimage; outtext("output proces = ");outfix(outputtid,2,8); outimage;outimage; outtext("SKIFTETID = "); outfix(skiftetid,2,8); outimage; outtext("TIDSKVANT = ");outfix(tidskvant,2,8); outimage; outtext("startvaerdi til tilfaeldighedstals generator ="); outint(startvaerdi,3); outimage; outtext("simperiode =");outint(simperiode,10); outimage;outtext("inputproces's prioritet ="); outint(objekt(1).prioritet,4); outimage;outtext("soegeproces's prioritet="); outint(objekt(2).prioritet,4); outimage;outtext("opslagsproces's prioritet="); outint(objekt(3).prioritet,4); outimage;outtext("outputproces's prioritet="); outint(objekt(4).prioritet,4); outimage; outimage;eject(1); outimage; outtext(" OVERGANGS SANDSYNLIGHEDS MATRIX ");outimage; outtext(" ------------------------------- ");outimage; outimage; outtext(" i, j "); for i:=1 step 1 until 5 do begin outtext(" ");outint(i,2);outtext(" "); end; for i:=1 step 1 until 5 do begin outimage; outimage; outtext(" ");outint(i,2);outtext(" "); outtext(" "); outfix(overgangsmatrix(i,1),2,6); outtext(" "); for j:=2 step 1 until 5 do begin outtext(" "); outfix(overgangsmatrix(i,j)-overgangsmatrix(i,j-1),2,6); outtext(" "); end; end; end; \f procedure spor(nummer,procestype,status); integer nummer,procestype,status; begin outtext("jobnr "); outint(nummer,3); if status = 1 then outtext(" starter i ") else outtext(" forlader "); if procestype = 1 then outtext("inputproces"); if procestype = 2 then outtext("soegeproces 1"); if procestype = 3 then outtext("opslagproces"); if procestype = 4 then outtext("outputproces"); if procestype = 5 then outtext("statistikproces"); if procestype = 6 then outtext("soegeproces 2"); if procestype = 7 then outtext("jobgenerator"); outtext(" til tiden "); outfix(time,4,12); outimage; end; \f comment ********************************* * * * G L O B A L E V A R A B L E * * * ********************************* ; real array snitforsp,varforsp(1:6,1:3,1:5); integer array antalforsp(1:6,1:5); real array kanalsum(1:2,1:5); integer array antalfejl(1:5); real array totaltid,samlettid(1:5); real array disksum(1:4,1:5); real array soegesum(1:5); real array inputsum,opslagssum,outputsum, processum(1:5); real skiftetid; integer array svarfordel(0:32); real minsvartid,maxsvartid; integer antalprocskift; integer array disktilgange(1:5); boolean array kontrolkald(1:2); boolean array paratkald(1:2); integer diskkonnr,tid,simtid,statkald; boolean kondublering,dublering; real array sidstmaalt(1:6),kanalobs(1:2), kanalgnst(1:2,1:5),kanalsidst(1:2); integer array kanalantal(1:2,1:5); real overfoerselstid; real disktid; real pladesands; real resttidskvant; real array gnstikoe(1:6,1:5); real array sidstobs(1:6); real array timequantum(1:6); integer array antalikoe(1:6,1:5); real array overgangsmatrix(1:5,1:5), ankomstrate(0:23), pladelagertid(1:4); boolean array procaktiv(1:6); real inputtid,soegetid,opslagtid,outputtid, tidskvant; integer startvaerdi,kontrolnr,inputprocesnr, test, soegeprocesnr,opslagprocesnr,outputprocesnr, mindst,stoerst,faerrest,flest,disknr,i,j,simperiode; ref (head) array kontrolkoe(1:2); ref (disk) array pladelager(1:4); ref (koeobjekt) array objekt(1:6); ref (center) array proc(1:6); ref (head) array koe(1:6); ref (head) aktivkoe; ref (head) soegediskkoe; ref (head) opslagsdiskkoe,outputdiskkoe; ref (processtyring) skift; ref (diskkontrol) array kontrol(1:2); \f comment ************************************ * * * I N I T I A L I S E R I N G * * * ************************************ ; test:=inint; skiftetid:=inreal; for i:= 0 step 1 until 23 do ankomstrate(i) := inreal; for i:=1 step 1 until 4 do pladelagertid(i):=inreal; inputtid := inreal; soegetid:= inreal; opslagtid := inreal; outputtid := inreal; tidskvant := inreal; startvaerdi := inint; inputprocesnr := inint; soegeprocesnr:= inint; opslagprocesnr := inint; outputprocesnr := inint; mindst := inint; stoerst := inint; faerrest := inint; flest := inint; pladesands:=inreal; simperiode := inint; overfoerselstid:=inreal; i:=inint; if i = 1 then kondublering := true; i:=inint; if i = 1 then dublering:=true; for i:=1 step 1 until 6 do koe(i):- new head; for i:=1 step 1 until 2 do kontrolkoe(i):- new head; soegediskkoe:- new head; opslagsdiskkoe :- new head; outputdiskkoe :- new head; aktivkoe:- new head; proc(1) :- new inputproces; proc(2) :- new soegeproces; proc(3) :- new opslagproces; proc(4) :- new outputproces; proc(5) :- new statistik; proc(6):- new soegeproces; for i := 1 step 1 until 5 do begin overgangsmatrix(i,1) := 0; for j := 2 step 1 until 5 do overgangsmatrix(i,j) := inreal + overgangsmatrix(i,j-1); end; for i:=1 step 1 until 4 do pladelager(i) :- new disk; skift :- new processtyring; if kondublering then begin for i:=1 step 1 until 2 do kontrol(i):- new diskkontrol; end else kontrol(1):-new diskkontrol; for i:=1 step 1 until 6 do objekt(i):- new koeobjekt; for i:=1 step 1 until 6 do objekt(i).prioritet:=inint; resttidskvant:=tidskvant; for i:=1 step 1 until 6 do objekt(i).aktivnr:=i; skrivinput; minsvartid:=100000.0; activate new jobgenerator; end; ktassystem begin simtid:=simperiode/4; for tid :=1 step 1 until 4 do begin hold(simtid); skrivresultat(tid); for i:=1 step 1 until 6 do sidstobs(i):=0; for i:=1 step 1 until 2 do kanalobs(i):=0; end; simtid:=simperiode; skrivresultat(5); end; end; ▶EOF◀