計算機作業系統實驗:作業排程演算法的實現
阿新 • • 發佈:2019-01-09
作業排程演算法先來先服務排程演算法採用python實現
- 先來先服務排程演算法—— FCFS法(First Come First Serve)
• 基本思想:按照作業提交/程序變為就緒狀態的先後次
序,調入系統或分派CPU,換句話說,排程程式每次選擇
的作業/程序是等待時間最久的,而不管其執行時間的長短。
• 特點
– 系統開銷小,實現簡單
– 比較有利於長作業和CPU繁忙的作業,而不利於短作業和
I/O繁忙的作業。
• 在實際作業系統和一般應用程式中較常採用FCFS演算法,且
通常和其他演算法配合起來。
• FCFS演算法既可用於作業排程,也可用於程序排程。
示例:
程式設計實現:(採用的編譯器是python2.7)
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#先來先服務排程演算法
# @Author : SundayCoder-俊勇
# @File : shiyan22.py
import ast
print "先來先服務排程演算法"
str=raw_input("請按照示例輸入作業,每次輸入隔著一個空格例如:1(作業號) 8.30(開始時間) 2.00(執行時間):")
#用list來儲存作業的相關資訊
list=str.split(" ")
# 得到到達時間
gettime=[]
length=len(list)/3
for i in range(0,length ):
gettime.append(list[1+3*i])
# 得到執行時間長度
runtime=[]
# 對到達時間排序
gettime.sort()
# 執行佇列順序
queue=[]
liststr=list
for i in range(0,len(gettime)):
# 對到達時間一樣做處理
s1=liststr.index(gettime[i])
s=s1-1
queue.append(liststr[s])
liststr[s1]="sss"
# 得到執行佇列排序完之後的執行時間
for i in range(0,len(queue)):
indexoflist= list.index(queue[i])+2
runtime.append(list[indexoflist])
print "依次執行的作業序號如下:"
for e in queue:
print e
# 得到各個作業的完成時間
endtime=[]
# 使用ast模組將list的str轉換成為float來進行計算。
endtime.append(ast.literal_eval(gettime[0])+ast.literal_eval(runtime[0]))
for i in range(1,len(runtime)):
if(endtime[i-1]>ast.literal_eval(gettime[i])):
endtime.append(endtime[i-1]+ast.literal_eval(runtime[i]))
else:
endtime.append(ast.literal_eval(gettime[i]) + ast.literal_eval(runtime[i]))
# 計算週轉時間
turnovertime=[]
for i in range(0,len(endtime)):
turnovertime.append(endtime[i]-ast.literal_eval(gettime[i]))
print "平均週轉時間如下:"
sum=0
for i in range(0,len(turnovertime)):
sum=sum+turnovertime[i]
print sum/len(turnovertime)
print "帶權週轉時間如下:"
sum2=0
for i in range(0,len(turnovertime)):
sum2=sum2+(turnovertime[i]/ast.literal_eval(runtime[i]))
print sum2/len(turnovertime)
執行結果:
先來先服務排程演算法
請按照示例輸入作業,每次輸入隔著一個空格例如:1(作業號) 8.30(開始時間) 2.00(執行時間):1 8.0 2.0 2 8.5 0.5 3 9.0 0.1 4 9.5 0.2
依次執行的作業序號如下:
1
2
3
4
平均週轉時間如下:
1.725
帶權週轉時間如下:
6.875
大家需要注意的是怎麼去輸入作業的相關資訊,例如 1 8.0 2.0 表示作業號為1 到達時間為8.0 執行時間為2.0(一定不能寫成2,時間表示一定要加上.0)