n-step-scan_磁盤調度_操作系統(tǒng)課程設計_第1頁
已閱讀1頁,還剩25頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p><b>  課 程 設 計</b></p><p><b> ?。ú僮飨到y(tǒng))</b></p><p>  題  目:  N-Step-SCAN 磁盤調度</p><p>  班  級: 計算機科學與技術學院 計算機系 10-8班</p><p>  姓  名:      

2、 </p><p>  指導教師:     </p><p>  系主任: </p><p>  2013年03月01日</p><p><b>  目 錄</b></p><p>  1N-Step-SCAN 磁盤調度課程設計</p><p>  1.

3、1 題目分析1</p><p>  1.2 數據結構1</p><p><b>  1.3 流程圖1</b></p><p>  1.4 實現技術2</p><p>  1.5 設計結論和心得2</p><p>  2 Linux代碼分析4</p><p>  

4、2.1 功能說明18</p><p>  2.2 接口說明.18</p><p>  2.3 局部數據結構.......20</p><p>  2.4 流程圖.....21</p><p>  2.5 以實例說明運行過程.........................................................

5、.............................22</p><p>  2.5 以實例說明運行過程5</p><p>  1N-Step-SCAN磁盤調度課程設計</p><p><b>  題目分析</b></p><p>  當有一個或者幾個進程對某一磁道有較高的訪問頻率,即這些進程反復請求對某一磁道的

6、I/O操作,從而壟斷整個磁盤設備。在高密度的磁盤上容易出現此情況。N步SCAN算法是將磁道請求隊列若干個長度為N的子隊列。而每處理一個隊列時又是按SCAN算法,對一個隊列處理完后,再處理其他隊列。</p><p><b>  數據結構</b></p><p>  N-Step-SCAN磁盤調度中涉及的數據結構包括N個隊列、隊列緩沖區(qū)、表示空緩沖區(qū)的信號量、表示滿緩沖區(qū)

7、的信號量…等。</p><p><b>  用偽代碼表示如下:</b></p><p>  #include"stdio.h"</p><p>  #include"stdlib.h"</p><p>  //#include"iostream.h"</p

8、><p>  #define maxsize 100 //定義最大數組域</p><p>  int now,s;</p><p>  void SSTF(int array[],int m)</p><p><b>  {</b></p><p><b>  int temp;</b

9、></p><p><b>  int k=1;</b></p><p>  int now,l,r; //當前磁道號now;找出的當前磁道左側的磁道l,右側的磁道r</p><p>  int i,j,sum=0;</p><p><b>  int avg;</b></p>

10、<p>  for(i=0;i<m;i++)</p><p><b>  {</b></p><p>  for(j=i+1;j<m;j++)//對磁道號進行從小到大排列</p><p><b>  {</b></p><p>  if(array[i]>array[

11、j])//兩磁道號之間比較</p><p><b>  {</b></p><p>  temp=array[i];</p><p>  array[i]=array[j];</p><p>  array[j]=temp;</p><p><b>  }</b></p

12、><p><b>  }</b></p><p><b>  }</b></p><p>  for( i=0;i<m;i++)//輸出排序后的磁道號數組</p><p><b>  {</b></p><p>  printf("%d &

13、quot;,array[i]);</p><p><b>  }</b></p><p>  printf("\n 請輸入當前的磁道號:");</p><p>  scanf("%d",&now);</p><p>  printf("\n SSTF調度結果:

14、");</p><p>  if(array[m-1]<=now)//判斷整個數組里的數是否都小于當前磁道號</p><p><b>  { </b></p><p>  for(i=m-1;i>=0;i--)//將數組磁道號從大到小輸出</p><p>  printf("%d &

15、quot;,array[i]);</p><p>  sum=now-array[0];//計算移動距離</p><p><b>  }</b></p><p>  else if(array[0]>=now)//判斷整個數組里的數是否都大于當前磁道號</p><p><b>  { </b>

16、</p><p>  for(i=0;i<m;i++)//將磁道號從小到大輸出</p><p>  printf("%d ",array[i]);</p><p>  sum=array[m-1]-now;//計算移動距離</p><p><b>  }</b></p><

17、p><b>  else</b></p><p><b>  {</b></p><p>  while(array[k]<now)//逐一比較以確定K值</p><p><b>  {</b></p><p><b>  k++;</b>&l

18、t;/p><p><b>  }</b></p><p><b>  l=k-1;</b></p><p><b>  r=k;</b></p><p>  //確定當前磁道在已排的序列中的位置</p><p>  while((l>=0)&&

