zoukankan      html  css  js  c++  java
  • 模拟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()

  • 相关阅读:
    ADF中遍历VO中的行数据(Iterator)
    程序中实现两个DataTable的Left Join效果(修改了,网上第二个DataTable为空,所处的异常)
    ArcGIS api for javascript——鼠标悬停时显示信息窗口
    ArcGIS api for javascript——查询,然后单击显示信息窗口
    ArcGIS api for javascript——查询,立刻打开信息窗口
    ArcGIS api for javascript——显示多个查询结果
    ArcGIS api for javascript——用图表显示查询结果
    ArcGIS api for javascript——查询没有地图的数据
    ArcGIS api for javascript——用第二个服务的范围设置地图范围
    ArcGIS api for javascript——显示地图属性
  • 原文地址:https://www.cnblogs.com/wanghongxu/p/3975009.html
Copyright © 2011-2022 走看看