操作系統(tǒng)課程設(shè)計(jì)--磁盤調(diào)度算法實(shí)踐_第1頁
已閱讀1頁,還剩24頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、<p>  《操作系統(tǒng)》課程設(shè)計(jì)</p><p><b>  磁盤調(diào)度算法實(shí)踐</b></p><p>  系 院: 信息工程學(xué)院</p><p><b>  學(xué)生姓名: </b></p><p><b>  學(xué) 號(hào): 5</b></p>

2、<p>  專 業(yè):計(jì)算機(jī)科學(xué)與技術(shù)</p><p>  年 級(jí):計(jì)科0901B</p><p><b>  完成日期: </b></p><p><b>  指導(dǎo)教師: </b></p><p>  附:1、課程設(shè)計(jì)的填寫請按格式要求做;</p><p&g

3、t;  2、文字內(nèi)容宋體、五號(hào)、1.5倍行距;</p><p>  3、程序代碼字體Times New Roman,五號(hào)、1.5倍行距;</p><p><b>  附表:源程序代碼</b></p><p>  #include<stdio.h></p><p>  #include<stdlib.h&

4、gt;</p><p>  #include<iostream.h></p><p>  #include<math.h></p><p>  #define maxsize 1000</p><p>  /*********************判斷輸入數(shù)據(jù)是否有效*************************

5、*/</p><p>  int decide(char str[]) //判斷輸入數(shù)據(jù)是否有效</p><p><b>  {</b></p><p><b>  int i=0;</b></p><p>  while(str[i]!='\0')</p><

6、p><b>  {</b></p><p>  if(str[i]<'0'||str[i]>'9')</p><p><b>  {</b></p><p><b>  return 0;</b></p><p><b&g

7、t;  break;</b></p><p><b>  }</b></p><p><b>  i++;</b></p><p><b>  }</b></p><p><b>  return i;</b></p><p

8、><b>  }</b></p><p>  /******************將字符串轉(zhuǎn)換成數(shù)字***********************/</p><p>  int trans(char str[],int a) //將字符串轉(zhuǎn)換成數(shù)字</p><p><b>  {</b></p>

9、<p><b>  int i;</b></p><p>  int sum=0;</p><p>  for(i=0;i<a;i++)</p><p><b>  {</b></p><p>  sum=sum+(int)((str[i]-'0')*pow(10,a

10、-i-1));</p><p><b>  }</b></p><p>  return sum;</p><p><b>  }</b></p><p>  /*********************冒泡排序算法**************************/</p><

11、;p>  int *bubble(int cidao[],int m)</p><p><b>  { </b></p><p><b>  int i,j;</b></p><p><b>  int temp;</b></p><p>  for(i=0;i<m

12、;i++) //使用冒泡法按從小到大順序排列</p><p>  for(j=i+1;j<m;j++)</p><p><b>  {</b></p><p>  if(cidao[i]>cidao[j])</p><p><b>  { </b></p><p

13、>  temp=cidao[i];</p><p>  cidao[i]=cidao[j];</p><p>  cidao[j]=temp;</p><p><b>  }</b></p><p><b>  }</b></p><p>  cout<<&

14、quot;排序后的磁盤序列為:";</p><p>  for( i=0;i<m;i++) //輸出排序結(jié)果</p><p><b>  {</b></p><p>  cout<<cidao[i]<<" ";</p><p><b>  }<

15、;/b></p><p>  cout<<endl;</p><p>  return cidao;</p><p><b>  } </b></p><p>  /*********************先來先服務(wù)調(diào)度算法**************************/</p>

16、<p>  void FCFS(int cidao[],int m) //磁道號(hào)數(shù)組,個(gè)數(shù)為m</p><p><b>  {</b></p><p>  int now;//當(dāng)前磁道號(hào)</p><p>  int sum=0; //總尋道長度</p><p><b>  int j,i;&l

17、t;/b></p><p><b>  int a;</b></p><p>  char str[100];</p><p>  float ave; //平均尋道長度</p><p>  cout<<"磁盤請求序列為:";</p><p>  for(

18、 i=0;i<m;i++) //按先來先服務(wù)的策略輸出磁盤請求序列</p><p><b>  {</b></p><p>  cout<<cidao[i]<<" ";</p><p><b>  }</b></p><p>  cout<

19、<endl;</p><p>  cout<<"請輸入當(dāng)前的磁道號(hào):"; </p><p>  B: cin>>str; //對輸入數(shù)據(jù)進(jìn)行有效性判斷</p><p>  a=decide(str);</p><p><b>  if(a==0)</b></p&