19、amp;(r<m))</p><p><b>  {</b></p><p>  if((now-array[l])<=(array[r]-now))//判斷最短距離</p><p><b>  { </b></p><p>  printf("%d ",arr

20、ay[l]);</p><p>  sum+=now-array[l];//計算移動距離</p><p>  now=array[l];</p><p><b>  l=l-1;</b></p><p><b>  }</b></p><p><b>  else&

21、lt;/b></p><p><b>  { </b></p><p>  printf("%d ",array[r]);</p><p>  sum+=array[r]-now;//計算移動距離</p><p>  now=array[r];</p><p><

22、;b>  r=r+1;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  if(l==-1)</b></p><p><b>  { </b></p>&

23、lt;p>  for(j=r;j<m;j++)</p><p><b>  { </b></p><p>  printf("%d ",array[j]);</p><p><b>  }</b></p><p>  sum+=array[m-1]-array[

24、0];//計算移動距離</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  { </b></p><p>  for(j=l;j>=0;j--)</p><p><b> 

25、 { </b></p><p>  printf("%d ",array[j]);</p><p><b>  }</b></p><p>  sum+=array[m-1]-array[0];//計算移動距離</p><p><b>  }</b></p

26、><p><b>  }</b></p><p>  avg=sum/m;</p><p>  printf("\n 移動的總道數: %d \n",sum);</p><p>  printf(" 平均尋道長度: %d \n",avg);</p><p><

27、;b>  }</b></p><p>  void SCAN(int array[],int m,int d)//先要給出當前磁道號和移動臂的移動方向</p><p><b>  {</b></p><p><b>  int k=1;</b></p><p><b> 

28、 int l,r;</b></p><p>  int i,j,sum=0;</p><p><b>  int avg;</b></p><p>  int temp; //用于排序的臨時參數</p><p><b>  int q;</b></p><p>

29、;  for(i=0;i<m;i++)</p><p><b>  {</b></p><p>  for(j=i+1;j<m;j++)</p><p><b>  {</b></p><p>  if(array[i]>array[j])//對磁道號進行從小到大排列</p&

30、gt;<p><b>  {</b></p><p>  temp=array[i];</p><p>  array[i]=array[j];</p><p>  array[j]=temp;</p><p><b>  }</b></p><p><b

31、>  }</b></p><p><b>  }</b></p><p>  if(array[m-1]<=now)//判斷整個數組里的數是否都小于當前磁道號</p><p><b>  { </b></p><p>  printf("\n SCAN調度結果:

32、 ");</p><p>  for(i=m-1;i>=0;i--)</p><p><b>  {</b></p><p>  printf("%d ",array[i]);//將數組磁道號從大到小輸出</p><p>  q=array[i];</p><p

33、><b>  }</b></p><p>  sum=now-q;//計算移動距離</p><p><b>  s=s+sum;</b></p><p><b>  now=q;</b></p><p><b>  }</b></p>

34、<p>  else if(array[0]>=now)//判斷整個數組里的數是否都大于當前磁道號</p><p><b>  { </b></p><p>  printf("\n SCAN調度結果: ");</p><p>  for(i=0;i<m;i++)</p><p

35、><b>  {</b></p><p>  printf("%d ",array[i]);//將磁道號從小到大輸出</p><p>  q=array[i];</p><p><b>  }</b></p><p>  sum=array[m-1]-now;//計算移動

36、距離</p><p><b>  s=s+sum;</b></p><p><b>  now=q;</b></p><p><b>  }</b></p><p><b>  else</b></p><p><b> 

