描述:fcfs是最簡單的排程演算法,該演算法可用於作業排程,也可用於程序排程,當在作業排程中採用該演算法時,系統將按照作業到達的先後次序進行排程,或者說優先考慮在系統中等待時間最長的作業,而不管作業需要執行時間的長短,從後背作業佇列中選擇幾個最先進入該佇列的作業,將他們調入記憶體,為他們分配資源和建立程序,最後放入就緒佇列。
當在程序中採用該演算法時,每次排程從就緒的程序佇列中選擇乙個最先進入該佇列的程序,為之分配處理機,投入執行。該程序一直執行到完成或者發生某個時間阻塞時,程序排程將處理機分配給其他程序。
演算法實現:
// fsc.cpp : 此檔案包含 "main" 函式。程式執行將在此處開始並結束。
//#include "pch.h"
#include using namespace std;
int main()
for (int i = 0;i < counthomework;i++)//初始化
for (int j = 0;j < 5;j++)
arr[i][j] = 0;
double starttime, endtime;
cout << "請輸入開始時間和執行時間" << endl;
for (int i = 0;i < counthomework;i++)
//排序
double temp_1;
double temp_2;
for (int i = 0;i < counthomework;i++)
}} double currenttime;
currenttime = arr[0][1];
arr[0][3] = currenttime+arr[0][2];//作業完成時間
currenttime = arr[0][3];
arr[0][4] = currenttime-arr[0][1];//周轉時間
for (int i = 1;i < counthomework;i++)
cout << "程序號\t" << "開始時間\t" << "執行時間\t" <
for (int i = 0;i < counthomework;i++)
cout << endl;
}}
sjf演算法是以作業的長短來計算優先順序,作業越短優先順序越高,作業長短是以作業執行時間長短來衡量。sjf演算法可以分別用於作業排程和程序排程,再把短作業優先排程演算法用於作業排程時,它將外存的作業後背佇列中選擇若干個估計執行時間最短的作業,優先將他們調入記憶體。
缺點:(1)必須預知作業的執行時間,但一般很難**每個作業執行時間的長短,如果預計過低,系統就可能按估計時間終止作業的執行,但此時作業未完成,所以一般偏長估計。
(2)對長作業不利,長作業周轉時間明顯變長,該演算法完全忽視作業等待時間,可能使作業等待時間過長,出現飢餓現象。
(3)採用sjf演算法時,人機無法互動。
(4)該演算法沒有考慮作業的緊迫程度,所以不能保證緊迫的作業得到及時處理。
演算法實現:
#include "pch.h"
#include using namespace std;
int main()
for (int i = 0;i < processnumber;i++)//初始化
double starttime = 0.0, endtime = 0.0;
for (int i = 0;i < processnumber;i++)
double currenttime = array[0][1];//初始化當前時間,執行第乙個程序
array[0][3] = currenttime + array[0][2];
currenttime += array[0][2];//當前時間,執行完第乙個程序
array[0][4] = currenttime - array[0][1];
array[0][0] = 1;
double temp = 0;
//排序
for (int i = 1;i < processnumber;i++)
}} int count = 1;
while (count < processnumber)
} }for (int i = 0;i < processnumber;i++)
cout << "程序號\t" << "開始時間\t" <
for (int i = 0;i < processnumber;i++)
}
我們可以這樣理解優先順序,對於先來先服務演算法,作業的等待時間就是其優先順序,等待時間越長,優先順序越高。對於短作業排程演算法,作業所需執行時間越短優先順序越高。
在批處理系統中,短作業優先演算法是一種比較好的演算法,其主要的不足之處是長作業 的執行得不到保證。如果我們能為每個作業引入前面所述的動態優先權,並使作業的優先 級隨著等待時間的增加而以速率 a 提高,則長作業在等待一定的時間後,必然有機會分配 到處理機。該優先權的變化規律可描述為:
優先權=(要求服務時間 等待時間)/ 要求服務時間 , 由於等待時間與服務時間之和就是系統對該作業的響應時間,故該優先權又相當於響 應比 rp。據此,又可表示為:
rp=(要求服務時間 等待時間)/ 要求服務時間 = 響應時間 /要求服務時間 ,由上式可以看出:
(1) 如果作業的等待時間相同,則要求服務的時間愈短,其優先權愈高,因而該演算法有 利於短作業。
(2) 當要求服務的時間相同時,作業的優先權決定於其等待時間,等待時間愈長,其優 先權愈高,因而它實現的是先來先服務。 (3) 對於長作業,作業的優先順序可以隨等待時間的增加而提高,當其等待時間足夠長時, 其優先順序便可公升到很高,從而也可獲得處理機。 簡言之,該演算法既照顧了短作業,又考慮了作業到達的先後次序,不會使長作業長期 得不到服務。因此,該演算法實現了一種較好的折衷。當然,在利用該演算法時,每要進行調 第三章 處理機排程與死鎖 ·95· 度之前,都須先做響應比的計算,這會增加系統開銷。
#include"pch.h"
#includeusing namespace std;
int main()
for (int i = 0;i < jobnum;i++)
for (int j = 0;j < 5;j++)
arr[i][j] = 0;
double starttime = 0, runningtime = 0;
cout << "請輸入開始時間和執行時間" << endl;
for (int i = 0;i < jobnum;i++)//輸入時間
//初始化
double currenttime = arr[0][1];//初始化當前時間
arr[0][3] = arr[0][1] + arr[0][2];//完成時間
currenttime = arr[0][3];
arr[0][4] = currenttime - arr[0][1];//周轉時間
cout << currenttime << endl; arr[0][0] = 1;//作為標誌
int count = 1;
double priority = 0;//定義優先順序
while (count < jobnum)
}} arr[i_job][3] = arr[i_job][2]+currenttime;//記錄作業完成時間
currenttime += arr[i_job][2];//執行作業儲存當前時間
arr[i_job][4] = currenttime - arr[i_job][1];//記錄周轉時間
arr[i_job][0] = 1;
count++;
} cout << "作業號\t" << "開始時間\t" << "執行時間\t" << "結束時間\t" << "周轉時間" << "\t" << endl;
for (int i = 0;i < jobnum;i++)
}
處理機排程
如果沒有處理機排程,則意味著必須等待當前程序執行完畢後下一程序才能執行,而程序常需等待外設的輸入,i o的速度相比處理機是非常慢的,因此這會對處理機資源造成嚴重浪費。引入排程後,可在執行程序等待輸入時把處理機排程給其他程序,從而提高處理機的利用率。作業排程 高階 在外存的作業中挑選乙個或多個作業,給...
處理機排程
多道程式系統中,程序的數量往往多於處理機的個數,程序爭用處理機的情況在所難免。處理機排程是對處理機進行分配,即從就緒佇列中按照一定的演算法選擇乙個程序並將處理機分配給它執行,以實現程序併發執行。乙個作業從提交到完成,經歷以下 排程 作業排程 從外存中選擇乙個或多個作業,分配記憶體 輸入 輸出等必要資...
處理機排程
又稱高階排程,其主要任務是按一定的原則從外存上處於後備狀態的作業中挑選乙個或多個作業,給它分配記憶體 輸入 輸出裝置等必要的資源,並建立相應的程序,以使它獲得競爭處理機的權利。記憶體與輔存之間的排程。每個作業只調入一次 調出一次。提高記憶體利用率和系統吞吐量。使暫時不能執行的程序,調至外存等待,把此...