模擬實(shí)現(xiàn)磁盤調(diào)算法_第1頁(yè)
模擬實(shí)現(xiàn)磁盤調(diào)算法_第2頁(yè)
模擬實(shí)現(xiàn)磁盤調(diào)算法_第3頁(yè)
模擬實(shí)現(xiàn)磁盤調(diào)算法_第4頁(yè)
模擬實(shí)現(xiàn)磁盤調(diào)算法_第5頁(yè)
已閱讀5頁(yè),還剩6頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、操作系統(tǒng)課程實(shí)驗(yàn) 實(shí)驗(yàn)課題:模擬實(shí)現(xiàn)磁盤調(diào)度算法 姓 名:* 學(xué) 號(hào):* 年級(jí)班級(jí):08級(jí)信息與計(jì)算科學(xué) 教學(xué)班級(jí):操作系統(tǒng) 專業(yè)方向:08信本軟件方向 指導(dǎo)教師: 實(shí)驗(yàn)時(shí)間:2010-12-9 一、實(shí)驗(yàn)名稱:模擬實(shí)現(xiàn)磁盤調(diào)度算法1 實(shí)驗(yàn)?zāi)康模篴、觀察、體會(huì)操作系統(tǒng)的磁盤調(diào)度方法,并通過(guò)一個(gè)簡(jiǎn)單的磁盤調(diào)度模擬程序的實(shí)現(xiàn),加深對(duì)磁盤調(diào)度的理解。b、提高實(shí)際動(dòng)手編程能力,為日后從事軟件開(kāi)發(fā)工作打下堅(jiān)實(shí)基礎(chǔ)。2 實(shí)驗(yàn)要求:a、使用模塊化設(shè)計(jì)思想來(lái)設(shè)計(jì)。b、給出主函數(shù)和各個(gè)算法函數(shù)的流程圖。c、學(xué)生可按照自身?xiàng)l件,隨意選擇采用的算法。二、 實(shí)驗(yàn)算法分析 總流程圖 三、 實(shí)驗(yàn)內(nèi)容及實(shí)驗(yàn)步驟 1 實(shí)驗(yàn)內(nèi)容

2、a、模擬實(shí)現(xiàn)磁盤調(diào)度算法:FCFS,最短尋道優(yōu)先,電梯算法(實(shí)現(xiàn)其中之一種以上)。b、磁道請(qǐng)求服務(wù)順序由用戶輸入(可通過(guò)從指定的文本文件(TXT文件)中取出)。 2 實(shí)驗(yàn)步驟1) 打開(kāi)microsoft vasual C+ 6.0“開(kāi)始”菜單 所有程序單擊“microsoft vasual C+ 6.0”,進(jìn)入創(chuàng)建頁(yè)面。2)單擊標(biāo)題欄“文件”選擇“新建”進(jìn)入界面如下: 選擇工程,win32 console application編輯工程名稱zhuxuemin4存儲(chǔ)在d盤,創(chuàng)建創(chuàng)建新工作區(qū)確定。3)創(chuàng)建文件:?jiǎn)螕魳?biāo)題欄“文件”選擇“新建”進(jìn)入界面類似于上面的界面。4)在建好的文件中加入附件中的源

3、程序,并進(jìn)行編譯。四、 實(shí)驗(yàn)原始記錄及結(jié)果分析1 先來(lái)先服務(wù)調(diào)度算法2 最短尋道優(yōu)先調(diào)度算法3 電梯調(diào)度算法五、 參考代碼#include<stdio.h> #include<iostream.h>#include<string.h>#include<math.h> const int MAXQUEUE=200; /定義請(qǐng)求隊(duì)列最大長(zhǎng)度/磁道號(hào)請(qǐng)求結(jié)構(gòu)體定義 typedef struct TRACK_Node int iGo;/要訪問(wèn)的磁道號(hào)int iVisited;/磁道是否已經(jīng)訪問(wèn)標(biāo)志(1:已訪問(wèn);0:末訪問(wèn))TRACK; TRACK que

4、ueMAXQUEUE; /磁道號(hào)請(qǐng)求隊(duì)列數(shù)組int iReqNum=0;/磁道訪問(wèn)請(qǐng)求數(shù)int iStart=0;/磁頭初始位置int iNow=0;/磁頭當(dāng)前位置int iSum=0;/總移動(dòng)磁道數(shù)int iInput;/用戶當(dāng)前輸入的整數(shù)char sFileName20;/文件名void Init()/初始化函數(shù)int i; for(i=0;i<MAXQUEUE;i+) queuei.iGo=-1;/設(shè)置要訪問(wèn)的磁道號(hào)為不可能的數(shù)-1,以區(qū)別正常請(qǐng)求磁道號(hào)queuei.iVisited=0;/設(shè)置磁道是否已經(jīng)訪問(wèn)標(biāo)志為0:末訪問(wèn) /void Init()void Reset()/重置

