操作系統(tǒng)課設(shè)報(bào)告磁盤調(diào)度算法_第1頁
操作系統(tǒng)課設(shè)報(bào)告磁盤調(diào)度算法_第2頁
操作系統(tǒng)課設(shè)報(bào)告磁盤調(diào)度算法_第3頁
操作系統(tǒng)課設(shè)報(bào)告磁盤調(diào)度算法_第4頁
操作系統(tǒng)課設(shè)報(bào)告磁盤調(diào)度算法_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

-.z.課程設(shè)計(jì)報(bào)告課程名稱:操作系統(tǒng)課程設(shè)計(jì)課題名稱:磁盤調(diào)度算法學(xué)院:軟件學(xué)院班級(jí):學(xué)生**:**:指導(dǎo)教師:磁盤調(diào)度算法一、系統(tǒng)需求分析磁盤存儲(chǔ)器不僅容量大,存取速度快,而且可以實(shí)現(xiàn)隨機(jī)存取,是當(dāng)前存放大量程序和數(shù)據(jù)的理想設(shè)備。所以在現(xiàn)代計(jì)算機(jī)中都配備了磁盤存儲(chǔ)器,以他為主存放文件,這樣對(duì)文件的讀、寫操作都涉及到了對(duì)磁盤存儲(chǔ)器的訪問。磁盤I/O速度的高低和磁盤系統(tǒng)的可靠性,都直接影響到系統(tǒng)的性能。因此改善磁盤系統(tǒng)的性能成為現(xiàn)代操作系統(tǒng)的重要任務(wù)之一。磁盤性能有數(shù)據(jù)的組織、磁盤的類型和訪問時(shí)間等??梢酝ㄟ^選擇好的磁盤調(diào)度算法,以減少磁盤的尋道時(shí)間。為了減少對(duì)文件的訪問時(shí)間,應(yīng)采用一種最佳的磁盤調(diào)度算法,以使各進(jìn)程對(duì)磁盤的平均訪問時(shí)間最少。由于在訪問磁盤的時(shí)間中主要是尋道時(shí)間,因此,磁盤調(diào)度的目標(biāo)是使磁盤的尋道時(shí)間最少。所以本課程設(shè)計(jì)對(duì)各個(gè)算法進(jìn)行模擬,進(jìn)而比較分析了解。二、實(shí)驗(yàn)內(nèi)容和目的2.1.實(shí)驗(yàn)內(nèi)容模擬電梯調(diào)度算法,實(shí)現(xiàn)對(duì)磁盤的驅(qū)動(dòng)調(diào)度。設(shè)計(jì)要求:編程序?qū)崿F(xiàn)下述磁盤調(diào)度算法,并求出每種算法的平均尋道長度;要求設(shè)計(jì)主界面可以靈活選擇*算法,且以下算法都要實(shí)現(xiàn)先來先服務(wù)算法(FCFS)2、最短尋道時(shí)間優(yōu)先算法(SSTF)3、掃描算法(SCAN)4、循環(huán)掃描算法(CSCAN)2.2.實(shí)驗(yàn)原理模擬電梯調(diào)度算法,對(duì)磁盤調(diào)度。磁盤是要供多個(gè)進(jìn)程共享的存儲(chǔ)設(shè)備,但一個(gè)磁盤每個(gè)時(shí)刻只能為一個(gè)進(jìn)程服務(wù)。當(dāng)有進(jìn)程在訪問*個(gè)磁盤時(shí),其他想訪問該磁盤的進(jìn)程必須等待,直到磁盤一次工作結(jié)束。當(dāng)有多個(gè)進(jìn)程提出輸入輸出請(qǐng)求處于等待狀態(tài),可用電梯調(diào)度算法從若干個(gè)等待訪問者中選擇一個(gè)進(jìn)程,讓它訪問磁盤。當(dāng)存取臂僅需移到一個(gè)方向最遠(yuǎn)的所請(qǐng)求的柱面后,如果沒有訪問請(qǐng)求了,存取臂就改變方向。三、總體設(shè)計(jì)及分類簡介3.1算法介紹磁盤調(diào)度中常用的有四種算法,功能分別如下:先來先服務(wù)(FCFS)算法。即先來的請(qǐng)求先被響應(yīng)。FCFS策略看起來似乎是相當(dāng)"公平"的,但是當(dāng)請(qǐng)求的頻率過高的時(shí)候FCFS策略的響應(yīng)時(shí)間就會(huì)大大延長。FCFS策略為我們建立起一個(gè)隨機(jī)訪問機(jī)制的模型,但是假如用這個(gè)策略反復(fù)響應(yīng)從里到外的請(qǐng)求,則將會(huì)消耗大量的時(shí)間。為了盡量降低尋道時(shí)間,看來我們需要對(duì)等待著的請(qǐng)求進(jìn)行適當(dāng)?shù)呐判颍皇呛唵蔚氖褂肍CFS策略。這個(gè)過程就叫做磁盤調(diào)度管理。有時(shí)候FCFS也被看作是最簡單的磁盤調(diào)度算法。最短尋道時(shí)間優(yōu)先(SSTF)算法。要求訪問的磁道,與當(dāng)前磁頭所在的磁道距離最近,以使每次的尋道時(shí)間最短。掃描調(diào)度(SCAN)算法。該算法不僅考慮到欲訪問的磁道與當(dāng)前磁道間的距離,更優(yōu)先考慮的是磁頭當(dāng)前的移動(dòng)方向。例如,當(dāng)磁頭正在自里向外移動(dòng)時(shí),SCAN算法所考慮的下一個(gè)訪問對(duì)象,應(yīng)是其欲訪問的磁道,既在當(dāng)前磁道之外,又是距離最近的。這樣自里向外的訪問,直至再無更外的磁道需要訪問時(shí),才將磁道換向自外向里移動(dòng)。這時(shí),同樣也是每次選擇這樣的進(jìn)程來調(diào)度,也就是要訪問的當(dāng)前位置內(nèi)距離最近者,這樣,磁頭又逐步地從外向里移動(dòng),直至再無更里面的磁道要訪問,從而避免了出現(xiàn)“饑餓”現(xiàn)像。4.循環(huán)掃描(C-SCAN)算法。當(dāng)磁頭剛從里向外移動(dòng)而越過了*一磁道時(shí),恰好又有一進(jìn)程請(qǐng)求訪問此磁道,這時(shí),該里程就必須等待,為了減少這種延遲,CSCAN算法規(guī)定磁頭單向移動(dòng),而本實(shí)驗(yàn)過程中我們所設(shè)計(jì)的是磁頭從里向外移動(dòng),而從外向里移動(dòng)時(shí)只須改方向而已,本實(shí)驗(yàn)未實(shí)現(xiàn)。但本實(shí)驗(yàn)已完全能演示循環(huán)掃描的全過程。3.2詳細(xì)設(shè)計(jì)功能模塊設(shè)計(jì)(1)先來先服務(wù)算法(FCFS)3.3環(huán)境要求軟件要求:MicrosoftVisualStdio程序運(yùn)行測試首先輸入九個(gè)磁道名稱以及要訪問的磁道號(hào)和當(dāng)前磁道號(hào)選擇要執(zhí)行的算法:2.先來先服務(wù)算法(FCFS)3.最短尋道時(shí)間優(yōu)先算法(SSTF)繼續(xù)調(diào)度其他算法,選擇是1,選擇掃描算法(SCAN)2掃描算法(SCAN)循環(huán)掃描算法(CSCAN)附:代碼*include"stdaf*.h"*include<iostream>*include<math.h>*defineprocess_Num9usingnamespacestd;structTrack{intcurrent_Tracknum=0;//當(dāng)前磁道號(hào)intne*t_Track=0;//被訪問的下一個(gè)磁道號(hào)intmove_Distance=0;//移動(dòng)距離charprocess_Name;};Tracktrack[process_Num];floattrack_aveLength=0;//平均尋道長度intnow_Tracknum=0;//最初開始磁道號(hào)intselect_num=0;intcount_Num=0;//調(diào)度算法次數(shù)voidScanf_data(){ printf("請(qǐng)輸入要訪問磁盤的進(jìn)程:\n");for(inti=0;i<process_Num;i++){cin>>track[i].process_Name;} printf("請(qǐng)輸入當(dāng)前的磁道號(hào):"); scanf_s("%d",&now_Tracknum); printf("請(qǐng)輸入進(jìn)程要訪問的磁道號(hào):\n");for(inti=0;i<process_Num;i++){scanf_s("%d",&track[i].ne*t_Track);}}voidSelect(){ printf("請(qǐng)選擇磁盤調(diào)度算法:\n"); printf("1.先來先服務(wù)算法(FCFS)\n"); printf("2.最短尋道時(shí)間優(yōu)先算法(SSTF)\n"); printf("3.掃描算法(SCAN)\n"); printf("4.循環(huán)算法(CSCAN)\n"); scanf_s("%d",&select_num);}voidPrint(){//打印訪問磁盤順序printf("進(jìn)程訪問磁盤的先后順序:");for(inti=0;i<process_Num;i++){printf("%c",track[i].process_Name);} printf("\n");for(inti=0;i<process_Num;i++){printf("%d,",track[i].ne*t_Track);} printf("\n");}voidPrint_Data(){ printf("打印表格\n"); printf("\t\t從%d*磁道開始\n",now_Tracknum); printf("\t磁道名\t磁道號(hào)\t移動(dòng)距離\n");for(inti=0;i<process_Num;i++){ printf("\t%c\t%d\t%d\n",track[i].process_Name,track[i].ne*t_Track,track[i].move_Distance); } printf("\n"); printf("\t平均尋道長度為:%.2f\n",track_aveLength);printf("\n");}voidCount_data(){intnownum=0;//當(dāng)前計(jì)算次數(shù)for(inti=0;i<process_Num;i++){if(nownum==0){ track[i].move_Distance=abs(now_Tracknum-track[i].ne*t_Track); track[i].current_Tracknum=track[i].ne*t_Track; nownum++; }else{track[i].move_Distance=abs(track[i].ne*t_Track-track[i-1].current_Tracknum); track[i].current_Tracknum=track[i].ne*t_Track; }}intsum=0;//計(jì)算平均尋道長度時(shí)需要的總和printf("每次磁頭移動(dòng)距離為:");for(inti=0;i<process_Num;i++){// printf("%d,",track[i].move_Distance);cout<<track[i].move_Distance<<""; }for(inti=0;i<process_Num;i++){ sum=sum+track[i].move_Distance; } printf("\n"); track_aveLength=(float)sum/process_Num; printf("平均尋道長度為:%.2f,",track_aveLength);printf("\n");}voidFCFS(){ count_Num++; printf("按進(jìn)程提出請(qǐng)求的先后次序進(jìn)行排隊(duì)\n");Print(); Count_data();printf("\n"); Print_Data();}voidSSTF(){ count_Num++;intnownum=0;//當(dāng)前計(jì)算次數(shù)int*[10];int*temp=0;inttempint;//冒泡排序時(shí)需要的臨時(shí)int型變量(對(duì)進(jìn)程訪問磁道號(hào)進(jìn)行排序)inttempchar;//冒泡排序時(shí)需要的臨時(shí)char型變量(對(duì)進(jìn)程名進(jìn)行排序)printf("按進(jìn)程訪問磁道與當(dāng)前磁頭所在的磁道距離進(jìn)行排隊(duì)\n");for(inti=0;i<process_Num;i++){*[i]=now_Tracknum-track[i].ne*t_Track;}for(inti=0;i<process_Num-1;i++){for(intj=0;j<process_Num-1-i;j++){if(((*[j]>0)&&(*[j+1]>0)&&(*[j]>*[j+1]))||(*[j]<0&&*[j+1]>0)){ *temp=*[j]; *[j]=*[j+1]; *[j+1]=*temp; tempint=track[j].ne*t_Track; track[j].ne*t_Track=track[j+1].ne*t_Track; track[j+1].ne*t_Track=tempint; tempchar=track[j].process_Name; track[j].process_Name=track[j+1].process_Name; track[j+1].process_Name=tempchar; }if(*[j]<0&&*[j+1]<0){int*1=abs(*[j]);int*2=abs(*[j+1]);if(*1>*2){ *temp=*[j]; *[j]=*[j+1]; *[j+1]=*temp; tempint=track[j].ne*t_Track; track[j].ne*t_Track=track[j+1].ne*t_Track; track[j+1].ne*t_Track=tempint; tempchar=track[j].process_Name; track[j].process_Name=track[j+1].process_Name; track[j+1].process_Name=tempchar; }}elsecontinue;}} Print();Count_data();printf("\n");Print_Data();}voidSCAN(){ count_Num++;intnownum=0;//當(dāng)前計(jì)算次數(shù)int*[10];int*temp=0;inttempint;//冒泡排序時(shí)需要的臨時(shí)int型變量(對(duì)進(jìn)程訪問磁道號(hào)進(jìn)行排序)inttempchar;//冒泡排序時(shí)需要的臨時(shí)char型變量(對(duì)進(jìn)程名進(jìn)行排序)printf("SCAN算法按磁頭當(dāng)前的移動(dòng)方向和進(jìn)程訪問磁道與當(dāng)前磁頭所在的磁道距離進(jìn)行排隊(duì)\n");for(inti=0;i<process_Num;i++){*[i]=now_Tracknum-track[i].ne*t_Track;}for(inti=0;i<process_Num-1;i++){for(intj=0;j<process_Num-1-i;j++){if(((*[j]>0)&&(*[j+1]>0)&&(*[j]>*[j+1]))||(*[j]>0&&*[j+1]<0)){ *temp=*[j]; *[j]=*[j+1]; *[j+1]=*temp; tempint=track[j].ne*t_Track; track[j].ne*t_Track=track[j+1].ne*t_Track; track[j+1].ne*t_Track=tempint; tempchar=track[j].process_Name; track[j].process_Name=track[j+1].process_Name; track[j+1].process_Name=tempchar; }if(*[j]<0&&*[j+1]<0){int*1=abs(*[j]);int*2=abs(*[j+1]);if(*1>*2){ *temp=*[j]; *[j]=*[j+1]; *[j+1]=*temp; tempint=track[j].ne*t_Track; track[j].ne*t_Track=track[j+1].ne*t_Track; track[j+1].ne*t_Track=tempint; tempchar=track[j].process_Name; track[j].process_Name=track[j+1].process_Name; track[j+1].process_Name=tempchar; }}elsecontinue; } } Print(); Count_data();printf("\n");Print_Data();}voidCSCAN(){ count_Num++;intnownum=0;//當(dāng)前計(jì)算次數(shù)int*[10];int*temp=0;inttempint;//冒泡排序時(shí)需要的臨時(shí)int型變量(對(duì)進(jìn)程訪問磁道號(hào)進(jìn)行排序)inttempchar;//冒泡排序時(shí)需要的臨時(shí)char型變量(對(duì)進(jìn)程名進(jìn)行排序)printf("SCAN算法按磁頭當(dāng)前的移動(dòng)方向和進(jìn)程訪問磁道與當(dāng)前磁頭所在的磁道距離進(jìn)行排隊(duì)\n");for(inti=0;i<process_Num;i++){*[i]=now_Tracknum-track[i].ne*t_Track;}for(inti=0;i<process_Num-1;i++){for(intj=0;j<process_Num-1-i;j++){if(((*[j]>0)&&(*[j+1]>0)&&(*[j]<*[j+1]))||(*[j]>0&&*[j+1]<0)){ *temp=*[j]; *[j]=*[j+1]; *[j+1]=*temp; tempint=track[j].ne*t_Track; track[j].ne*t_Track=track[j+1].ne*t_Track; track[j+1].ne*t_Track=tempint; tempchar=track[j].process_Name; track[j].process_Name=track[j+1].process_Name; track[j+1].process_Name=tempchar; }if(*[j]<0&&*[j+1]<0){int*1=abs(*[j]);int*2=abs(*[j+1]);if(*1>*2){ *temp=*[j]; *[j]=*[j+1]; *[j+1]=*temp; tempint=track[j].ne*t_Track; track[j].ne*t_Track=track[j+1].ne*t_Track; track[j

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論