操作系統(tǒng)實驗四 磁盤調度算法_第1頁
操作系統(tǒng)實驗四 磁盤調度算法_第2頁
操作系統(tǒng)實驗四 磁盤調度算法_第3頁
操作系統(tǒng)實驗四 磁盤調度算法_第4頁
操作系統(tǒng)實驗四 磁盤調度算法_第5頁
已閱讀5頁,還剩8頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、操作系統(tǒng)實驗四 磁盤調度算法實驗四 磁盤調度一、實驗目的:本實驗要求學生模擬設計一個磁盤調度程序,觀察調度程序的動態(tài)運行過程。通過實驗讓學生理解和掌握磁盤調度的職能。二、實驗內容:對磁盤進行移臂操作,模擬磁盤調度算法并計算平均尋道時間三、實驗準備:1.相關理論知識:(1)假設磁盤只有一個盤面,并且磁盤是可移動頭磁盤。(3)磁盤是高速、大容量、旋轉型、可直接存取的存儲設備。它作為計算機系統(tǒng)的輔助存儲器,擔負著繁重的輸入輸出工作,在現(xiàn)代計算機系統(tǒng)中往往同時會有若干個要求訪問磁盤的輸入輸出要求。系統(tǒng)可采用一種策略,盡可能按最佳次序執(zhí)行訪問磁盤的請求。由于磁盤訪問時間主要受尋道時間T的影響,為此需要采

2、用合適的尋道算法,以降低尋道時間。(2)磁盤是可供多個進程共享的存儲設備,但一個磁盤每個時刻只能為一個進程服務。當有進程在訪問某個磁盤時,其它想訪問該磁盤的進程必須等待,直到磁盤一次工作結束。當有多個進程提出輸入輸出請求而處于等待狀態(tài)時,可用磁盤調度算法從若干個等待訪問者中選擇一個進程,讓它訪問磁盤。2.測試數據:磁盤讀寫請求隊列:20,44,40,4,80,12,76當前磁頭位置:50 試問采用FCFS、SSTF、SCAN磁盤調度算法時尋道順序及平均尋道時間分別為多少? 四、實驗過程:1.流程圖 SCAN算法(掃描算法)流程圖:求平均尋道長度選擇移動臂移動方向,開始掃描移動到最?。ù螅┨枺?/p>

3、向外(內)移動掃描未掃描的磁道輸出移動的平均磁道數輸出排好序的磁道序列開始結束輸入磁道號使用冒泡法從小到大排序輸入當前磁道號判斷當前磁頭在序列中的位置2. 源代碼#include<stdio.h>#include<stdlib.h>#include<iostream.h>#include<math.h>#define maxsize 1000/*判斷輸入數據是否有效*/int decide(char str) /判斷輸入數據是否有效 int i=0;while(stri!='0') if(stri<'0'|s

4、tri>'9')return 0;break;i+;return i;/*將字符串轉換成數字*/int trans(char str,int a) /將字符串轉換成數字int i;int sum=0;for(i=0;i<a;i+)sum=sum+(int)(stri-'0')*pow(10,a-i-1);return sum;/*冒泡排序算法*/int *bubble(int cidao,int m) int i,j;int temp; for(i=0;i<m;i+) /使用冒泡法按從小到大順序排列 for(j=i+1;j<m;j+) i

5、f(cidaoi>cidaoj) temp=cidaoi; cidaoi=cidaoj; cidaoj=temp; cout<<"排序后的磁盤序列為:" for( i=0;i<m;i+) /輸出排序結果 cout<<cidaoi<<" " cout<<endl; return cidao; /*先來先服務調度算法*/void FCFS(int cidao,int m) /磁道號數組,個數為m int now;/當前磁道號 int sum=0; /總尋道長度 int j,i;int a;char

6、str100; float ave; /平均尋道長度cout<<"磁盤請求序列為:" for( i=0;i<m;i+) /按先來先服務的策略輸出磁盤請求序列 cout<<cidaoi<<" " cout<<endl; cout<<"請輸入當前的磁道號:" B: cin>>str; /對輸入數據進行有效性判斷 a=decide(str); if(a=0) cout<<"輸入數據的類型錯誤,請重新輸入!"<<endl;