20、gt;<p><b>  {</b></p><p>  cout<<"輸入數(shù)據(jù)的類型錯(cuò)誤,請重新輸入!"<<endl;</p><p><b>  goto B;</b></p><p><b>  }</b></p><

21、p><b>  else </b></p><p>  now=trans(str,a); //輸入當(dāng)前磁道號(hào)</p><p>  sum+=abs(cidao[0]-now);</p><p>  cout<<"磁盤掃描序列為:";</p><p>  for( i=0;i&l

22、t;m;i++) //輸出磁盤掃描序列</p><p><b>  {</b></p><p>  cout<<cidao[i]<<" ";</p><p><b>  }</b></p><p>  for(i=0,j=1;j<m;i++,j+

23、+) //求平均尋道長度</p><p><b>  {</b></p><p>  sum+=abs(cidao[j]-cidao[i]);</p><p>  ave=(float)(sum)/(float)(m);</p><p><b>  }</b></p><p&

24、gt;  cout<<endl;</p><p>  cout<<"平均尋道長度:"<<ave<<endl;</p><p><b>  }</b></p><p>  /**********************最短尋道時(shí)間優(yōu)先調(diào)度算法*******************

25、*/</p><p>  void SSTF(int cidao[],int m)</p><p><b>  {</b></p><p><b>  int k=1;</b></p><p>  int now,l,r;</p><p>  int i,j,sum=0;&l

26、t;/p><p><b>  int a;</b></p><p>  char str[100];</p><p>  float ave;</p><p>  cidao=bubble(cidao,m); //調(diào)用冒泡排序算法排序</p><p>  cout<<"請輸

27、入當(dāng)前的磁道號(hào):"; </p><p>  C: cin>>str; //對輸入數(shù)據(jù)進(jìn)行有效性判斷</p><p>  a=decide(str);</p><p><b>  if(a==0)</b></p><p><b>  {</b></p><p

28、>  cout<<"輸入數(shù)據(jù)的類型錯(cuò)誤,請重新輸入!"<<endl;</p><p><b>  goto C;</b></p><p><b>  }</b></p><p><b>  else </b></p><p> 

29、 now=trans(str,a); //輸入當(dāng)前磁道號(hào)</p><p>  if(cidao[m-1]<=now) //若當(dāng)前磁道號(hào)大于請求序列中最大者,則直接由外向內(nèi)依次給予各請求服務(wù)</p><p><b>  {</b></p><p>  cout<<"磁盤掃描序列為:";</p&g

30、t;<p>  for(i=m-1;i>=0;i--)</p><p>  cout<<cidao[i]<<" ";</p><p>  sum=now-cidao[0];</p><p><b>  }</b></p><p>  if(cidao[0]&

31、gt;=now) //若當(dāng)前磁道號(hào)小于請求序列中最小者,則直接由內(nèi)向外依次給予各請求服務(wù)</p><p><b>  {</b></p><p>  cout<<"磁盤掃描序列為:";</p><p>  for(i=0;i<m;i++)</p><p>  cout<&l

32、t;cidao[i]<<" ";</p><p>  sum=cidao[m-1]-now;</p><p><b>  }</b></p><p>  if(now>cidao[0]&&now<cidao[m-1]) //若當(dāng)前磁道號(hào)大于請求序列中最小者且小于最大者</p&

33、gt;<p><b>  {</b></p><p>  cout<<"磁盤掃描序列為:";</p><p>  while(cidao[k]<now) //確定當(dāng)前磁道在已排的序列中的位置,后面的算法都用到了,可以直接復(fù)制后少量修改,節(jié)省時(shí)間。</p><p><b>  {

34、</b></p><p><b>  k++;</b></p><p><b>  }</b></p><p><b>  l=k-1;</b></p><p><b>  r=k;</b></p><p>  whil

35、e((l>=0)&&(r<m)) //當(dāng)前磁道在請求序列范圍內(nèi)</p><p><b>  {</b></p><p>  if((now-cidao[l])<=(cidao[r]-now)) //選擇與當(dāng)前磁道最近的請求給予服務(wù)</p><p><b>  {</b></p

36、><p>  cout<<cidao[l]<<" ";</p><p>  sum+=now-cidao[l];</p><p>  now=cidao[l];</p><p><b>  l=l-1;</b></p><p><b>  }<

