• 模拟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()

  • 相关阅读:
    Python字符串
    MySQL触发器
    MySQL 1418报错解决办法
    数据库下载
    补码与反码
    二、八、十六进制之间的转换
    this 指向
    作用域 var 词法分析 arguments
    事件绑定的3种方式
    清浮动方法小结
  • 原文地址:https://www.cnblogs.com/wanghongxu/p/3975009.html
Copyright © 2020-2023  润新知