7、 goto B; else now=trans(str,a); /輸入當前磁道號 sum+=abs(cidao0-now);cout<<"磁盤掃描序列為:" for( i=0;i<m;i+) /輸出磁盤掃描序列 cout<<cidaoi<<" " for(i=0,j=1;j<m;i+,j+) /求平均尋道長度 sum+=abs(cidaoj-cidaoi); ave=(float)(sum)/(float)(m); cout<<endl; cout<<"平均尋道長度:&qu

8、ot;<<ave<<endl;/*最短尋道時間優(yōu)先調度算法*/void SSTF(int cidao,int m) int k=1; int now,l,r; int i,j,sum=0; int a; char str100; float ave; cidao=bubble(cidao,m); /調用冒泡排序算法排序 cout<<"請輸入當前的磁道號:" C: cin>>str; /對輸入數據進行有效性判斷 a=decide(str); if(a=0) cout<<"輸入數據的類型錯誤,請重新輸入!&q

9、uot;<<endl; goto C; else now=trans(str,a); /輸入當前磁道號 if(cidaom-1<=now) /若當前磁道號大于請求序列中最大者,則直接由外向內依次給予各請求服務 cout<<"磁盤掃描序列為:" for(i=m-1;i>=0;i-) cout<<cidaoi<<" " sum=now-cidao0; if(cidao0>=now) /若當前磁道號小于請求序列中最小者,則直接由內向外依次給予各請求服務 cout<<"磁盤掃

10、描序列為:" for(i=0;i<m;i+) cout<<cidaoi<<" " sum=cidaom-1-now; if(now>cidao0&&now<cidaom-1) /若當前磁道號大于請求序列中最小者且小于最大者 cout<<"磁盤掃描序列為:" while(cidaok<now) /確定當前磁道在已排的序列中的位置,后面的算法都用到了,可以直接復制后少量修改,節(jié)省時間。 k+; l=k-1; r=k; while(l>=0)&&(r&l

11、t;m) /當前磁道在請求序列范圍內 if(now-cidaol)<=(cidaor-now) /選擇與當前磁道最近的請求給予服務 cout<<cidaol<<" " sum+=now-cidaol; now=cidaol; l=l-1; else cout<<cidaor<<" " sum+=cidaor-now; now=cidaor; r=r+1; if(l=-1) /磁頭移動到序列的最小號,返回外側掃描仍未掃描的磁道 for(j=r;j<m;j+) cout<<cidaoj&

12、lt;<" " sum+=cidaom-1-cidao0; else /磁頭移動到序列的最大號,返回內側掃描仍未掃描的磁道 for(j=l;j>=0;j-) cout<<cidaoj<<" " sum+=cidaom-1-cidao0; ave=(float)(sum)/(float)(m); cout<<endl; cout<<"平均尋道長度: "<<ave<<endl;/*掃描調度算法*/void SCAN(int cidao,int m) /先要

13、給出當前磁道號和移動臂的移動方向 int k=1; int now,l,r,d; int i,j,sum=0; int a; char str100; float ave; cidao=bubble(cidao,m); /調用冒泡排序算法排序 cout<<"請輸入當前的磁道號:"D: cin>>str; /對輸入數據進行有效性判斷 a=decide(str); if(a=0) cout<<"輸入數據的類型錯誤,請重新輸入!"<<endl; goto D; else now=trans(str,a); /輸入

14、當前磁道號 if(cidaom-1<=now) /若當前磁道號大于請求序列中最大者,則直接由外向內依次給予各請求服務,此情況同最短尋道優(yōu)先 cout<<"磁盤掃描序列為:" for(i=m-1;i>=0;i-) cout<<cidaoi<<" " sum=now-cidao0; if(cidao0>=now) /若當前磁道號小于請求序列中最小者,則直接由內向外依次給予各請求服務,此情況同最短尋道優(yōu)先 cout<<"磁盤掃描序列為:" for(i=0;i<m;i+)