37、;/b></p><p><b>  else</b></p><p><b>  {</b></p><p>  cout<<cidao[r]<<" ";</p><p>  sum+=cidao[r]-now;</p><p&

38、gt;  now=cidao[r];</p><p><b>  r=r+1;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  if(l==-1) //磁頭移動(dòng)到序列的最小號(hào),返回外側(cè)掃描仍未掃描的磁道</p

39、><p><b>  {</b></p><p>  for(j=r;j<m;j++)</p><p><b>  {</b></p><p>  cout<<cidao[j]<<" ";</p><p><b>  }

40、</b></p><p>  sum+=cidao[m-1]-cidao[0];</p><p><b>  }</b></p><p>  else //磁頭移動(dòng)到序列的最大號(hào),返回內(nèi)側(cè)掃描仍未掃描的磁道</p><p><b>  {</b></p><p&

41、gt;  for(j=l;j>=0;j--)</p><p><b>  {</b></p><p>  cout<<cidao[j]<<" ";</p><p><b>  }</b></p><p>  sum+=cidao[m-1]-cidao

42、[0];</p><p><b>  }</b></p><p><b>  }</b></p><p>  ave=(float)(sum)/(float)(m);</p><p>  cout<<endl;</p><p>  cout<<&quo

43、t;平均尋道長度: "<<ave<<endl;</p><p><b>  }</b></p><p>  /*****************************掃描調(diào)度算法*******************************/</p><p>  void SCAN(int cidao[],i

44、nt m) //先要給出當(dāng)前磁道號(hào)和移動(dòng)臂的移動(dòng)方向</p><p><b>  {</b></p><p><b>  int k=1;</b></p><p>  int now,l,r,d;</p><p>  int i,j,sum=0;</p><p><

45、;b>  int a;</b></p><p>  char str[100];</p><p>  float ave;</p><p>  cidao=bubble(cidao,m); //調(diào)用冒泡排序算法排序</p><p>  cout<<"請輸入當(dāng)前的磁道號(hào):";</p&

46、gt;<p>  D: cin>>str; //對輸入數(shù)據(jù)進(jìn)行有效性判斷</p><p>  a=decide(str);</p><p><b>  if(a==0)</b></p><p><b>  {</b></p><p>  cout<<"

47、;輸入數(shù)據(jù)的類型錯(cuò)誤,請重新輸入!"<<endl;</p><p><b>  goto D;</b></p><p><b>  }</b></p><p><b>  else </b></p><p>  now=trans(str,a); //

48、輸入當(dāng)前磁道號(hào)</p><p>  if(cidao[m-1]<=now) //若當(dāng)前磁道號(hào)大于請求序列中最大者,則直接由外向內(nèi)依次給予各請求服務(wù),此情況同最短尋道優(yōu)先</p><p><b>  { </b></p><p>  cout<<"磁盤掃描序列為:";</p><

49、p>  for(i=m-1;i>=0;i--)</p><p>  cout<<cidao[i]<<" ";</p><p>  sum=now-cidao[0];</p><p><b>  }</b></p><p>  if(cidao[0]>=now)

50、 //若當(dāng)前磁道號(hào)小于請求序列中最小者,則直接由內(nèi)向外依次給予各請求服務(wù),此情況同最短尋道優(yōu)先</p><p><b>  { </b></p><p>  cout<<"磁盤掃描序列為:"; </p><p>  for(i=0;i<m;i++)</p><p>  c

51、out<<cidao[i]<<" ";</p><p>  sum=cidao[m-1]-now;</p><p><b>  }</b></p><p>  if(now>cidao[0]&&now<cidao[m-1]) //若當(dāng)前磁道號(hào)大于請求序列中最小者且小于最

52、大者</p><p><b>  {</b></p><p>  while(cidao[k]<now)</p><p><b>  {</b></p><p><b>  k++;</b></p><p><b>  }</b&g

53、t;</p><p><b>  l=k-1;</b></p><p><b>  r=k;</b></p><p>  cout<<"請輸入當(dāng)前移動(dòng)臂的移動(dòng)的方向 (1 表示向外 ,0表示向內(nèi)) : ";</p><p><b>  cin>>

54、d;</b></p><p>  if(d==0) //選擇移動(dòng)臂方向向內(nèi),則先向內(nèi)掃描</p><p><b>  {</b></p><p>  cout<<"磁盤掃描序列為:";</p><p>  for(j=l;j>=0;j--)</p>

55、<p><b>  {</b></p><p>  cout<<cidao[j]<<" "; //輸出向內(nèi)掃描的序列</p><p><b>  }</b></p><p>  for(j=r;j<m;j++) //磁頭移動(dòng)到最小號(hào),則改變方向向外掃描未

56、掃描的磁道</p><p><b>  {</b></p><p>  cout<<cidao[j]<<" "; //輸出向外掃描的序列</p><p><b>  }</b></p><p>  sum=now-2*cidao[0]+cidao[m

57、-1];</p><p><b>  }</b></p><p>  else //選擇移動(dòng)臂方向向外,則先向外掃描</p><p><b>  {</b></p><p>  cout<<"磁盤掃描序列為:";</p><p>  f

58、or(j=r;j<m;j++)</p><p><b>  {</b></p><p>  cout<<cidao[j]<<" "; //輸出向外掃描的序列</p><p><b>  }</b></p><p>  for(j=l;j>=

59、0;j--) //磁頭移動(dòng)到最大號(hào),則改變方向向內(nèi)掃描未掃描的磁道</p><p><b>  {</b></p><p>  cout<<cidao[j]<<" ";</p><p><b>  }</b></p><p>  sum=-now-c

60、idao[0]+2*cidao[m-1];</p><p><b>  }</b></p><p><b>  } </b></p><p>  ave=(float)(sum)/(float)(m);</p><p>  cout<<endl;</p><p>