5、訪問(wèn)標(biāo)志、磁頭當(dāng)前位置、總移動(dòng)磁道數(shù)int i; for(i=0;i<iReqNum;i+) queuei.iVisited=0; /設(shè)置磁道是否已經(jīng)訪問(wèn)標(biāo)志為0:末訪問(wèn) printf( "n請(qǐng)輸入磁頭的初始磁道號(hào)(整數(shù)): "); scanf("%d",&iStart);/從標(biāo)準(zhǔn)輸入獲取用戶當(dāng)前輸入的磁頭初始位置iNow=iStart;/磁頭當(dāng)前位置iSum=0;/總移動(dòng)磁道數(shù) /void Reset()int ReadTrackFile() /讀入磁道號(hào)流文件 FILE *fp; int iTemp; cout<<"

6、;n請(qǐng)輸入磁道號(hào)流(文本)文件名(注意:包括后綴名): "cin>>sFileName; /從標(biāo)準(zhǔn)輸入獲取用戶當(dāng)前輸入的文件名if(fp=fopen(sFileName,"r")=NULL) cout<<endl<<"錯(cuò)誤:磁道號(hào)流文件 "<<sFileName<<" 打不開(kāi),請(qǐng)檢查文件名和路徑!"<<endl;return -1; else while(!feof(fp)/將文件中輸入的磁道號(hào)依次存入磁道號(hào)請(qǐng)求隊(duì)列數(shù)組 fscanf(fp,"

7、%d ",&iTemp); queueiReqNum.iGo=iTemp; iReqNum+;/磁道訪問(wèn)請(qǐng)求數(shù) /if(fp=fopen(sFileName,"r")=NULL)return 0; /void ReadTrackFile()void FCFS() /先來(lái)先服務(wù)調(diào)度算法int i; Reset();/重置訪問(wèn)標(biāo)志、磁頭當(dāng)前位置、總移動(dòng)磁道數(shù)cout<<endl<<"-"<<endl; cout<<"先來(lái)先服務(wù)調(diào)度算法的調(diào)度結(jié)果: "<<endl

8、<<endl; cout<<" 初始磁道號(hào): "<<iStart<<endl; cout<<"序號(hào) 下一磁道號(hào) 移動(dòng)的磁道數(shù)"<<endl; for(i=0;i<iReqNum;i+) cout<<" "<<i+1<<" "<<queuei.iGo<<" "<<abs(queuei.iGo-iNow)<<endl;iSum+=abs(q

9、ueuei.iGo-iNow);/累加總移動(dòng)磁道數(shù)iNow=queuei.iGo;/設(shè)置磁頭當(dāng)前位置為當(dāng)前訪問(wèn)磁道號(hào) cout<<endl<<"總調(diào)度次數(shù): "<<iReqNum<<endl;cout<<endl<<"總移動(dòng)磁道數(shù): "<<iSum<<endl;printf("n平均移動(dòng)磁道數(shù): %.2fnn",(float)iSum / (float)iReqNum); /void FCFS()void SSTF() /最短尋道優(yōu)先調(diào)度算

10、法 int i,j;int iNext;/下一磁道號(hào)Reset();/重置訪問(wèn)標(biāo)志、磁頭當(dāng)前位置、總移動(dòng)磁道數(shù)cout<<endl<<"-"<<endl;cout<<endl<<"-"<<endl; cout<<"最短尋道優(yōu)先調(diào)度算法的調(diào)度結(jié)果: "<<endl<<endl;cout<<" 初始磁道號(hào): "<<iStart<<endl; cout<<"

11、序號(hào) 下一磁道號(hào) 移動(dòng)的磁道數(shù)"<<endl; for(i=0;i<iReqNum;i+) iNext=0; while(queueiNext.iVisited!=0)/跳過(guò)已訪問(wèn)的磁道號(hào) iNext+; /whilefor(j=iNext;j<iReqNum;j+)/尋找下一個(gè)尋道距離最短的末訪問(wèn)磁道號(hào)if(queuej.iVisited=0)&&(abs(iNow-queueiNext.iGo)>abs(iNow-queuej.iGo) iNext=j; /for(j=iNext;j<iReqNum;j+)cout<<

