MODULE TempsPartage; IMPORT SIM, STAT, PROCS, RES; FROM RAND IMPORT InitGenerator, SeedType; FROM RAND1 IMPORT Weibull, Expon; FROM RES IMPORT Resource, Request, Release, ServicePolicy; FROM MYINOUT IMPORT OpenInput, OpenOutput, CloseInput, CloseOutput, ReadCard, ReadLn, ReadLongReal; VAR TotTaches : CARDINAL; (* Nombre de fins de taches avant *) (* la fin de la simulation. *) PrelimTaches : CARDINAL; (* Nombre de fins de taches avant *) (* la fin du rechauffement. *) NTaches : CARDINAL; (* Nombre de taches deja terminees. *) NTer : CARDINAL; (* Nombre de terminaux. *) Quantum : LONGREAL; (* Duree d'un quantum. *) Overhead : LONGREAL; (* Duree de l'overhead. *) TReflexMoy : LONGREAL; (* Temps moyen de reflexion. *) Alpha, Lambda : LONGREAL; (* Par. de la loi Weibull du temps *) (* de CPU par tache. *) CPU : Resource; (* Le CPU. *) Terminal : PROCS.ProcessType; (* Un terminal. *) NRep, Rep : CARDINAL; (* Nb. de repet. et numero de la *) (* repet. courante. *) MoyConf1 : ARRAY [1..100] OF LONGREAL; (* Temps de reponse moy. des *) (* repetitions pour la config. 1. *) TRepMoy : STAT.Block; (* Stat. sur les temps de reponse *) (* pour la repetition courante. *) Diff : STAT.Block; (* Stat. sur les differences entre *) (* les temps de reponse. *) Conf : [1..2]; (* No. de la configation courante. *) i : CARDINAL; PROCEDURE LireDonnees; BEGIN ReadCard (NTer); ReadLongReal (Quantum); ReadLongReal (Overhead); ReadLongReal (TReflexMoy); ReadLongReal (Alpha); ReadLongReal (Lambda); ReadCard (TotTaches); ReadCard (PrelimTaches); ReadCard (NRep); ReadLn; END LireDonnees; PROCEDURE ProcTerminal; (* Decrit la suite des activites reliees a un terminal. *) VAR TArrivee : LONGREAL; (* Instant d'arrivee de la derniere *) (* tache de ce terminal. *) TCPURestant : LONGREAL; (* Temps cpu encore requis. *) BEGIN WHILE (NTaches <= TotTaches) DO PROCS.Delay (Expon (TReflexMoy, 1)); (* Temps de reflexion. *) TArrivee := SIM.Time(); (* Arrivee d'une tache. *) TCPURestant := Weibull (Alpha, Lambda, 2); (* Duree de la tache. *) WHILE (TCPURestant > Quantum) DO Request (1, CPU); (* Il reste plus d'un quantum. *) PROCS.Delay (Quantum + Overhead); TCPURestant := TCPURestant - Quantum; Release (1, CPU) END; Request (1, CPU); (* Il reste une fraction de quantum. *) PROCS.Delay (TCPURestant + Overhead); Release (1, CPU); (* Fin de la tache. *) STAT.Update (TRepMoy, SIM.Time () - TArrivee); IF (NTaches = PrelimTaches) THEN STAT.Init (TRepMoy) END; (* Fin du rechauffement. *) INC (NTaches) END; SIM.Stop; PROCS.Terminate (* Ici, on a NTaches = TotTaches. *) END ProcTerminal; PROCEDURE SimulerUneRepetition; BEGIN PROCS.KillAll; SIM.Init; STAT.Init (TRepMoy); RES.Init (CPU); NTaches := 0; FOR i := 1 TO NTer DO (* Activer les terminaux. *) PROCS.Schedule (Terminal, 0.0, NIL) END; SIM.Start END SimulerUneRepetition; BEGIN PROCS.Create (Terminal, ProcTerminal, 2048, 'Un terminal'); RES.Create (CPU, Fifo, 1, 'Le CPU'); STAT.Create (TRepMoy, STAT.Tally, 'Temps reponse moyen'); STAT.Create (Diff, STAT.Tally, 'Differences'); OpenInput (".DAT"); OpenOutput (".RES"); FOR Conf := 1 TO 2 DO LireDonnees; IF Conf = 2 THEN InitGenerator (1, InitialSeed); InitGenerator (2, InitialSeed) END; FOR Rep := 1 TO NRep DO SimulerUneRepetition; IF Conf = 1 THEN MoyConf1 [Rep] := STAT.Average (TRepMoy) ELSE STAT.Update (Diff, MoyConf1 [Rep] - STAT.Average (TRepMoy)) END; InitGenerator (1, NewSeed); InitGenerator (2, NewSeed) END END; STAT.ReportConfidenceInterval (Diff, 0.9); CloseInput; CloseOutput END TempsPartage.