操作系統 作業調度實驗報告

題目要求

一、 實驗目的
用高級語言編寫和調試一個或多個作業調度的模擬程序,以加深對作業調度算法的理解。
二、 例題
爲單道批處理系統設計一個作業調度程序。
由於在單道批處理系統中,作業一投入運行,它就佔有計算機的一切資源直到作業完成爲止,因此調度作業時不必考慮它所需要的資源是否得到滿足,它所佔用的 CPU時限等因素。
  作業調度算法:採用先來先服務(FCFS)調度算法,即按作業提交的先後次序進行調度。總是首先調度在系統中等待時間最長的作業。每個作業由一個作業控制塊JCB表示,JCB可以包含如下信息:作業名、提交時間、所需的運行時間、所需的資源、作業狀態、鏈指針等等。
  作業的狀態可以是等待W(Wait)、運行R(Run)和完成F(Finish)三種狀態之一。每個作業的最初狀態總是等待W。各個等待的作業按照提交時刻的先後次序排隊,總是首先調度等待隊列中隊首的作業。每個作業完成後要打印該作業的開始運行時刻、完成時刻、週轉時間和帶權週轉時間,這一組作業完成後要計算並打印這組作業的平均週轉時間、帶權平均週轉時間。
調度算法的流程圖如下 :
在這裏插入圖片描述
三、 實驗要求
1、 編寫並調試一個單道處理系統的作業等待模擬程序。
  作業等待算法:分別採用先來先服務(FCFS),最短作業優先(SJF)、響應比高者優先(HRN)的調度算法。
  對每種調度算法都要求打印每個作業開始運行時刻、完成時刻、週轉時間、帶權週轉時間,以及這組作業的平均週轉時間及帶權平均週轉時間,以比較各種算法的優缺點。
2、 編寫並調度一個多道程序系統的作業調度模擬程序。
  作業調度算法:採用基於先來先服務的調度算法。可以參考課本中的方法進行設計。
  對於多道程序系統,要假定系統中具有的各種資源及數量、調度作業時必須考慮到每個作業的資源要求。
3、 編寫並調試一個多道程序系統的作業調度模擬程序。
  作業調度算法:採用基於優先級的作業調度。
可以參考課本中的例子自行設計。

實驗報告

1.實驗目的

用高級語言編寫和調試一個或多個作業調度的模擬程序,以加深對作業調度算法的理解。

2.實驗內容與要求

①實驗內容
爲單道批處理系統設計一個作業調度程序。
由於在單道批處理系統中,作業一投入運行,它就佔有計算機的一切資源直到作業完成爲止,因此調度作業時不必考慮它所需要的資源是否得到滿足,它所佔用的 CPU時限等因素。

作業調度算法:採用先來先服務(FCFS)調度算法,即按作業提交的先後次序進行調度。總是首先調度在系統中等待時間最長的作業。每個作業由一個作業控制塊JCB表示,JCB可以包含如下信息:作業名、提交時間、所需的運行時間、所需的資源、作業狀態、鏈指針等等。
  
作業的狀態可以是等待W(Wait)、運行R(Run)和完成F(Finish)三種狀態之一。每個作業的最初狀態總是等待W。各個等待的作業按照提交時刻的先後次序排隊,總是首先調度等待隊列中隊首的作業。每個作業完成後要打印該作業的開始運行時刻、完成時刻、週轉時間和帶權週轉時間,這一組作業完成後要計算並打印這組作業的平均週轉時間、帶權平均週轉時間。

②實驗要求
編寫並調試一個單道處理系統的作業等待模擬程序。
作業等待算法:分別採用先來先服務(FCFS),最短作業優先(SJF)、響應比高者優先(HRN)的調度算法。
對每種調度算法都要求打印每個作業開始運行時刻、完成時刻、週轉時間、帶權週轉時間,以及這組作業的平均週轉時間及帶權平均週轉時間,以比較各種算法的優缺點。

