實驗二、作業調度模擬程序
一、 實驗目的
(1)加深對作業調度算法的理解;
(2)進行程序設計的訓練。
二、 實驗內容和要求
用高級語言編寫一個或多個作業調度的模擬程序。
單道批處理系統的作業調度程序。作業一投入運行,它就占有計算機的一切資源直到作業完成為止,因此調度作業時不必考慮它所需要的資源是否得到滿足,它所運行的時間等因素。
作業調度算法:
1) 采用先來先服務(FCFS)調度算法,即按作業到達的先后次序進行調度。總是首先調度在系統中等待時間最長的作業。
2) 短作業優先 (SJF) 調度算法,優先調度要求運行時間最短的作業。
3) 響應比高者優先(HRRN)調度算法,為每個作業設置一個優先權(響應比),調度之前先計算各作業的優先權,優先數高者優先調度。RP (響應比)= 作業周轉時間 / 作業運行時間=1+作業等待時間/作業運行時間
每個作業由一個作業控制塊JCB表示,JCB可以包含以下信息:作業名、提交(到達)時間、所需的運行時間、所需的資源、作業狀態、鏈指針等等。
作業的狀態可以是等待W(Wait)、運行R(Run)和完成F(Finish)三種之一。每個作業的最初狀態都是等待W。
(一)、模擬數據的生成
1. 允許用戶指定作業的個數(2-24),默認值為5。
2. 允許用戶選擇輸入每個作業的到達時間和所需運行時間。
3. (**)從文件中讀入以上數據。
4. (**)也允許用戶選擇通過偽隨機數指定每個作業的到達時間(0-30)和所需運行時間(1-8)。
(二)、模擬程序的功能
5. 按照模擬數據的到達時間和所需運行時間,執行FCFS, SJF和HRRN調度算法,程序計算各作業的開始執行時間,各作業的完成時間,周轉時間和帶權周轉時間(周轉系數)。
6. 動態演示每調度一次,更新現在系統時刻,處於運行狀態和等待各作業的相應信息(作業名、到達時間、所需的運行時間等)對於HRRN算法,能在每次調度時顯示各作業的響應比R情況。
7. (**)允許用戶在模擬過程中提交新作業。
8. (**)編寫並調度一個多道程序系統的作業調度模擬程序。 只要求作業調度算法:采用基於先來先服務的調度算法。 對於多道程序系統,要假定系統中具有的各種資源及數量、調度作業時必須考慮到每個作業的資源要求。
(三)、模擬數據結果分析
9. 對同一個模擬數據各算法的平均周轉時間,周轉系數比較。
10. (**)用曲線圖或柱形圖表示出以上數據,分析算法的優點和缺點。
(四)、其他要求
11. 完成報告書,內容完整,規格規范。
12. 實驗須檢查,回答實驗相關問題。
注:帶**號的條目表示選做內容。
根據指定的實驗課題,完成設計、編碼和調試工作,完成實驗報告。
三、 實驗方法、步驟及結果測試
- 1. 源程序名:壓縮包文件Operation.rar(rar或zip)中源程序名 Operation.java
原理分析及流程圖
流程圖
主要總體設計問題。
用戶輸入作業個數以及作業的信息,作業用一個類表示
用戶選擇其中一個調度算法,然后按那個調度算法算出作業的運行過程
用戶還可以對同一組作業,選擇不同的調度算法
用戶還可以重新輸入作業信息
菜單:
1--先來先服務
2--短作業優先
3--最高響應比優先算法
4--重新輸入任務
0--退出
- 2. 主要程序段及其解釋:
主要功能的程序段:
單道FCFS算法:
static void FCFS()//先來先服務調度算法
{
System.out.println("按先來先服務調度算法進行調度!!");
while((notnum>0)||(arrnum>0))
{ System.out.println("********************************************");
System.out.println("當前系統時間為:"+systemtime);
notarrtoarr(not,arr);
//pause
if(notnum>0)
{
System.out.println("還沒進入后備隊列的作業:");
print(not,notnum);
}
if(arrnum==0)
systemtime++;
if(arrnum>0)
{
System.out.println("\n進入后備隊列的作業:");
sortarr(arr,arrnum);
print(arr,arrnum);
running=arr[0];
for(int k=0;k<arrnum;k++)
arr[k]=arr[k+1];
arrnum--;
running.status='R';
running.starttime=systemtime;
running.endtime=(running.starttime)+(running.requtime);
running.zztime=(running.endtime)-(running.arrtime);
running.zzxs=Float.parseFloat(df.format((float)((running.zztime*1.0)/(running.requtime*1.0))));
System.out.println("\n處於運行的作業:"+running.jname);
System.out.println("運行中.......");
fin[finnum]=running;
fin[finnum].status='F';
finnum++;
systemtime=systemtime+running.requtime;
try {
System.in.read();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("\n已經完成的作業:");
printall(fin,finnum);
try {
System.in.read();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
單道SJPF算法:
static void SJPF()
{
System.out.println("按短作業優先調度算法進行調度!!");
while((notnum>0)||(arrnum>0))
{
System.out.println("********************************************");
System.out.println("當前系統時間為:"+systemtime);
notarrtoarr(not,arr);
//pause
if(notnum>0)
{
System.out.println("還沒進入后備隊列的作業:");
print(not,notnum);
}
if(arrnum==0)
systemtime++;
if(arrnum>0)
{
System.out.println("進入后備隊列的作業:");
sortrequ(arr,arrnum);
print(arr,arrnum);
running=arr[0];
for(int k=0;k<arrnum;k++)
{
arr[k]=arr[k+1];
}
arrnum--;
running.status='R';
running.starttime=systemtime;
running.endtime=(running.starttime)+(running.requtime);
running.zztime=(running.endtime)-(running.arrtime);
running.zzxs=Float.parseFloat(df.format((float)((running.zztime*1.0)/(running.requtime*1.0))));
System.out.println("處於運行的作業:"+running.jname);
System.out.println("運行中.......");
fin[finnum]=running;
finnum++;
systemtime=systemtime+running.requtime;
try {
System.in.read();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("已經完成的作業:");
printall(fin,finnum);
try {
System.in.read();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
單道HRRN算法:
static void HRRN()//最高響應比調度算法
{
System.out.println("按最高響應比調度算法進行調度!!");
while((notnum>0)||(arrnum>0))
{
System.out.println("********************************************");
System.out.println("當前系統時間為:"+systemtime);
notarrtoarr(not,arr);
//pause
if(notnum>0)
{
System.out.println("還沒進入后備隊列的作業:");
print(not,notnum);
}
if(arrnum==0)
systemtime++;
if(arrnum>0)
{
System.out.println("進入后備隊列的作業:");
sortrp(arr,arrnum);
print(arr,arrnum);
running=arr[0];
for(int k=0;k<arrnum;k++)
{
arr[k]=arr[k+1];
}
arrnum--;
running.status='R';
running.starttime=systemtime;
running.endtime=(running.starttime)+(running.requtime);
running.zztime=(running.endtime)-(running.arrtime);
running.zzxs=Float.parseFloat(df.format((float)((running.zztime*1.0)/(running.requtime*1.0))));
System.out.println("處於運行的作業:"+running.jname);
System.out.println("運行中.......");
fin[finnum]=running;
finnum++;
systemtime=systemtime+running.requtime;
try {
System.in.read();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("已經完成的作業:");
printall(fin,finnum);
try {
System.in.read();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
- 3. 運行結果及分析
結果符合預期及其分析。
程序執行:
輸入作業信息:
輸入完后出現菜單:
先來先服務作業;
可以繼續選擇另外一種調度方式:按回車繼續出現菜單
短作業優先
最高響應比優先
重新輸入數據:
退出:
四、 實驗總結
在這次的實驗里面,一開始自己完全不知道該怎么入手,對這幾種調度方法還是可以理解,但是要編寫模擬調度方法程序,其中的思路是很混亂的,后來老師給的C語言的例子,根據這個例子,大概知道是什么樣的思路,也能夠自己按照這樣的思路,寫下另外兩種方法,老師的方法我進行了修改,主要是排序的地方,在結構上也修改,現在的程序能有三種調度方法。
本來想再弄一個加入新作業,但是在添加時出錯了,所以就先不交那個版本,后面自己再進行更新。我覺得在編寫java,寫程序時最重要的時思路清晰,弄清楚要怎么走,要實現什么,遇到關卡也不能慌,要一步一步的走看是哪里出錯然后不斷地測試就可以找出錯誤的地方,然后繼續做下去。