61、;  cout<<"平均尋道長度: "<<ave<<endl;</p><p><b>  }</b></p><p>  /************************循環(huán)掃描調(diào)度算法*****************************/</p><p>  void CSCA

62、N(int cidao[],int m)</p><p><b>  {</b></p><p><b>  int k=1;</b></p><p>  int now,l,r;</p><p>  int i,j,sum=0;</p><p><b>  int

63、 a;</b></p><p>  char str[100];</p><p>  float ave;</p><p>  cidao=bubble(cidao,m); //調(diào)用冒泡排序算法排序</p><p>  cout<<"請輸入當(dāng)前的磁道號(hào):"; </p><p

64、>  E: cin>>str; //對輸入數(shù)據(jù)進(jìn)行有效性判斷</p><p>  a=decide(str);</p><p><b>  if(a==0)</b></p><p><b>  {</b></p><p>  cout<<"輸入數(shù)據(jù)的類型錯(cuò)誤

65、,請重新輸入!"<<endl;</p><p><b>  goto E;</b></p><p><b>  }</b></p><p><b>  else </b></p><p>  now=trans(str,a); //輸入當(dāng)前磁道號(hào)<

66、;/p><p>  if(cidao[m-1]<=now) //若當(dāng)前磁道號(hào)大于請求序列中最大者,則直接將移動(dòng)臂移動(dòng)到最小號(hào)磁道依次向外給予各請求服務(wù) </p><p><b>  {</b></p><p>  cout<<"磁盤掃描序列為:";</p><p>  for(i=0

67、;i<m;i++)</p><p>  cout<<cidao[i]<<" ";</p><p>  sum=now-2*cidao[0]+cidao[m-1];</p><p><b>  }</b></p><p>  if(cidao[0]>=now) //若

68、當(dāng)前磁道號(hào)小于請求序列中最小者,則直接由內(nèi)向外依次給予各請求服務(wù),此情況同最短尋道優(yōu)先</p><p><b>  {</b></p><p>  cout<<"磁盤掃描序列為:";</p><p>  for(i=0;i<m;i++)</p><p>  cout<<c

69、idao[i]<<" ";</p><p>  sum=cidao[m-1]-now;</p><p><b>  }</b></p><p>  if(now>cidao[0]&&now<cidao[m-1]) //若當(dāng)前磁道號(hào)大于請求序列中最小者且小于最大者</p>

70、<p><b>  {</b></p><p>  cout<<"磁盤掃描序列為:";</p><p>  while(cidao[k]<now) //單向反復(fù)地從內(nèi)向外掃描</p><p><b>  {</b></p><p><b&

71、gt;  k++;</b></p><p><b>  }</b></p><p><b>  l=k-1;</b></p><p><b>  r=k;</b></p><p>  for(j=r;j<m;j++)</p><p>&

72、lt;b>  {</b></p><p>  cout<<cidao[j]<<" "; //輸出從當(dāng)前磁道向外掃描的序列</p><p><b>  }</b></p><p>  for(j=0;j<r;j++) //當(dāng)掃描完最大號(hào)磁道,磁頭直接移動(dòng)到最小號(hào)磁

73、道,再向外掃描未掃描的磁道</p><p><b>  {</b></p><p>  cout<<cidao[j]<<" ";</p><p><b>  }</b></p><p>  sum=2*cidao[m-1]+cidao[l]-now-2*c

74、idao[0];</p><p><b>  }</b></p><p>  ave=(float)(sum)/(float)(m);</p><p>  cout<<endl;</p><p>  cout<<"平均尋道長度: "<<ave<<endl

