模拟cpu调度

先来先服务实现简单但是平均周转时间过长

短作业优先算法缩短了平均周转时间

#!/usr/bin/python
#-*- coding: utf-8 -*-
#
# table
# 0:进程号 1:到达时间 2:所需时间
#
# pTable 先来先服务
# 0:进程号 1:开始运行时间 2:运行时间 3:周转时间 4:带权周转时间
#
# qTable 短作业优先
# 0:进程号 1:开始运行时间 2:运行时间 3:周转时间 4:带权周转时间
#

class Work4Ligon(object):
	table = []
	pTable = []
	qTable = []
	
	def __init__(self):
		pass
	
	#输入数据
	def dataIn(self):
		num = raw_input("请输入进程数:")
		num = num.strip()
		num = int(num)
		i = 1
		while(i <= num):
			print "请输入进程 ",i,"的到达时间"
			a = float(raw_input())
			print "请输入进程 ",i,"的运行时间"
			b = float(raw_input())
			self.table.append([i,a,b])
			i += 1
	
	#计算先来先服务
	def pTableFill(self):
		table = self.table
		time = 0
		for i in xrange(len(table)):
			num = table[i][0]
			if (time > table[i][1]):
				startTime = time
			else:
				startTime = table[i][1]
			time += table[i][2]
			runTime = table[i][2]
			zj = startTime + runTime - table[i][1]
			dzj = zj / table[i][2]
			self.pTable.append([num, startTime, runTime, zj, dzj])
			
	#计算短作业优先		
	def qTableFill(self):
		#复制一份作业列表
		table = list(self.table)
		
		time = 0
		for i in xrange(len(table)):
			minIndex = -1
			minTime = 0
			for j in xrange(len(table)):
				if (table[j][1] <= time):
					if (minIndex == -1):
						minIndex = j
						minTime = table[j][2]
					else:
						if (table[j][2] < minTime):
							minIndex = j
							minTime = table[j][2]
			
			num = table[minIndex][0]
			if (time > table[minIndex][1]):
				startTime = time
			else:
				startTime = table[minIndex][1]
			time += table[minIndex][2]
			runTime = table[minIndex][2]
			zj = startTime + runTime - table[minIndex][1]
			dzj = zj / table[minIndex][2]
			self.qTable.append([num, startTime, runTime, zj, dzj])
			table.remove(table[minIndex])

	#按到达时间排序	
	def sort(self):
		table = list(self.table)
		self.table = []
		for i in xrange(len(table)):
			minIndex = -1
			minTime = 0
			for j in xrange(len(table)):
				if (minIndex == -1):
					minIndex = j
					minTime = table[j][1]
				else:
					if (table[j][1] < minTime):
						minIndex = j
						minTime = table[j][1]
			self.table.append(table[minIndex])
			table.remove(table[minIndex])
			
	def display(self):
		p = self.pTable
		q = self.qTable
		avg1 = 0
		avg2 = 0
		print '先来先服务:'
		print '线程号	开始执行时间	执行时间	周转时间	带权周转时间'
		for i in xrange(len(p)):
			print p[i][0],'	',p[i][1],'		',p[i][2],'		',p[i][3],'		',p[i][4]
			avg1 += p[i][3]
			avg2 += p[i][4]
		print '平均周转时间:',avg1 / len(p),'	平均带权周转时间', avg2 / len(p)
		
		avg1 = 0
		avg2 = 0
		print '短作业优先:'
		print '线程号	开始执行时间	执行时间	周转时间	带权周转时间'
		for i in xrange(len(p)):
			print q[i][0],'	',q[i][1],'		',q[i][2],'		',q[i][3],'		',q[i][4]
			avg1 += q[i][3]
			avg2 += q[i][4]
		print '平均周转时间:',avg1 / len(p),'	平均带权周转时间', avg2 / len(q)
	
	#开始运行
	def run(self):
		self.dataIn()
		self.sort()
		self.qTableFill()
		self.pTableFill()
		self.display()
		
		
if __name__ == '__main__':
	w = Work4Ligon()
	w.run()

原文地址:https://www.cnblogs.com/wanghongxu/p/3975009.html