15、 cout<<cidaoi<<" " sum=cidaom-1-now; if(now>cidao0&&now<cidaom-1) /若當前磁道號大于請求序列中最小者且小于最大者 while(cidaok<now) k+; l=k-1; r=k; cout<<"請輸入當前移動臂的移動的方向 (1 表示向外 ,0表示向內) : " cin>>d; if(d=0) /選擇移動臂方向向內,則先向內掃描 cout<<"磁盤掃描序列為:" for(j=

16、l;j>=0;j-) cout<<cidaoj<<" " /輸出向內掃描的序列 for(j=r;j<m;j+) /磁頭移動到最小號,則改變方向向外掃描未掃描的磁道 cout<<cidaoj<<" " /輸出向外掃描的序列 sum=now-2*cidao0+cidaom-1; else /選擇移動臂方向向外,則先向外掃描 cout<<"磁盤掃描序列為:" for(j=r;j<m;j+) cout<<cidaoj<<" &quo

17、t; /輸出向外掃描的序列 for(j=l;j>=0;j-) /磁頭移動到最大號,則改變方向向內掃描未掃描的磁道 cout<<cidaoj<<" " sum=-now-cidao0+2*cidaom-1; ave=(float)(sum)/(float)(m); cout<<endl; cout<<"平均尋道長度: "<<ave<<endl;/*循環(huán)掃描調度算法*/void CSCAN(int cidao,int m) int k=1; int now,l,r; int i,j

18、,sum=0; int a; char str100; float ave; cidao=bubble(cidao,m); /調用冒泡排序算法排序 cout<<"請輸入當前的磁道號:" E: cin>>str; /對輸入數據進行有效性判斷 a=decide(str); if(a=0) cout<<"輸入數據的類型錯誤,請重新輸入!"<<endl; goto E; else now=trans(str,a); /輸入當前磁道號 if(cidaom-1<=now) /若當前磁道號大于請求序列中最大者,則直

19、接將移動臂移動到最小號磁道依次向外給予各請求服務 cout<<"磁盤掃描序列為:" for(i=0;i<m;i+) cout<<cidaoi<<" " sum=now-2*cidao0+cidaom-1; if(cidao0>=now) /若當前磁道號小于請求序列中最小者,則直接由內向外依次給予各請求服務,此情況同最短尋道優(yōu)先 cout<<"磁盤掃描序列為:" for(i=0;i<m;i+) cout<<cidaoi<<" "

20、 sum=cidaom-1-now; if(now>cidao0&&now<cidaom-1) /若當前磁道號大于請求序列中最小者且小于最大者 cout<<"磁盤掃描序列為:" while(cidaok<now) /單向反復地從內向外掃描 k+; l=k-1; r=k; for(j=r;j<m;j+) cout<<cidaoj<<" " /輸出從當前磁道向外掃描的序列 for(j=0;j<r;j+) /當掃描完最大號磁道,磁頭直接移動到最小號磁道,再向外掃描未掃描的磁道 c

21、out<<cidaoj<<" " sum=2*cidaom-1+cidaol-now-2*cidao0; ave=(float)(sum)/(float)(m); cout<<endl; cout<<"平均尋道長度: "<<ave<<endl;void main() int a; int c; /菜單項 int cidaomaxsize; int i=0,count; char str100; cout<<"請輸入磁道序列(0結束):"<<

22、endl; A:cin>>str; /對輸入數據進行有效性判斷 a=decide(str); if(a=0) cout<<"輸入數據的類型錯誤,請重新輸入!"<<endl; goto A;/輸入錯誤,跳轉到A,重新輸入 else cidaoi=trans(str,a); i+; while(cidaoi-1!=0) cin>>str; /對輸入數據進行有效性判斷 a=decide(str); if(a=0) cout<<"輸入數據的類型錯誤,請重新輸入!"<<endl; else c

23、idaoi=trans(str,a); i+; count=i-1; /要訪問的磁道數 cout<<"你輸入的磁道序列為:" for(i=0;i<count;i+) cout<<cidaoi<<" " /輸出磁道序列 cout<<endl; while(1) cout<<endl; cout<<"*"<<endl; cout<<" 系統(tǒng)菜單 "<<endl;cout<<"* *&q

24、uot;<<endl;cout<<"* 1. 先來先服務 *"<<endl;cout<<"* *"<<endl;cout<<"* 2. 最短尋道時間優(yōu)先 *"<<endl;cout<<"* *"<<endl;cout<<"* 3. 掃描調度 *"<<endl;cout<<"* *"<<endl;cout<<"* 4. 循環(huán)掃描 *&q

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論