12、;" "<<i+1<<" "<<queueiNext.iGo<<" "<<abs(queueiNext.iGo-iNow)<<endl;iSum+=abs(queueiNext.iGo-iNow); /累加總移動(dòng)磁道數(shù)queueiNext.iVisited=1;/設(shè)置磁道是否已經(jīng)訪問(wèn)標(biāo)志為1:已訪問(wèn) iNow=queueiNext.iGo; /設(shè)置磁頭當(dāng)前位置為當(dāng)前訪問(wèn)磁道號(hào) /for(i=0;i<iReqNum;i+)cout<<endl<

13、;<"總調(diào)度次數(shù): "<<iReqNum<<endl;cout<<endl<<"總移動(dòng)磁道數(shù): "<<iSum<<endl;printf("n平均移動(dòng)磁道數(shù): %.2fnn",(float)iSum / (float)iReqNum); /void SSTF()void SCAN()/電梯調(diào)度算法 int i,j; int iNext;/下一磁道號(hào) int iMinMove;/當(dāng)前方向上最短尋道距離cout<<endl<<"

14、-"<<endl; cout<<endl<<"請(qǐng)選擇磁頭初始方向(1 OR 2):"<<endl<<endl;cout<<"1 磁頭初始向內(nèi)"<<endl<<endl<<"2 磁頭初始向外"<<endl<<endl<<""cin>>iInput;/從標(biāo)準(zhǔn)輸入獲取用戶當(dāng)前輸入的整數(shù)switch(iInput)/用戶當(dāng)前輸入的整數(shù)case 1:/磁頭初始向

15、內(nèi)Reset();/重置訪問(wèn)標(biāo)志、磁頭當(dāng)前位置、總移動(dòng)磁道數(shù)cout<<endl<<"-"<<endl; cout<<"電梯調(diào)度算法-磁頭初始向內(nèi)的調(diào)度結(jié)果: "<<endl<<endl; cout<<" 初始磁道號(hào): "<<iStart<<endl; cout<<"序號(hào) 下一磁道號(hào) 移動(dòng)的磁道數(shù)"<<endl; for(i=0;i<iReqNum;i+)iMinMove=999

16、9; iNext=-1; for(j=0;j<iReqNum;j+)/尋找當(dāng)前方向上尋道距離最短的末訪問(wèn)磁道號(hào) if(queuej.iVisited=0)&&(queuej.iGo>=iNow)if(abs(queuej.iGo-iNow)<iMinMove) iNext=j; iMinMove=abs(queuej.iGo-iNow); /if(abs(queuej.iGo-iNow)<iMinMove) /if(queuej.iVisited=0)&&(queuej.iGo>=iNow) /for(j=0;j<iReqNu

17、m;j+)if(iNext!=-1)cout<<" "<<i+1<<" "<<queueiNext.iGo<<" "<<abs(queueiNext.iGo-iNow)<<endl;iSum+=abs(queueiNext.iGo-iNow); /累加總移動(dòng)磁道數(shù)iNow=queueiNext.iGo;/設(shè)置磁頭當(dāng)前位置為當(dāng)前訪問(wèn)磁道號(hào)queueiNext.iVisited=1;/設(shè)置磁道是否已經(jīng)訪問(wèn)標(biāo)志為1:已訪問(wèn) /if(iNext!=-1)els

18、e/掉頭向外 for(j=0;j<iReqNum;j+)/尋找當(dāng)前方向上尋道距離最短的末訪問(wèn)磁道號(hào) if(queuej.iVisited=0)&&(queuej.iGo<iNow) if(abs(queuej.iGo-iNow)<iMinMove)iNext=j; iMinMove=abs(queuej.iGo-iNow); /for(j=0;j<iReqNum;j+)cout<<" "<<i+1<<" "<<queueiNext.iGo<<"

19、"<<abs(queueiNext.iGo-iNow)<<endl;iSum+=abs(queueiNext.iGo-iNow); /累加總移動(dòng)磁道數(shù)iNow=queueiNext.iGo; /設(shè)置磁頭當(dāng)前位置為當(dāng)前訪問(wèn)磁道號(hào)queueiNext.iVisited=1;/設(shè)置磁道是否已經(jīng)訪問(wèn)標(biāo)志為1:已訪問(wèn) /if(iNext!=-1) /for(i=0;i<iReqNum;i+)cout<<endl<<"總調(diào)度次數(shù): "<<iReqNum<<endl;cout<<endl&

