|
|
- #! /usr/bin/env python
-
- import sys
- from optparse import OptionParser
- import random
-
- parser = OptionParser()
- parser.add_option("-s", "--seed", default=0, help="the random seed",
- action="store", type="int", dest="seed")
- parser.add_option("-j", "--jobs", default=3, help="number of jobs in the system",
- action="store", type="int", dest="jobs")
- parser.add_option("-l", "--jlist", default="", help="instead of random jobs, provide a comma-separated list of run times",
- action="store", type="string", dest="jlist")
- parser.add_option("-m", "--maxlen", default=10, help="max length of job",
- action="store", type="int", dest="maxlen")
- parser.add_option("-p", "--policy", default="FIFO", help="sched policy to use: SJF, FIFO, RR",
- action="store", type="string", dest="policy")
- parser.add_option("-q", "--quantum", help="length of time slice for RR policy", default=1,
- action="store", type="int", dest="quantum")
- parser.add_option("-c", help="compute answers for me", action="store_true", default=False, dest="solve")
-
- (options, args) = parser.parse_args()
-
- random.seed(options.seed)
-
- print 'ARG policy', options.policy
- if options.jlist == '':
- print 'ARG jobs', options.jobs
- print 'ARG maxlen', options.maxlen
- print 'ARG seed', options.seed
- else:
- print 'ARG jlist', options.jlist
-
- print ''
-
- print 'Here is the job list, with the run time of each job: '
-
- import operator
-
- joblist = []
- if options.jlist == '':
- for jobnum in range(0,options.jobs):
- runtime = int(options.maxlen * random.random()) + 1
- joblist.append([jobnum, runtime])
- print ' Job', jobnum, '( length = ' + str(runtime) + ' )'
- else:
- jobnum = 0
- for runtime in options.jlist.split(','):
- joblist.append([jobnum, float(runtime)])
- jobnum += 1
- for job in joblist:
- print ' Job', job[0], '( length = ' + str(job[1]) + ' )'
- print '\n'
-
- if options.solve == True:
- print '** Solutions **\n'
- if options.policy == 'SJF':
- joblist = sorted(joblist, key=operator.itemgetter(1))
- options.policy = 'FIFO'
-
- if options.policy == 'FIFO':
- thetime = 0
- print 'Execution trace:'
- for job in joblist:
- print ' [ time %3d ] Run job %d for %.2f secs ( DONE at %.2f )' % (thetime, job[0], job[1], thetime + job[1])
- thetime += job[1]
-
- print '\nFinal statistics:'
- t = 0.0
- count = 0
- turnaroundSum = 0.0
- waitSum = 0.0
- responseSum = 0.0
- for tmp in joblist:
- jobnum = tmp[0]
- runtime = tmp[1]
-
- response = t
- turnaround = t + runtime
- wait = t
- print ' Job %3d -- Response: %3.2f Turnaround %3.2f Wait %3.2f' % (jobnum, response, turnaround, wait)
- responseSum += response
- turnaroundSum += turnaround
- waitSum += wait
- t += runtime
- count = count + 1
- print '\n Average -- Response: %3.2f Turnaround %3.2f Wait %3.2f\n' % (responseSum/count, turnaroundSum/count, waitSum/count)
-
- if options.policy == 'RR':
- print 'Execution trace:'
- turnaround = {}
- response = {}
- lastran = {}
- wait = {}
- quantum = float(options.quantum)
- jobcount = len(joblist)
- for i in range(0,jobcount):
- lastran[i] = 0.0
- wait[i] = 0.0
- turnaround[i] = 0.0
- response[i] = -1
-
- runlist = []
- for e in joblist:
- runlist.append(e)
-
- thetime = 0.0
- while jobcount > 0:
- # print '%d jobs remaining' % jobcount
- job = runlist.pop(0)
- jobnum = job[0]
- runtime = float(job[1])
- if response[jobnum] == -1:
- response[jobnum] = thetime
- currwait = thetime - lastran[jobnum]
- wait[jobnum] += currwait
- if runtime > quantum:
- runtime -= quantum
- ranfor = quantum
- print ' [ time %3d ] Run job %3d for %.2f secs' % (thetime, jobnum, ranfor)
- runlist.append([jobnum, runtime])
- else:
- ranfor = runtime;
- print ' [ time %3d ] Run job %3d for %.2f secs ( DONE at %.2f )' % (thetime, jobnum, ranfor, thetime + ranfor)
- turnaround[jobnum] = thetime + ranfor
- jobcount -= 1
- thetime += ranfor
- lastran[jobnum] = thetime
-
- print '\nFinal statistics:'
- turnaroundSum = 0.0
- waitSum = 0.0
- responseSum = 0.0
- for i in range(0,len(joblist)):
- turnaroundSum += turnaround[i]
- responseSum += response[i]
- waitSum += wait[i]
- print ' Job %3d -- Response: %3.2f Turnaround %3.2f Wait %3.2f' % (i, response[i], turnaround[i], wait[i])
- count = len(joblist)
-
- print '\n Average -- Response: %3.2f Turnaround %3.2f Wait %3.2f\n' % (responseSum/count, turnaroundSum/count, waitSum/count)
-
- if options.policy != 'FIFO' and options.policy != 'SJF' and options.policy != 'RR':
- print 'Error: Policy', options.policy, 'is not available.'
- sys.exit(0)
- else:
- print 'Compute the turnaround time, response time, and wait time for each job.'
- print 'When you are done, run this program again, with the same arguments,'
- print 'but with -c, which will thus provide you with the answers. You can use'
- print '-s <somenumber> or your own job list (-l 10,15,20 for example)'
- print 'to generate different problems for yourself.'
- print ''
-
-
-
|