

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p> 課 程 設(shè) 計</p><p> 課程設(shè)計名稱: 操作系統(tǒng)應(yīng)用課程設(shè)計 </p><p> 專 業(yè) 班 級 : </p><p> 學(xué) 生 姓 名 : xxxxx </p><p> 學(xué) 號 :
2、 </p><p> 指 導(dǎo) 教 師 : </p><p> 課程設(shè)計時間: 2010.12.20-2010.12.26 </p><p> 計算機(jī)科學(xué) 專業(yè)課程設(shè)計任務(wù)書</p><p> 說明:本表由指導(dǎo)教師填寫,由教研室主任審核后
3、下達(dá)給選題學(xué)生,裝訂在設(shè)計(論文)首頁</p><p> 一 .課程設(shè)計需求分析</p><p> 操作系統(tǒng)是計算機(jī)系統(tǒng)的一個重要系統(tǒng)軟件。我們在本課程的實驗過程中,了解實際操作系統(tǒng)的工作過程,在實踐中加深對操作系統(tǒng)原理的理解。</p><p> 磁盤存儲器不僅容量大,存取速度快,而且可以實現(xiàn)隨機(jī)存取,是當(dāng)前存放大量程序和數(shù)據(jù)的理想設(shè)備,故在現(xiàn)代計算機(jī)系統(tǒng)中,
4、都配置了磁盤存儲器,并以它為主來存放文件。這樣,對文件的操作,都將涉及到對磁盤的訪問。磁盤I/O速度的高低和磁盤系統(tǒng)的可靠性都將直接影響到系統(tǒng)性能。因此,設(shè)法改善磁盤系統(tǒng)的性能,已成為現(xiàn)代操作系統(tǒng)的重要任務(wù)之一。磁盤性能有數(shù)據(jù)的組織、磁盤的類型和訪問時間等。</p><p> 磁盤調(diào)度的目標(biāo)是使磁盤的平均尋道時間最少。也正因為這樣,我們有必要對各算法進(jìn)行模擬,進(jìn)而比較、分析、了解。</p><
5、;p> 本實驗設(shè)計的目的是通過設(shè)計一個磁盤調(diào)度模擬系統(tǒng),以加深對最短尋道時間優(yōu)先(SSTF)、N步掃描算法(NStepSCAN)等磁盤調(diào)度算法的理解。讓我們更好地掌握操作系統(tǒng)的原理及實現(xiàn)方法,加深對操作系統(tǒng)基礎(chǔ)理論和重要算法的理解,加強(qiáng)動手能力。</p><p><b> 二.課程設(shè)計原理</b></p><p> 設(shè)備的動態(tài)分配算法與進(jìn)程調(diào)度相似,也是基
6、于一定的分配策略的。常用的分配策略有先請求先分配、優(yōu)先級高者先分配等策略。在多道程序系統(tǒng)中,低效率通常是由于磁盤類旋轉(zhuǎn)設(shè)備使用不當(dāng)造成的。操作系統(tǒng)中,對磁盤的訪問要求來自多方面,常常需要排隊。這時,對眾多的訪問要求按一定的次序響應(yīng),會直接影響磁盤的工作效率,進(jìn)而影響系統(tǒng)的性能。訪問磁盤的時間因子由3部分構(gòu)成,它們是查找(查找磁道)時間、等待(旋轉(zhuǎn)等待扇區(qū))時間和數(shù)據(jù)傳輸時間,其中查找時間是決定因素。因此,磁盤調(diào)度算法先考慮優(yōu)化查找策略,
7、需要時再優(yōu)化旋轉(zhuǎn)等待策略。</p><p> 平均尋道長度(L)為所有磁道所需移動距離之和除以總的所需訪問的磁道數(shù)(N),即:L=(M1+M2+……+Mi+……+MN)/N。其中Mi為所需訪問的磁道號所需移動的磁道數(shù)。</p><p> 啟動磁盤執(zhí)行輸入輸出操作時,要把移動臂移動到指定的柱面,再等待指定扇區(qū)的旋轉(zhuǎn)到磁頭位置下,然后讓指定的磁頭進(jìn)行讀寫,完成信息傳送。因此,執(zhí)行一次輸入輸
8、出所花的時間有:尋找時間——磁頭在移動臂帶動下移動到指定柱面所花的時間;延遲時間——指定扇區(qū)旋轉(zhuǎn)到磁頭下所需的時間;傳送時間——由磁頭進(jìn)程讀寫完成信息傳送的時間。</p><p> 其中傳送信息所花的時間,是在硬件設(shè)計就固定的。而尋找時間和延遲時間是與信息在磁盤上的位置有關(guān)。為了減少移動臂進(jìn)行移動花費的時間,每個文件的信息不是按盤面上的磁道順序存放滿一個盤面后,再放到下一個盤面上。而是按柱面存放,同一柱面上的各
9、磁道被放滿信息后,再放到下一個柱面上。所以各磁盤的編號按柱面順序(從0號柱面開始),每個柱面按磁道順序,每個磁道又按扇區(qū)順序進(jìn)行排序。</p><p> 磁盤是可供多個進(jìn)程共享的設(shè)備,當(dāng)有多個進(jìn)程都要求訪問磁盤是,應(yīng)采用一種最佳調(diào)度算法,以使各種進(jìn)程對磁盤的平均訪問時間最小。由于在訪問磁盤的時間中,主要是尋道時間,因此,磁盤調(diào)度的目標(biāo),是使磁盤的平均尋道時間最少。</p><p> 三
10、.算法分析及程序概要設(shè)計</p><p> 1.最短尋道時間優(yōu)先算法(SSTF)</p><p><b> 1.1算法分析:</b></p><p> 最短尋找時間優(yōu)先調(diào)度算法總是從等待訪問者中挑選尋找時間最短的那個請求先執(zhí)行的,而不管訪問者到來的先后次序。也就是說,該算法選擇這樣的進(jìn)程:其要求訪問的磁道與當(dāng)前磁頭所在的磁道距離最近,以使
11、每次的尋道時間最短。但這種算法不能保證平均尋道時間最短?,F(xiàn)在利用一個例子來討論,假設(shè)當(dāng)前移動臂所在的磁道為100,進(jìn)程請求訪問磁盤的先后次序為:55、58、39、18、90、160、150、38、184。那么該算法將這樣進(jìn)行進(jìn)程調(diào)度:現(xiàn)在當(dāng)100號柱面的操作結(jié)束后,應(yīng)該先處理90號柱面的請求,然后到達(dá)58號柱面執(zhí)行操作,隨后處理55號柱面請求,后繼操作的次序應(yīng)該是39、38、18、150、160、184。</p><
12、p> 采用最短尋找時間優(yōu)先算法決定等待訪問者執(zhí)行操作的次序時,讀寫磁頭總共移動了200多個柱面的距離,與先來先服務(wù)、算法比較,大幅度地減少了尋找時間,因而縮短了為各訪問者請求服務(wù)的平均時間,也就提高了系統(tǒng)效率。</p><p> SSTF算法雖然能獲得較好的尋道性能,但卻可能導(dǎo)致某個進(jìn)程發(fā)生“饑餓”(Starvation)現(xiàn)象。因為只要不斷有新進(jìn)程的請求到達(dá),且其所要訪問的磁道與磁頭當(dāng)前所在磁道的距離較
13、近,這種新進(jìn)程的I/O請求必然優(yōu)先滿足。也就是說,SSTF查找模式有高度局部化的傾向,會推遲一些請求的服務(wù),甚至引起無限拖延(饑餓)。</p><p> 1.2概要設(shè)計(流程圖):</p><p> 2、NStepSCAN算法</p><p><b> 2.1算法分析</b></p><p> N步掃描算法是基于
14、掃描算法發(fā)展而成的,故要想很好的了解它,首先得對掃描算法加以理解分析,只有這樣才能很好地理解N步掃描算法。</p><p> 掃描算法(SCAN) 又稱電梯調(diào)度算法。該算法不僅考慮到與訪問的磁道與當(dāng)前磁道間的距離,更優(yōu)先考慮的是磁頭當(dāng)前的移動方向。SCAN算法是磁頭前進(jìn)方向上的最短查找時間優(yōu)先算法,它排除了磁頭在盤面局部位置上的往復(fù)移動,SCAN算法這種逐步自里向外又自外向里(或先自外向里又自外向里)的磁頭移動
15、規(guī)率,很好地避免了出現(xiàn)“饑餓”現(xiàn)象,并在很大程度上消除了SSTF算法的不公平性,但仍有利于對中間磁道的請求。</p><p> “電梯調(diào)度”算法是從移動臂當(dāng)前位置開始沿著臂的移動方向去選擇離當(dāng)前移動臂最近的那個柱訪問者,如果沿臂的移動方向無請求訪問時,就改變臂的移動方向再選擇。這好比乘電梯,如果電梯已向上運動到4層時,依次有3位乘客陳生、伍生、張生在等候乘電梯。他們的要求是:陳生在2層等待去10層;伍生在5層等
16、待去底層;張生在8層等待15層。由于電梯目前運動方向是向上,所以電梯的形成是先把乘客張生從8層帶到15層,然后電梯換成下行方向,把乘客伍生從5層帶到底層,電梯最后再調(diào)換方向,把乘客陳生從2層送到10層。</p><p> 但是,“電梯調(diào)度”算法在實現(xiàn)時,不僅要記住讀寫磁頭的當(dāng)前位置,還必須記住移動臂的當(dāng)前前進(jìn)方向。</p><p> N步掃描算法是將磁盤請求隊列分成若干個長度為N的子隊
17、列,磁盤調(diào)度將按FCFS算法依次處理這些子隊列。而沒處理一個隊列時又是按SCAN算法,對一個隊列處理完后,在處理其他隊列。當(dāng)正在處理某子隊列時,如果又出現(xiàn)新的I/O請求,便將新請求進(jìn)程放入其他隊列,這樣就可以避免出現(xiàn)粘著現(xiàn)象,統(tǒng)稱“磁盤粘著”(Armstickiness)(有一個或幾個進(jìn)程對某一磁道有較高的訪問頻率,即這些進(jìn)程反復(fù)請求對某一磁道的I/O操作,從而壟斷了整個磁盤設(shè)備的現(xiàn)象)。而在SSTF、SCAN及CSCAN幾種調(diào)度算法中
18、,都有可能出現(xiàn)磁臂留在某處不動的情況,即出現(xiàn)磁盤粘著現(xiàn)象。當(dāng)N取值很大時,會使N步掃描的性能接近于SCAN算法的性能;當(dāng)N=1時,N步掃描算法退化為FCFS算法。</p><p> 此外,需要了解的是N步SCAN算法的簡化算法是FSCAN算法,即將磁盤請求隊列分成兩個子隊列的算法。</p><p> 2.2概要設(shè)計(流程圖)</p><p> Y
19、 N</p><p><b> 四、詳細(xì)設(shè)計</b></p><p> #include"stdio.h"</p><p> #include"stdlib.h"</p><p> //#include"iostream.h
20、"</p><p> #define maxsize 100 //定義最大數(shù)組域</p><p> int now,s;</p><p> //最短尋道時間優(yōu)先調(diào)度算法</p><p> void SSTF(int array[],int m)</p><p><b> {</b&g
21、t;</p><p><b> int temp;</b></p><p><b> int k=1;</b></p><p> int now,l,r; //當(dāng)前磁道號now;找出的當(dāng)前磁道左側(cè)的磁道l,右側(cè)的磁道r</p><p> int i,j,sum=0;</p>
22、<p><b> int avg;</b></p><p> for(i=0;i<m;i++)</p><p><b> {</b></p><p> for(j=i+1;j<m;j++)//對磁道號進(jìn)行從小到大排列</p><p><b> {</
23、b></p><p> if(array[i]>array[j])//兩磁道號之間比較</p><p><b> {</b></p><p> temp=array[i];</p><p> array[i]=array[j];</p><p> array[j]=temp;
24、</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> for( i=0;i<m;i++)//輸出排序后的磁道號數(shù)組</p><p><b> {&l
25、t;/b></p><p> printf("%d ",array[i]);</p><p><b> }</b></p><p> printf("\n 請輸入當(dāng)前的磁道號:");</p><p> scanf("%d",&now);&
26、lt;/p><p> printf("\n SSTF調(diào)度結(jié)果: ");</p><p> if(array[m-1]<=now)//判斷整個數(shù)組里的數(shù)是否都小于當(dāng)前磁道號</p><p><b> { </b></p><p> for(i=m-1;i>=0;i--)//將數(shù)組磁
27、道號從大到小輸出</p><p> printf("%d ",array[i]);</p><p> sum=now-array[0];//計算移動距離</p><p><b> }</b></p><p> else if(array[0]>=now)//判斷整個數(shù)組里的數(shù)是否都大于
28、當(dāng)前磁道號</p><p><b> { </b></p><p> for(i=0;i<m;i++)//將磁道號從小到大輸出</p><p> printf("%d ",array[i]);</p><p> sum=array[m-1]-now;//計算移動距離</p>
29、<p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> while(array[k]<now)//逐一比較以確定K值</p><p><b> {</b>
30、;</p><p><b> k++;</b></p><p><b> }</b></p><p><b> l=k-1;</b></p><p><b> r=k;</b></p><p> //確定當(dāng)前磁道在已排的序
31、列中的位置</p><p> while((l>=0)&&(r<m))</p><p><b> {</b></p><p> if((now-array[l])<=(array[r]-now))//判斷最短距離</p><p><b> { </b>&
32、lt;/p><p> printf("%d ",array[l]);</p><p> sum+=now-array[l];//計算移動距離</p><p> now=array[l];</p><p><b> l=l-1;</b></p><p><b>
33、 }</b></p><p><b> else</b></p><p><b> { </b></p><p> printf("%d ",array[r]);</p><p> sum+=array[r]-now;//計算移動距離</p>
34、<p> now=array[r];</p><p><b> r=r+1;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> if(l==-1)</b></p>
35、<p><b> { </b></p><p> for(j=r;j<m;j++)</p><p><b> { </b></p><p> printf("%d ",array[j]);</p><p><b> }</b
36、></p><p> sum+=array[m-1]-array[0];//計算移動距離</p><p><b> }</b></p><p><b> else</b></p><p><b> { </b></p><p> fo
37、r(j=l;j>=0;j--)</p><p><b> { </b></p><p> printf("%d ",array[j]);</p><p><b> }</b></p><p> sum+=array[m-1]-array[0];//計算移動距離
38、</p><p><b> }</b></p><p><b> }</b></p><p> avg=sum/m;</p><p> printf("\n 移動的總道數(shù): %d \n",sum);</p><p> printf("
39、平均尋道長度: %d \n",avg);</p><p><b> }</b></p><p><b> //掃描調(diào)度方法</b></p><p> void SCAN(int array[],int m,int d)//先要給出當(dāng)前磁道號和移動臂的移動方向</p><p><
40、b> {</b></p><p><b> int k=1;</b></p><p><b> int l,r;</b></p><p> int i,j,sum=0;</p><p><b> int avg;</b></p><
41、;p> int temp; //用于排序的臨時參數(shù)</p><p><b> int q;</b></p><p> for(i=0;i<m;i++)</p><p><b> {</b></p><p> for(j=i+1;j<m;j++)</p>
42、<p><b> {</b></p><p> if(array[i]>array[j])//對磁道號進(jìn)行從小到大排列</p><p><b> {</b></p><p> temp=array[i];</p><p> array[i]=array[j];</p&
43、gt;<p> array[j]=temp;</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> if(array[m-1]<=now)//判斷整個數(shù)組里的數(shù)是否都小于
44、當(dāng)前磁道號</p><p><b> { </b></p><p> printf("\n SCAN調(diào)度結(jié)果: ");</p><p> for(i=m-1;i>=0;i--)</p><p><b> {</b></p><p>
45、printf("%d ",array[i]);//將數(shù)組磁道號從大到小輸出</p><p> q=array[i];</p><p><b> }</b></p><p> sum=now-q;//計算移動距離</p><p><b> s=s+sum;</b><
46、/p><p><b> now=q;</b></p><p><b> }</b></p><p> else if(array[0]>=now)//判斷整個數(shù)組里的數(shù)是否都大于當(dāng)前磁道號</p><p><b> { </b></p><p&
47、gt; printf("\n SCAN調(diào)度結(jié)果: ");</p><p> for(i=0;i<m;i++)</p><p><b> {</b></p><p> printf("%d ",array[i]);//將磁道號從小到大輸出</p><p> q=a
48、rray[i];</p><p><b> }</b></p><p> sum=array[m-1]-now;//計算移動距離</p><p><b> s=s+sum;</b></p><p><b> now=q;</b></p><p>
49、<b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> while(array[k]<now)//逐一比較以確定K值</p><p><b> {</b></p>
50、<p><b> k++;</b></p><p><b> }</b></p><p><b> l=k-1;</b></p><p><b> r=k;</b></p><p> printf("\n SCAN調(diào)度結(jié)果
51、: ");</p><p><b> if(d==0)</b></p><p><b> {</b></p><p> for(j=l;j>=0;j--)</p><p><b> {</b></p><p> printf(
52、"%d ",array[j]);</p><p> q=array[j];</p><p><b> }</b></p><p> for(j=r;j<m;j++)</p><p><b> {</b></p><p> printf(&
53、quot;%d ",array[j]);</p><p> q=array[j];</p><p><b> }</b></p><p> sum=now-2*array[0]+array[m-1];//計算移動距離</p><p><b> s=s+sum;</b></p
54、><p><b> now=q;</b></p><p> }//磁道號減小方向</p><p><b> else</b></p><p><b> {</b></p><p> for(j=r;j<m;j++)</p>&l
55、t;p><b> {</b></p><p> printf("%d ",array[j]);</p><p> q=array[j];</p><p><b> }</b></p><p> for(j=l;j>=0;j--)</p>&l
56、t;p><b> {</b></p><p> printf("%d ",array[j]);</p><p> q=array[j];</p><p><b> }</b></p><p> sum=-now-array[0]+2*array[m-1];//計
57、算移動距離</p><p><b> s=s+sum;</b></p><p><b> now=q;</b></p><p> }//磁道號增加方向</p><p><b> }</b></p><p> avg=sum/m;</p&g
58、t;<p> printf("\n 該子隊列移動的總道數(shù): %d \n",sum);</p><p> printf(" 該子隊列平均尋道長度: %d \n",avg);</p><p><b> }</b></p><p> void NStepSCAN(int array[],
59、int m)</p><p><b> { </b></p><p> int sn,N,d; //sn標(biāo)記每一子隊列的長度,N記錄子隊列個數(shù),now標(biāo)記當(dāng)前磁道號</p><p> int b[100],c[100]; //b[100]儲存前幾個子隊列,c[100]儲存最后一個子隊列</p><p>
60、 int i=0,j=0,k=0,n=1;</p><p><b> int ave;</b></p><p> printf("請輸入當(dāng)前磁道號:\n");</p><p> scanf("%d",&now);</p><p> printf("請輸入
61、子隊列的個數(shù):\n");</p><p> scanf("%d",&N);</p><p> while(N<1||N>m)</p><p><b> {</b></p><p> printf("超出范圍,文件中的磁道數(shù)不夠分組,請重新輸入:\n&qu
62、ot;);</p><p> scanf("%d",&N);</p><p><b> }</b></p><p> printf("請輸入當(dāng)前移動臂的移動的方向 (1 磁道號增加方向,0磁道號減小方向) : ");</p><p> scanf("%d&
63、quot;,&d);</p><p><b> sn=m/N;</b></p><p> while(N!=1) //當(dāng)不是最后一個子隊列時,循環(huán)進(jìn)行SCAN調(diào)度</p><p><b> {</b></p><p><b> j=0;</b><
64、/p><p> for(i=k;i<sn*n;i=k,j++)</p><p><b> {</b></p><p> b[j]=array[i];</p><p><b> k=k+1;</b></p><p><b> }</b><
65、/p><p> printf("\n第%d個隊列的排序結(jié)果為:\n",n); </p><p> SCAN(b,sn,d);</p><p><b> N=N-1;</b></p><p><b> n=n+1;</b></p><p><b&g
66、t; }</b></p><p> if(N==1) //最后一個子隊列時進(jìn)行SCAN調(diào)度</p><p><b> {</b></p><p> for(i=k,j=0;i<m;i++,j++)</p><p><b> {</b></p>
67、<p> c[j]=array[i];</p><p><b> }</b></p><p> printf("\n最后一個隊列的調(diào)度結(jié)果為:\n");</p><p> SCAN(c,m-k,d);</p><p><b> }</b></p>
68、<p><b> ave=s/m;</b></p><p> printf("\n該調(diào)度總的結(jié)果為:\n");</p><p> printf("\n 移動的總道數(shù): %d \n",s);</p><p> printf(" 平均尋道長度: %d \n",ave)
69、;</p><p><b> }</b></p><p><b> // 操作界面</b></p><p> int main()</p><p><b> {</b></p><p><b> int c;</b><
70、;/p><p><b> int C=1;</b></p><p> FILE *fp;//定義指針文件</p><p> int cidao[maxsize];//定義磁道號數(shù)組</p><p> int i=0,count;</p><p> fp=fopen("cidao.t
71、xt","r+");//讀取cidao.txt文件</p><p> if(fp==NULL)//判斷文件是否存在</p><p><b> {</b></p><p> printf("\n 請 先 設(shè) 置 磁 道! \n");</p><p><b>
72、 exit(0);</b></p><p><b> }</b></p><p> while(!feof(fp))//如果磁道文件存在</p><p><b> {</b></p><p> fscanf(fp,"%d",&cidao[i]);//
73、調(diào)入磁道號</p><p><b> i++;</b></p><p><b> }</b></p><p><b> count=i;</b></p><p> printf("\n -------------------------------------
74、-------------\n");</p><p> printf(" 10-11年度OS課程設(shè)計--磁盤調(diào)度算法模擬");</p><p> printf("\n --------------------------------------------------\n");</p><p> p
75、rintf("\n 磁道讀取結(jié)果:\n");</p><p> for(i=0;i<count;i++)</p><p><b> {</b></p><p> printf("%5d",cidao[i]);//輸出讀取的磁道的磁道號</p><p><b>
76、 }</b></p><p> printf("\n ");</p><p> while(C==1)</p><p><b> {</b></p><p> printf(" ╭═══════════════╮ \n&
77、quot;);</p><p> printf(" ║ 操作系統(tǒng)課程設(shè)計 ║ \n");</p><p> printf(" ╭═════┤ 磁盤調(diào)度算法 ├═════╮ \n ");</p><p> pri
78、ntf(" ║ ║ ║ ║ \n");</p><p> printf(" ║ ╰═══════════════╯ ║ \n");</p><p> printf(" ║
79、 ║ \n");</p><p> printf(" ║ 1.最短尋道時間優(yōu)先算法(SSTF) ║ \n");</p><p> printf(" ║
80、 ║ \n");</p><p> printf(" ║ ║ \n");</p><p> printf(" ║ 2.N步掃描算法(NStepScan)
81、 ║ \n");</p><p> printf(" ║ ║ \n");</p><p> printf(" ║
82、 ║ \n");</p><p> printf(" ║ ║ \n");</p><p> printf(" ║ ╭───────────────────────╮ ║ \n");</p><p>
83、; printf(" ╰═┤ 請輸入你的選擇的算法(輸入0離開) ├═╯ \n");</p><p> printf(" ╰───────────────────────╯ \n");</p><p> scanf("%d",&c);</p><p
84、> if(c==0) exit(0);</p><p> printf(" ");</p><p> while(c!=1&&c!=2)</p><p><b> {</b></p><p> printf("輸入數(shù)據(jù)超出范圍,請重新輸入您想進(jìn)行的調(diào)度算法:\
85、n");</p><p> scanf("%d",&c);</p><p><b> }</b></p><p><b> switch(c)</b></p><p><b> {</b></p><p>&
86、lt;b> case 1:</b></p><p> SSTF(cidao,count);//最短尋道時間優(yōu)先算法</p><p> printf("\n");</p><p><b> break;</b></p><p><b> case 2:</b&
87、gt;</p><p><b> i=0;</b></p><p> fp=fopen("cidao.txt","r+");//讀取cidao.txt文件</p><p> if(fp==NULL)//判斷文件是否存在</p><p><b> {</b&g
88、t;</p><p> printf("\n 請 先 設(shè) 置 磁 道! \n");</p><p><b> exit(0);</b></p><p><b> }</b></p><p> while(!feof(fp))//如果磁道文件存在</p>&l
89、t;p><b> {</b></p><p> fscanf(fp,"%d",&cidao[i]);//調(diào)入磁道號</p><p><b> i++;</b></p><p><b> }</b></p><p><b>
90、count=i;</b></p><p> printf("\n 磁道讀取結(jié)果:\n");</p><p> for(i=0;i<count;i++)</p><p><b> {</b></p><p> printf("%5d",cidao[i]);/
91、/輸出讀取的磁道的磁道號</p><p><b> }</b></p><p> printf("\n ");</p><p> NStepSCAN(cidao,count);//N步掃描算法</p><p> printf("\n");</p><p&
92、gt;<b> break;</b></p><p><b> }</b></p><p> printf(" 是否繼續(xù)(按0結(jié)束,按1繼續(xù))?");</p><p> scanf("%5d",&C);</p><p><b> }
93、</b></p><p> return(0);</p><p><b> }</b></p><p><b> 五、調(diào)試運行結(jié)果</b></p><p> 1. 調(diào)試運行后的開始界面如下:</p><p> 2、調(diào)試運行各個算法結(jié)果如下:</p&
94、gt;<p> 2.1運行最短尋道時間優(yōu)先(SSTF)算法調(diào)度程序結(jié)果如下:</p><p> 2.2調(diào)試運行NStepSCAN調(diào)度程序結(jié)果如下:</p><p> 2.2.1移動臂的移動方向以磁道號增加方向:</p><p> 2.2.2移動臂的移動方向以磁道號減小方向:</p><p> 3.輸入錯誤后程序界面如下
95、:</p><p> 3.1在選擇算法時,如果輸入數(shù)字不在1-2之間,出錯界面如下:</p><p> 3.2在進(jìn)行N步掃描算法時,當(dāng)輸入要進(jìn)行分組的子隊列個數(shù)少于文件中的磁盤號數(shù)時,出現(xiàn)如下界面:</p><p><b> 七.調(diào)試分析及總結(jié)</b></p><p> 整個設(shè)計中最麻煩的就是整個程序模塊的劃分和
96、各模塊之間接口設(shè)計,編程中經(jīng)常犯想當(dāng)然的錯誤,編程中出現(xiàn)了不少奇怪的錯誤。再調(diào)試中嘗試使用了分割法,對錯誤模塊進(jìn)行定位,再進(jìn)行排查。還使用了單步調(diào)試法,很好地解決了某些邏輯錯誤,比如在利用N步SCAN算法時,其中對磁道號的分組時,出現(xiàn)了越界,開始時還以為是函數(shù)傳遞參數(shù)時出現(xiàn)了越界,導(dǎo)致分組后的數(shù)組值亂碼,但通過單步調(diào)試很容易的找出了癥結(jié)所在。原來是由于循環(huán)中的“j”值發(fā)生越界導(dǎo)致的結(jié)果錯誤。</p><p>
97、在N步掃描算法中,還出現(xiàn)了這樣一個問題。就是,在對磁道號進(jìn)行分組時,最后一列的處理問題。在開始時由于籠統(tǒng)地進(jìn)行了平均分組,而沒有考慮無法完全分盡的情況,進(jìn)而導(dǎo)致最后一個甚至一些磁道號丟失的問題。不過最后,在單列最后一組后(即將最后一組與前面各組分開后)問題得到了解決。將余下的一個或一些磁道號全部加至最后一列末尾,很好地處理了數(shù)據(jù)丟失問題。</p><p> 通過這次的課程設(shè)計使我認(rèn)識到要將操作系統(tǒng)這門計算機(jī)專業(yè)
98、的課學(xué)好不僅僅是要把書上的基本知識學(xué)好而且還要不斷進(jìn)行實踐,將所學(xué)的跟實踐操作結(jié)合起來才能更好地鞏固所學(xué),才能提高自己實踐能力.通過這次的設(shè)計使我認(rèn)識到只停留在表面理解問題是很難使問題得到很好的解決的,實踐能力與理論知識同樣重要。可以說此課程設(shè)計的理論難度并不大,但是若要深入發(fā)掘其中的東西,并且實際去編程實現(xiàn),就遇到了相當(dāng)大的難度。因為與之涉及的很多方面并沒有學(xué)過,需要自己去自學(xué)和實踐檢驗。通過模擬磁盤調(diào)度及進(jìn)程排隊算法來加深對操作系統(tǒng)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 操作系統(tǒng)課程設(shè)計報告--磁盤調(diào)度算法
- 操作系統(tǒng)磁盤調(diào)度算法課程設(shè)計報告
- 操作系統(tǒng)課程設(shè)計報告--磁盤調(diào)度算法
- 操作系統(tǒng)課程設(shè)計報告--磁盤調(diào)度算法
- 操作系統(tǒng)課程設(shè)計---磁盤調(diào)度算法
- 操作系統(tǒng)課程設(shè)計---磁盤調(diào)度報告
- 操作系統(tǒng)課程設(shè)計--磁盤調(diào)度算法實踐
- cscan磁盤調(diào)度算法---操作系統(tǒng)課程設(shè)計
- 操作系統(tǒng)課程設(shè)計-磁盤調(diào)度模擬法
- 操作系統(tǒng)_進(jìn)程調(diào)度算法課程設(shè)計報告
- n-step-scan_磁盤調(diào)度_操作系統(tǒng)課程設(shè)計
- 進(jìn)程調(diào)度算法 操作系統(tǒng)課程設(shè)計
- 操作系統(tǒng)課程設(shè)計---磁盤文件操作
- 操作系統(tǒng)課程設(shè)計--進(jìn)程調(diào)度算法
- 操作系統(tǒng)課程設(shè)計---進(jìn)程調(diào)度算法
- 進(jìn)程調(diào)度算法操作系統(tǒng)課程設(shè)計
- 操作系統(tǒng)課程設(shè)計--進(jìn)程調(diào)度算法
- 操作系統(tǒng)課程設(shè)計報告----磁盤管理模塊告
- 操作系統(tǒng)課程設(shè)計報告磁盤空間管理
- 進(jìn)程調(diào)度算法操作系統(tǒng)課程設(shè)計 (2)
評論
0/150
提交評論