3.流程圖與模塊調用

在這裏插入圖片描述

4.實驗分析

想要完成操作系統算法,首先要弄清楚操作系統相關的專業術語。弄清各個算法的流程和目的要求。才能模擬出相關算法的過程。
在我的理解中,
FCFS算法:
優先考慮系統中等待時間長的作業,而不管該作業所需執行時間長短。說的通俗點 , 哪個作業先提交 , 哪個作業先進內存。這是對作業調度而言,同樣,FCFS算法也可以用於進程調度,此時誰先進內存的誰先上CPU。

那麼這樣一來就會出現這樣的問題:如果一個作業所需運行時間很長(長作業) , 並且它先提交給系統。那麼該作業就要長時間的佔用CPU,而之後來到的短作業 , 即便它佔用cpu的時間很短也上不了CPU。在單位時間內, CPU上執行的作業數會變少,系統吞吐量降低。

爲了解決這種情況,採用SJF算法。
SJF算法:
優先考慮短作業,即:不管作業的提交時間,作業服務時間短的先上CPU。這樣一來,系統吞吐量提高了。
HRN算法:
FCFS可能造成短作業用戶不滿,SPF可能使得長作業用戶不滿,於是提出HRN,選擇響應比最高的作業運行。響應比=1+作業等待時間/作業處理時間。

基本概念:
作業週轉時間=完成時間-提交時間
作業平均週轉時間=週轉時間/作業個數
作業帶權週轉時間=週轉時間/運行時間
響應比=(等待時間+運行時間)/運行時間

5.運行情況

①FCFS算法:
在這裏插入圖片描述
②SJF算法:
在這裏插入圖片描述
③hrn算法:
在這裏插入圖片描述

6.實驗體會

通過本次實驗,我深刻的理解了操作系統中作業資源的分配方式和作業的調度方式及相關的3種算法。操作系統實驗重在理解每一個算法的意圖和目的,那麼就選擇適當的數據結構模擬過程就可以完成相關算法了。

先來先服務的作業調度,實現最簡單。

最高響應比優先作業調度,既照顧了短作業,又照顧了作業到來的順序,不會使長作業長期得不到運行,但是每次調度下一個作業前要計算剩餘到來作業的響應比,增加了系統的開銷。

開始時對作業調度不是很那麼地清晰,通過做這個實驗,現在對操作系統的作業調度有了清晰的理解,感覺在這個過程中自己就是充當了調度員的角色。

本次實驗採用python完成,IDE是pycharm,python的queue庫文件很好的支持了我在優先權算法中對隊列的相關操作,python的operator庫文件,很好的提供了基於類的屬性按值排序的功能,這些在算法的編寫過程中否起到了很大的作用。

【附】實驗代碼

import operator
import random
import queue

Q = queue.Queue()  # 定義隊列
arr_jcb = []
ID = ['A', 'B', 'C', 'D']
T = 0
A=0
B=0


class JCB:
    def __init__(self, id, arriveTime, requestTime, startTime, finishTime, turnaroundTime, W_turnaroundTime, status):
        self.id = id  # 進程的id
        self.arriveTime = arriveTime  # 到達時間
        self.requestTime = requestTime  # 所需運行的時間
        self.startTime = startTime  # 開始時間
        self.finishTime = finishTime  # 結束時間
        self.turnaroundTime = turnaroundTime  # 週轉時間
        self.W_turnaroundTime = W_turnaroundTime  # 帶權週轉時間
        self.status = status  # 狀態
        self.ono = 0    # 響應比


def func():
    node = Q.get()
    if node.arriveTime > T:
        node.startTime = node.arriveTime
    else:
        node.startTime = T
    node.finishTime = node.startTime + node.requestTime
    node.turnaroundTime = node.finishTime - node.arriveTime
    node.W_turnaroundTime = node.turnaroundTime / node.requestTime
    node.status = 'finish'

    print('***執行算法***')
    for item in arr_jcb:
        print('進程{} 到達時間:{} 運行時間:{} 開始時間:{} 結束時間:{} 週轉時間:{} 帶權週轉時間:{} 狀態:{}'.format(item.id, item.arriveTime,item.requestTime, item.startTime,item.finishTime,item.turnaroundTime,item.W_turnaroundTime, item.status,item.status))
    return node.finishTime


