import Process import Events class RR: running = -1 ReadyQ = [] IOWaitTime = 10 TimeSlice = 3 def tick(self): if RR.running >= 0: pr = Process.PT.pt[RR.running] if pr.time == 0: newEv = Events.EventCreate(Events.currentTime,'exit',pr.num,0,0,0) Events.AddEvent(newEv) elif pr.timetoio == 0: newEv = Events.EventCreate(Events.currentTime,'iowait',pr.num,0,0,0) Events.AddEvent(newEv) elif pr.slice == 0: newEv = Events.EventCreate(Events.currentTime,'interrupt',pr.num,0,0,0) Events.AddEvent(newEv) def HandleEvent(self,ev): if ev.type == 'create': pr = Process.ProcessCreate(ev.p1,ev.p2,ev.p3,ev.p4) pr.statechange(ev.time,'created') if pr.iotime > 0: pr.timetoio = pr.iotime else: pr.timetoio = pr.time + 1 LogEvent(pr,"created") elif ev.type == 'admit': pr = Process.PT.pt[ev.p1] pr.statechange(ev.time,'ready') self.AddReady(ev.p1) LogEvent(pr,"admitted") elif ev.type == 'dispatch': pr = Process.PT.pt[ev.p1] pr.statechange(ev.time,'running') pr.slice = RR.TimeSlice RR.running = pr.num LogEvent(pr,"dispatched") elif ev.type == 'interrupt': pr = Process.PT.pt[ev.p1] pr.statechange(ev.time,'ready') if RR.running == pr.num: RR.running = -1 self.AddReady(pr.num) LogEvent(pr,"interrupted") elif ev.type == 'iowait': pr = Process.PT.pt[ev.p1] pr.statechange(ev.time,'waiting') RR.running = -1 waitfor = RR.IOWaitTime etime = Events.currentTime + waitfor newEv = Events.EventCreate(etime,'iowait',ev.p1,0,0,0) Events.AddEvent(newEv) LogEvent(pr,"io waits",waitfor) elif ev.type == 'iocomplete': pr = Process.PT.pt[ev.p1] pr.statechange(ev.time,'ready') if pr.iotime > 0: pr.timetoio = pr.iotime else: pr.timetoio = pr.time + 1 self.AddReady(ev.p1) LogEvent(pr,"completes io") elif ev.type == 'exit': # terminate pr = Process.PT.pt[ev.p1] pr.statechange(Events.currentTime,'terminated') RR.running = -1 LogEvent(pr,"terminates") if RR.running < 0: if len(RR.ReadyQ) > 0: runP = RR.ReadyQ[0] RR.running = runP del RR.ReadyQ[0] newEv = Events.EventCreate(Events.currentTime,'dispatch',runP,0,0,0) Events.AddEvent(newEv) def AddReady(self,pnum): addp = Process.PT.pt[pnum] self.ReadyQ.append(pnum) print " added process %d to ready queue with time %d, ReadyQ=%s" \ % (pnum,addp.time,self.ReadyQ) def LogEvent(pr,evname,waitfor=0): if waitfor>0: msg = ", io wait for %d" % waitfor else: msg = "" print "time:%3d => process %d %s, run time %d, time to io %d%s" % \ (Events.currentTime,pr.num,evname,pr.time,pr.timetoio,msg)