75、;</p><p><b>  }</b></p><p>  void main()</p><p><b>  {</b></p><p><b>  int a;</b></p><p>  int c; //菜單項(xiàng)</p>

76、<p>  int cidao[maxsize];</p><p>  int i=0,count;</p><p>  char str[100];</p><p>  cout<<"請輸入磁道序列(0結(jié)束):"<<endl;</p><p>  A:cin>>str;

77、 //對輸入數(shù)據(jù)進(jìn)行有效性判斷</p><p>  a=decide(str);</p><p><b>  if(a==0)</b></p><p><b>  {</b></p><p>  cout<<"輸入數(shù)據(jù)的類型錯(cuò)誤,請重新輸入!"<<endl

78、;</p><p>  goto A;//輸入錯(cuò)誤,跳轉(zhuǎn)到A,重新輸入</p><p><b>  }</b></p><p><b>  else</b></p><p>  cidao[i]=trans(str,a);</p><p><b>  i++;&l

79、t;/b></p><p>  while(cidao[i-1]!=0)</p><p><b>  {</b></p><p>  cin>>str; //對輸入數(shù)據(jù)進(jìn)行有效性判斷</p><p>  a=decide(str);</p><p><b>  if(

80、a==0)</b></p><p>  cout<<"輸入數(shù)據(jù)的類型錯(cuò)誤,請重新輸入!"<<endl;</p><p><b>  else</b></p><p><b>  { </b></p><p>  cidao[i]=trans(s

81、tr,a);</p><p><b>  i++;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  count=i-1; //要訪問的磁道數(shù)</p><p>  cout<<

82、"你輸入的磁道序列為:";</p><p>  for(i=0;i<count;i++) </p><p><b>  {</b></p><p>  cout<<cidao[i]<<" "; //輸出磁道序列</p><p><b

83、>  }</b></p><p>  cout<<endl;</p><p><b>  while(1)</b></p><p>  {//本系統(tǒng)最終解釋權(quán)歸黃淮·計(jì)科0901所有</p><p>  cout<<endl;</p><p> 

84、 cout<<"**********************************************"<<endl;</p><p>  cout<<"****** 系統(tǒng)菜單 ******"<<endl;</p><p>  cout<<

85、;"**********************************************"<<endl;</p><p>  cout<<"*** ***"<<endl;</p><p>  cout<<"*

86、* 1. 先來先服務(wù)算法 **"<<endl;</p><p>  cout<<"** **"<<endl;</p><p>  cout<<"**

87、2. 最短尋道時(shí)間優(yōu)先算法 **"<<endl;</p><p>  cout<<"** **"<<endl;</p><p>  cout<<"** 3. 掃描算法

88、 **"<<endl;</p><p>  cout<<"** **"<<endl;</p><p>  cout<<"** 4. 循環(huán)掃描算法 **"

89、<<endl;</p><p>  cout<<"** **"<<endl;</p><p>  cout<<"** 5. 退出 **"<<en

90、dl;</p><p>  cout<<"*** ***"<<endl;</p><p>  cout<<"**********************************************"<<endl;</

91、p><p>  cout<<"**********************************************"<<endl;</p><p>  G:cout<<"請選擇算法:";</p><p>  F:cin>>str; //對輸入數(shù)據(jù)進(jìn)行有效性判斷</p&

92、gt;<p>  a=decide(str);</p><p><b>  if(a==0)</b></p><p><b>  {</b></p><p>  cout<<"輸入數(shù)據(jù)的類型錯(cuò)誤,請重新輸入!"<<endl;</p><p>

93、  goto F;//輸入錯(cuò)誤,跳轉(zhuǎn)到F,重新輸入</p><p><b>  }</b></p><p><b>  else</b></p><p>  c=trans(str,a);</p><p><b>  if(c==5)</b></p><p

94、><b>  break;</b></p><p><b>  if(c>5)</b></p><p><b>  {</b></p><p>  cout<<"數(shù)據(jù)輸入錯(cuò)誤!請重新輸入"<<endl;</p><p>&

95、lt;b>  goto G;</b></p><p><b>  }</b></p><p><b>  switch(c)</b></p><p><b>  {</b></p><p>  case 1: //使用FCFS算法</p>

96、<p>  FCFS(cidao,count);</p><p><b>  break;</b></p><p>  case 2: //使用SSTF算法</p><p>  SSTF(cidao,count);</p><p><b>  break;</b></p>

97、<p>  case 3: //使用SCAN算法</p><p>  SCAN(cidao,count);</p><p><b>  break;</b></p><p>  case 4: //使用CSCAN算法</p><p>  CSCAN(cidao,count);</p>

溫馨提示

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

最新文檔

評論

0/150

提交評論