37、 {</b></p><p>  while(array[k]<now)//逐一比較以確定K值</p><p><b>  {</b></p><p><b>  k++;</b></p><p><b>  }</b></p><p>

38、;<b>  l=k-1;</b></p><p><b>  r=k;</b></p><p>  printf("\n SCAN調度結果: ");</p><p><b>  if(d==0)</b></p><p><b>  {</

39、b></p><p>  for(j=l;j>=0;j--)</p><p><b>  {</b></p><p>  printf("%d ",array[j]);</p><p>  q=array[j];</p><p><b>  }</

40、b></p><p>  for(j=r;j<m;j++)</p><p><b>  {</b></p><p>  printf("%d ",array[j]);</p><p>  q=array[j];</p><p><b>  }</b

41、></p><p>  sum=now-2*array[0]+array[m-1];//計算移動距離</p><p><b>  s=s+sum;</b></p><p><b>  now=q;</b></p><p>  }//磁道號減小方向</p><p><

42、;b>  else</b></p><p><b>  {</b></p><p>  for(j=r;j<m;j++)</p><p><b>  {</b></p><p>  printf("%d ",array[j]);</p>&

43、lt;p>  q=array[j];</p><p><b>  }</b></p><p>  for(j=l;j>=0;j--)</p><p><b>  {</b></p><p>  printf("%d ",array[j]);</p>&

44、lt;p>  q=array[j];</p><p><b>  }</b></p><p>  sum=-now-array[0]+2*array[m-1];//計算移動距離</p><p><b>  s=s+sum;</b></p><p><b>  now=q;</b

45、></p><p>  }//磁道號增加方向</p><p><b>  }</b></p><p>  avg=sum/m;</p><p>  printf("\n 該子隊列移動的總道數: %d \n",sum);</p><p>  printf(" 該子

46、隊列平均尋道長度: %d \n",avg);</p><p><b>  }</b></p><p>  void NStepSCAN(int array[],int m)</p><p><b>  { </b></p><p>  int sn,N,d; //sn標記每一子

47、隊列的長度,N記錄子隊列個數,now標記當前磁道號</p><p>  int b[100],c[100]; //b[100]儲存前幾個子隊列,c[100]儲存最后一個子隊列</p><p>  int i=0,j=0,k=0,n=1;</p><p><b>  int ave; </b></p><p>  pri

48、ntf("請輸入當前磁道號:\n");</p><p>  scanf("%d",&now);</p><p>  printf("請輸入子隊列的個數:\n");</p><p>  scanf("%d",&N);</p><p>  while(

49、N<1||N>m)</p><p><b>  {</b></p><p>  printf("超出范圍,文件中的磁道數不夠分組,請重新輸入:\n");</p><p>  scanf("%d",&N);</p><p><b>  }</b&g

50、t;</p><p>  printf("請輸入當前移動臂的移動的方向 (1 磁道號增加方向,0磁道號減小方向) : ");</p><p>  scanf("%d",&d); </p><p><b>  sn=m/N;</b></p><p>  while(N!=1)

51、 //當不是最后一個子隊列時,循環(huán)進行SCAN調度</p><p><b>  {</b></p><p><b>  j=0;</b></p><p>  for(i=k;i<sn*n;i=k,j++)</p><p><b>  {</b></p>

52、;<p>  b[j]=array[i];</p><p><b>  k=k+1;</b></p><p><b>  }</b></p><p>  printf("\n第%d個隊列的排序結果為:\n",n); </p><p>  SCAN(b,sn,d);&

53、lt;/p><p><b>  N=N-1;</b></p><p><b>  n=n+1;</b></p><p><b>  }</b></p><p>  if(N==1) //最后一個子隊列時進行SCAN調度</p><p><

54、;b>  {</b></p><p>  for(i=k,j=0;i<m;i++,j++)</p><p><b>  {</b></p><p>  c[j]=array[i];</p><p><b>  }</b></p><p>  print

55、f("\n最后一個隊列的調度結果為:\n");</p><p>  SCAN(c,m-k,d);</p><p><b>  }</b></p><p><b>  ave=s/m;</b></p><p>  printf("\n該調度總的結果為:\n");

56、</p><p>  printf("\n 移動的總道數: %d \n",s);</p><p>  printf(" 平均尋道長度: %d \n",ave);</p><p><b>  }</b></p><p>  int main()</p><p>

57、;<b>  {</b></p><p><b>  int c;</b></p><p><b>  int C=1;</b></p><p>  FILE *fp;//定義指針文件</p><p>  int cidao[maxsize];//定義磁道號數組</p&g

58、t;<p>  int i=0,count;</p><p>  fp=fopen("cidao.txt","r+");//讀取cidao.txt文件</p><p>  if(fp==NULL)//判斷文件是否存在</p><p><b>  {</b></p><p&

59、gt;  printf("\n 請 先 設 置 磁 道! \n");</p><p><b>  exit(0);</b></p><p><b>  }</b></p><p>  while(!feof(fp))//如果磁道文件存在</p><p><b>  {&

60、lt;/b></p><p>  fscanf(fp,"%d",&cidao[i]);//調入磁道號</p><p><b>  i++;</b></p><p><b>  }</b></p><p><b>  count=i;</b>&l

61、t;/p><p>  printf("\n --------------------------------------------------\n");</p><p>  printf(" 磁盤調度算法模擬");</p><p>  printf("\n -------------------------

62、-------------------------\n");</p><p>  printf("\n 磁道讀取結果:\n");</p><p>  for(i=0;i<count;i++)</p><p><b>  {</b></p><p>  printf("%5d&

63、quot;,cidao[i]);//輸出讀取的磁道的磁道號</p><p><b>  }</b></p><p>  printf("\n ");</p><p>  while(C==1)</p><p><b>  {</b></p>&l