20、lt;<"總移動(dòng)磁道數(shù): "<<iSum<<endl;printf("n平均移動(dòng)磁道數(shù): %.2fnn",(float)iSum / (float)iReqNum);break;case 2:/磁頭初始向外 Reset();/重置訪問(wèn)標(biāo)志、磁頭當(dāng)前位置、總移動(dòng)磁道數(shù)cout<<endl<<"-"<<endl;cout<<endl<<endl<<"電梯調(diào)度算法-磁頭初始向外的調(diào)度結(jié)果: "<<endl&l

21、t;<endl; cout<<" 初始磁道號(hào): "<<iStart<<endl; cout<<"序號(hào) 下一磁道號(hào) 移動(dòng)的磁道數(shù)"<<endl; for(i=0;i<iReqNum;i+) iMinMove=9999; iNext=-1; for(j=0;j<iReqNum;j+)/尋找當(dāng)前方向上尋道距離最短的末訪問(wèn)磁道號(hào)if(queuej.iVisited=0)&&(queuej.iGo<=iNow) if(abs(queuej.iGo-iNow)<

22、iMinMove) iNext=j; iMinMove=abs(queuej.iGo-iNow); /if(abs(queuej.iGo-iNow)<iMinMove) /if(queuej.iVisited=0)&&(queuej.iGo<=iNow) /for(j=0;j<iReqNum;j+)if(iNext!=-1) cout<<" "<<i+1<<" "<<queueiNext.iGo<<" "<<abs(queueiN

23、ext.iGo-iNow)<<endl;iSum+=abs(queueiNext.iGo-iNow);/累加總移動(dòng)磁道數(shù)iNow=queueiNext.iGo;/設(shè)置磁頭當(dāng)前位置為當(dāng)前訪問(wèn)磁道號(hào)queueiNext.iVisited=1;/設(shè)置磁道是否已經(jīng)訪問(wèn)標(biāo)志為1:已訪問(wèn) else/掉頭向內(nèi) for(j=0;j<iReqNum;j+)/尋找當(dāng)前方向上尋道距離最短的末訪問(wèn)磁道號(hào) if(queuej.iVisited=0)&&(queuej.iGo>iNow) if(abs(queuej.iGo-iNow)<iMinMove) iNext=j; i

24、MinMove=abs(queuej.iGo-iNow); /if(abs(queuej.iGo-iNow)<iMinMove)/if(queuej.iVisited=0)&&(queuej.iGo>iNow)/for(j=0;j<iReqNum;j+)cout<<" "<<i+1<<" "<<queueiNext.iGo<<" "<<abs(queueiNext.iGo-iNow)<<endl;iSum+=abs(q

25、ueueiNext.iGo-iNow); /累加總移動(dòng)磁道數(shù)iNow=queueiNext.iGo; /設(shè)置磁頭當(dāng)前位置為當(dāng)前訪問(wèn)磁道號(hào)queueiNext.iVisited=1;/設(shè)置磁道是否已經(jīng)訪問(wèn)標(biāo)志為1:已訪問(wèn) /if(iNext!=-1)/for(i=0;i<iReqNum;i+)cout<<endl<<"總調(diào)度次數(shù): "<<iReqNum<<endl;cout<<endl<<"總移動(dòng)磁道數(shù): "<<iSum<<endl;printf(&quo

26、t;n平均移動(dòng)磁道數(shù): %.2fnn",(float)iSum / (float)iReqNum);break;default:printf("n輸入錯(cuò)誤!nn");return;/switch(iInput) /void SCAN()void Version()/顯示版權(quán)信息函數(shù) cout<<endl<<endl; cout<<" "<<endl;cout<<" 磁盤調(diào)度算法模擬系統(tǒng) "<<endl;cout<<" "&

27、lt;<endl;cout<<" (c)All Right Reserved "<<endl;cout<<" 程 坤 "<<endl;cout<<" Version 2010 build 2.0 "<<endl;cout<<" "<<endl;cout<<endl<<endl; / void Version()void main() int i; bool bGoOn;/是否繼續(xù)磁盤調(diào)度算法

28、模擬的標(biāo)志char sGoOn1;/用戶輸入是否繼續(xù)磁盤調(diào)度算法模擬的字母:y、Y、N、nVersion();/顯示版權(quán)信息函數(shù)Init();/初始化函數(shù)if(ReadTrackFile()=-1) /讀入磁道號(hào)流文件printf("讀入磁道號(hào)流文件失敗!nn");elsebGoOn= true;while (bGoOn)cout<<endl<<"-"<<endl;cout<<"從磁道號(hào)流文件 "<<sFileName<<" 所讀入的磁道號(hào)流如下:"<

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論