1. 程式人生 > >計算機作業系統實驗:作業排程演算法的實現

計算機作業系統實驗:作業排程演算法的實現

作業排程演算法先來先服務排程演算法採用python實現

  1. 先來先服務排程演算法—— 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)