64、t;p>  printf(" ║ 操作系統(tǒng)課程設計 ║ \n");</p><p>  printf(" ╭═════┤ 磁盤調度算法 ├═════╮ \n ");</p><p>  printf(" ║

65、 1.返回 ║ \n");</p><p>  printf(" ║ 2.N步掃描算法(NStepScan) ║ \n");</p><p>  printf(" ╰═┤ 請輸入你的選擇的算法(輸

66、入0離開) ├═╯ \n");</p><p>  scanf("%d",&c);</p><p>  if(c==0) exit(0);</p><p>  printf(" ");</p><p>  while(c!=1&&c!=2)</p>

67、;<p><b>  {</b></p><p>  printf("輸入數據超出范圍,請重新輸入您想進行的調度算法:\n");</p><p>  scanf("%d",&c);</p><p><b>  }</b></p><p>

68、<b>  switch(c)</b></p><p><b>  {</b></p><p><b>  case 1:</b></p><p>  SSTF(cidao,count);//最短尋道時間優(yōu)先算法</p><p>  printf("\n")

69、;</p><p><b>  break;</b></p><p><b>  case 2:</b></p><p><b>  i=0;</b></p><p>  fp=fopen("cidao.txt","r+");//讀取ci

70、dao.txt文件</p><p>  if(fp==NULL)//判斷文件是否存在</p><p><b>  {</b></p><p>  printf("\n 請 先 設 置 磁 道! \n");</p><p><b>  exit(0);</b></p>

71、<p><b>  }</b></p><p>  while(!feof(fp))//如果磁道文件存在</p><p><b>  {</b></p><p>  fscanf(fp,"%d",&cidao[i]);//調入磁道號</p><p><b

72、>  i++;</b></p><p><b>  }</b></p><p><b>  count=i;</b></p><p>  printf("\n 磁道讀取結果:\n");</p><p>  for(i=0;i<count;i++)</