for i in range(0, 4):
    arriveTime = random.randint(1, 10)  # 隨機生成到達時間
    requestTime = random.randint(1, 20)  # 隨機生成需要時間
    jcb = JCB(ID[i], arriveTime, requestTime, 0, 0, 0, 0, 'wait')
    jcb.ono=arriveTime/requestTime+1
    arr_jcb.append(jcb)



print('1、先來先服務算法fcfs算法\t2、最短作業優先算法sjf\t3、最高響應比優先算法hrn')
key = int(input('請輸入需要使用的算法編號:'))
if key==1:
    print('**********初始化生成4個進程**********')
    for item in arr_jcb:
        print('進程{} 到達時間:{} 運行時間:{} 開始時間:{} 結束時間:{} 週轉時間:{} 帶權週轉時間:{} 狀態:{}'.format(item.id, item.arriveTime,item.requestTime, item.startTime,item.finishTime,item.turnaroundTime,item.W_turnaroundTime, item.status,item.status))

    arr_jcb.sort(key=operator.attrgetter('arriveTime'))  # 按照狀態優先權重的值升序排列
    for item in arr_jcb:
        Q.put(item)
    arr_jcb.sort(key=operator.attrgetter('id'))  # 按照狀態優先權重的值升序排列
    for item in arr_jcb:
        T = func()

    print('***總結***')
    for item in arr_jcb:
        A += item.turnaroundTime
        B += item.W_turnaroundTime
    print('本次fcfs算法,平均週轉時間:', A / 4, '平均帶權週轉時間:', B / 4)
elif key==2:
    print('**********初始化生成4個進程**********')
    for item in arr_jcb:
        print('進程{} 到達時間:{} 運行時間:{} 開始時間:{} 結束時間:{} 週轉時間:{} 帶權週轉時間:{} 狀態:{}'.format(item.id, item.arriveTime,item.requestTime, item.startTime,item.finishTime,item.turnaroundTime,item.W_turnaroundTime, item.status,item.status))

    arr_jcb.sort(key=operator.attrgetter('requestTime'))  # 按照狀態優先權重的值升序排列
    for item in arr_jcb:
        Q.put(item)
    arr_jcb.sort(key=operator.attrgetter('id'))  # 按照狀態優先權重的值升序排列
    for item in arr_jcb:
        T = func()

    print('***總結***')
    for item in arr_jcb:
        A += item.turnaroundTime
        B += item.W_turnaroundTime
    print('本次sjf算法,平均週轉時間:', A / 4, '平均帶權週轉時間:', B / 4)
elif key==3:
    print('**********初始化生成4個進程**********')
    for item in arr_jcb:
        print('進程{} 到達時間:{} 運行時間:{} 開始時間:{} 結束時間:{} 週轉時間:{} 帶權週轉時間:{} 狀態:{}'.format(item.id, item.arriveTime,item.requestTime, item.startTime,item.finishTime,item.turnaroundTime,item.W_turnaroundTime, item.status,item.status))

    arr_jcb.sort(key=operator.attrgetter('ono'))  # 按照響應比的值升序排列
    for item in arr_jcb:
        Q.put(item)
    arr_jcb.sort(key=operator.attrgetter('id'))  # 按照狀態優先權重的值升序排列
    for item in arr_jcb:
        T = func()
    print('***總結***')
    for item in arr_jcb:
        A += item.turnaroundTime
        B += item.W_turnaroundTime
    print('本次hrn算法,平均週轉時間:', A / 4, '平均帶權週轉時間:', B / 4)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章