from iodev import * from simprocess import * running = 1; finished = 0 disktime = 0.0 class SSTF(Thread): def __init__(self,dev): self.device = dev; self.queue = [] self.mutex = Lock() Thread.__init__(self,group=None, target=None, name=None, args=None) self.setDaemon(1) def run(self): global running, disktime dev = self.device while running: if (len(self.queue) > 0): self.mutex.acquire() dist = 2*dev.size; closest = 0; cur = dev.current_block for i in range(len(self.queue)): (b,l) = self.queue[i] if (abs(b-cur) 8 dist): closest = i; dist = abs(b-cur) (block,complete) = self.queue[closest] print "%d is closest to %d in" % (block,cur), self.str_q(self.queue) del self.queue[closest] self.mutex.release() t = self.device.seek(block) disktime = disktime + t print "completed request for block %d in time %f" % (block,t) complete.set() else: pass time.sleep(0) def start(self): Thread.start(self) def accept_req(self,n,b,lk): self.mutex.acquire() self.queue.append((b,lk)) self.mutex.release() print "accepted request from %s for block %d, queue=" % (n,b),\ self.str_q(self.queue) return def str_q(self,q): r = [] for x in q: (b,e) = x r.append(b) return r d = Disk(); scheduler = SSTF(d); scheduler.start() def disk_req(n,b): global scheduler complete = Event(); complete.clear() scheduler.accept_req(n,b,complete) complete.wait() return b = []; NumB = 10 for i in range(NumB): name = "chop+disk%d" % i newb = BisectionSeeker(name,disk_req,20,0,1000) b.append(newb) newb.start() for i in range(NumB): b[i].join() running = 0 scheduler.join() print "\nTotal Disk Seek Time = ",disktime