73、p><p><b>  {</b></p><p>  printf("%5d",cidao[i]);//輸出讀取的磁道的磁道號</p><p><b>  }</b></p><p>  printf("\n ");</p><p>  

74、NStepSCAN(cidao,count);//N步掃描算法</p><p>  printf("\n");</p><p><b>  break;</b></p><p><b>  }</b></p><p>  printf(" 是否繼續(xù)(按0結束,按1繼續(xù))

75、?");</p><p>  scanf("%5d",&C);</p><p><b>  }</b></p><p>  return(0);</p><p><b>  流程圖</b></p><p><b>  實現技術&

76、lt;/b></p><p>  為實現上述設計,采用C++語言,VS2008開發(fā)環(huán)境。</p><p><b>  運行結果如下:</b></p><p><b>  設計結論和心得</b></p><p>  通過課程設計得到如下結論:</p><p>  在N步掃

77、描算法中,還出現了這樣一個問題。就是,在對磁道號進行分組時,最后一列的處理問題。在開始時由于籠統(tǒng)地進行了平均分組,而沒有考慮無法完全分盡的情況,進而導致最后一個甚至一些磁道號丟失的問題。不過最后,在單列最后一組后(即將最后一組與前面各組分開后)問題得到了解決。將余下的一個或一些磁道號全部加至最后一列末尾,很好地處理了數據丟失問題</p><p>  有如下幾點心得體會:</p><p> 

78、 通過這次的課程設計使我認識到要將操作系統(tǒng)這門計算機專業(yè)的課學好不僅僅是要把書上的基本知識學好而且還要不斷進行實踐,將所學的跟實踐操作結合起來才能更好地鞏固所學,才能提高自己實踐能力.通過這次的設計使我認識到只停留在表面理解問題是很難使問題得到很好的解決的,實踐能力與理論知識同樣重要??梢哉f此課程設計的理論難度并不大,但是若要深入發(fā)掘其中的東西,并且實際去編程實現,就遇到了相當大的難度。因為與之涉及的很多方面并沒有學過,需要自己去自學和

79、實踐檢驗。通過模擬磁盤調度及進程排隊算法來加深對操作系統(tǒng)中各個磁臂調度算法概念的理解。模擬磁盤調度算法(SSTF,NstepSCAN),實現各種不同調度算法的過程,并計算各算法的平均尋道長度,以便于我們判斷各種算法的優(yōu)劣以及各種算法使用的場合。</p><p>  2 Linux代碼分析</p><p>  為了進一步了解操作系統(tǒng)內核,學習了Linux操作系統(tǒng)的進程同步程序,主要程序源代碼

80、如下:</p><p>  #!/bin/sh </p><p>  # Author: Guo Wenxue(guowenxue@gmail.com) </p><p>  # Date: Wen Mar 5 17:56:44 CST 2013 </p><p>  # Version: 1.0.

81、0 </p><p>  # Description: This shell script used to format all the source code in current forlder </p><p>  # and convert source code file format from windows to linux </p&

82、gt;<p>  find -iname "*.c" -exec dos2unix {} \; </p><p>  find -iname "*.h" -exec dos2unix {} \; </p><p>  find -iname "makefile" -exec dos2unix {} \; <

83、;/p><p>  find -iname "Makefile" -exec dos2unix {} \;</p><p>  # -npro 不要讀取indent的配置文件.indent.pro </p><p>  # -kr 使用Kernighan&Ritchie的格式 </p><p>  #

84、-i4 設置縮排的格數為4 </p><p>  # -di28 將聲明區(qū)段的變量置于指定的欄位(28) </p><p>  # -ts4 設置tab的長度為4 </p><p>  # -bls 定義結構,"struct"和"{"分行 </p><p>  # -

85、bl if(或是else,for等等)與后面執(zhí)行區(qū)段的”{“不同行,且”}”自成一行。 </p><p>  # -bli0 設置{ }縮排的格數為0 </p><p>  # -cli2 使用case時,switch縮排的格數 </p><p>  # -ss 若for或whiile區(qū)段只有一行時,在分號前加上空格 </p&

86、gt;<p>  # -bad 在聲明區(qū)段后加上空白行 </p><p>  # -bbb 塊注釋前加空行 </p><p>  # -bap 函數結束后加空行 </p><p>  # -sc 在每行注釋左側加上星號(*)。 </p><p>  # -bc 在聲明區(qū)段中,若出現逗號即

87、換行。 </p><p>  # -sob 刪除多余的空白行 </p><p>  # -l100 非注釋行最長100 </p><p>  # -ncs 不要在類型轉換后面加空格 </p><p>  # -nce 不要將else置于”}”之后 </p><p>  # -nut

88、 不要使用tab來縮進 </p><p>  INDET_FORMAT="-npro -kr -i4 -ts4 -bls -bl -bli0 -cli2 -ss -bap -sc -sob -l100 -ncs -nce -nut" </p><p>  find -iname "*.c" -exec indent $INDET_FORMAT {

89、} \; </p><p>  find -iname "*.h" -exec indent $INDET_FORMAT {} \; </p><p>  find -iname "*.h~" | xargs rm -rf {} \;</p><p><b>  功能說明</b></p>

90、<p>  這一段程序的主要功能為:</p><p> ?。?)在 /usr/sbin/目錄下創(chuàng)建format_sg文件</p><p> ?。?)更改其屬性為777</p><p><b>  接口說明</b></p><p>  本程序的輸入參數為:INDET_FORMAT="-npro -kr

91、 -i4 -ts4 -bls -bl -bli0 -cli2 -ss -bap -sc -sob -l100 -ncs -nce -nut" </p><p><b>  局部數據結構</b></p><p>  本程序共有6個局部變量及數據結構,其類型定義及語義如下:</p><p>  -npro 不要讀取indent的配置文

92、件.indent.pro </p><p>  # -kr 使用Kernighan&Ritchie的格式 </p><p>  # -i4 設置縮排的格數為4 </p><p>  # -di28 將聲明區(qū)段的變量置于指定的欄位(28) </p><p>  find -iname "*.c&quo

93、t; -exec dos2unix {} \; </p><p>  find -iname "*.h" -exec dos2unix {} \; </p><p>  find -iname "makefile" -exec dos2unix {} \; </p><p>  find -iname "Mak

94、efile" -exec dos2unix {} \;</p><p><b>  流程圖</b></p><p><b>  本程序的流程圖所示</b></p><p><b>  圖2 程序流程圖</b></p><p><b>  2.5 實例說明:&

95、lt;/b></p><p><b>  format_sg</b></p><p>  [root@ShiGuang songjingbing]# format_sgdos2unix: converting file ./tcp_process.c to UNIX format ...dos2unix: converting file ./tcp_clie

96、nt.c to UNIX format ...dos2unix: converting file ./tcp_server.c to UNIX format ...dos2unix: converting file ./Makefile to UNIX format ...dos2unix: converting file ./Makefile to UNIX format ...[root@ShiGuang songjingb

溫馨提示

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

評論

0/150

提交評論