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

下載本文檔

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

文檔簡介

1、<p><b>  課 程 設(shè) 計(jì)</b></p><p><b> ?。ú僮飨到y(tǒng))</b></p><p>  題  目:  CSCAN磁盤調(diào)度算法</p><p>  班  級(jí): 計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院 計(jì)算機(jī)系 10-8班</p><p>  姓  名:        <

2、;/p><p>  指導(dǎo)教師:         </p><p>  系主任: </p><p>  2013年03月01日</p><p><b>  目 錄</b></p><p>  1CSCAN磁盤調(diào)度算法問題課程設(shè)計(jì)1</p><p>  1

3、.1 題目分析1</p><p>  1.2 數(shù)據(jù)結(jié)構(gòu)1</p><p><b>  1.3 流程圖1</b></p><p>  1.4 實(shí)現(xiàn)技術(shù)2</p><p>  1.5 設(shè)計(jì)結(jié)論和心得2</p><p>  2 Linux代碼分析4</p><p> 

4、 2.1 功能說明4</p><p>  2.2 接口說明4</p><p>  2.3 局部數(shù)據(jù)結(jié)構(gòu)4</p><p><b>  2.4 流程圖4</b></p><p>  2.5 以實(shí)例說明運(yùn)行過程5</p><p>  1CSCAN磁盤調(diào)度算法問題課程設(shè)計(jì)</p>

5、<p><b>  分析題目 </b></p><p>  將queue[n]進(jìn)行由小到大的排序,首先定位當(dāng)前調(diào)度磁headstarts在queue[n]的位置,然后在此位置按給定的方向遍歷queue[n],當(dāng)?shù)蓝它c(diǎn)(queue[0]或queue[n-1])時(shí),反向到另一端點(diǎn)再以此方向進(jìn)行遍歷,直到queue[n]中所有都調(diào)度完。當(dāng)調(diào)度磁道不在queue端點(diǎn)時(shí),總的尋道長度為為前

6、一個(gè)磁道與后一個(gè)磁道差值的累加,當(dāng)?shù)竭_(dá)端點(diǎn)且queue[n]未全調(diào)度時(shí),總尋道長度加上端點(diǎn)值再加上磁盤磁道總長度,再加上下一個(gè)調(diào)度磁道的值,再按前面的算法進(jìn)行,直到磁道全部都調(diào)度完畢,得到總的尋道長度,除以n得到平均尋道長度。</p><p><b>  數(shù)據(jù)結(jié)構(gòu)</b></p><p>  Hand:當(dāng)前磁道號(hào); DiscLine[10]:隨機(jī)生成的磁道號(hào); &

7、lt;/p><p>  void SetDI(int DiscL[])生成隨機(jī)磁道號(hào)算法; </p><p>  void CopyL(int Sour[],int Dist[] ,int x) 數(shù)組Sour復(fù)制到數(shù)組Dist復(fù)制到x個(gè)數(shù)四詳細(xì)設(shè)計(jì); </p><p>  void DelInq(int Sour[],int x,int y) 數(shù)組Sour

8、把x位置的數(shù)刪除,x后的數(shù)組元素向前挪一位. </p><p>  void PaiXu()尋道長度由低到高排序</p><p>  void CSCAN(int Han,int DiscL[])循環(huán)掃描算法(CSCAN)</p><p><b>  1.3流程圖</b></p><p><b>  實(shí)現(xiàn)技術(shù)&

9、lt;/b></p><p>  為實(shí)現(xiàn)上述設(shè)計(jì),采用C++語言,VS2008開發(fā)環(huán)境。具體采用的技術(shù)如下:</p><p><b>  循環(huán)掃描算法</b></p><p><b>  實(shí)現(xiàn)步驟如下:</b></p><p>  輸入起始磁道(你可以輸入100),點(diǎn)確定,進(jìn)入第二個(gè)界面,再輸

10、入你要輸入的最大磁道(你可以輸入50),然后點(diǎn)確定。選擇磁盤調(diào)度算法1 2 3 4中的任意一個(gè),若選擇4后確認(rèn),則隨機(jī)輸出10個(gè)小于50的磁道數(shù) :(47 26 21 38 19 12 17 49 35 44),則循環(huán)掃描算法(CSCAN):(12 17 19 21 26 35 38 44 47 49)。</p><p><b>  運(yùn)行結(jié)果如下:</b></p>

11、<p><b>  設(shè)計(jì)結(jié)論和心得</b></p><p>  通過課程設(shè)計(jì)得到如下結(jié)論:</p><p>  本次實(shí)驗(yàn)首先要了解磁盤調(diào)度的工作原理及四種調(diào)度方法的工作原理。在課程設(shè)計(jì)前的準(zhǔn)備工作時(shí),先把這部分工作做完了。在設(shè)計(jì)總的程序框架的時(shí)候,要注意各功能模塊的位置,盡量做到簡潔、有序;各功能模塊與主程序要正確銜接。 </p><p&

12、gt;  有如下幾點(diǎn)心得體會(huì):</p><p>  至此,計(jì)算機(jī)操作系統(tǒng)課程設(shè)計(jì)算法已經(jīng)完成。此次設(shè)計(jì)基本完成了所規(guī)定的功能,但由于這次設(shè)計(jì)的時(shí)間比較倉促,其中不免會(huì)有些紕漏,比如在程序的實(shí)現(xiàn)上還不夠嚴(yán)謹(jǐn),出錯(cuò)處理不夠完善等多方面問題,這些都有進(jìn)一步改善。由于平時(shí)上課不是很認(rèn)真許多概念沒有理解清楚,導(dǎo)致在做設(shè)計(jì)時(shí)有點(diǎn)無從下手的感覺,只好邊實(shí)驗(yàn)邊看書直到弄懂概念后才開始做設(shè)計(jì)導(dǎo)致時(shí)間有點(diǎn)緊張,最終在同學(xué)和老師的指

13、導(dǎo)下我完成了設(shè)計(jì),此設(shè)計(jì)基本能夠?qū)崿F(xiàn)規(guī)定的要求但是還是不夠完善,很多東西做的不夠好,程序不夠完善和嚴(yán)謹(jǐn)。此次課程設(shè)計(jì)中我學(xué)到了很多東西,無論在理論上還是實(shí)踐中,都得到不少的提高,這對(duì)于我以后的工作和學(xué)習(xí)都有一種巨大的幫助。</p><p>  #include<iostream.h></p><p>  #include<stdio.h></p>&l

14、t;p>  #include<stdlib.h></p><p>  void menu(){   </p><p>  cout<<"*********************菜單*********************"<<endl;</p><p>  cout<<

15、"******1、先來先服務(wù)算法(FCFS)      **********"<<endl;    </p><p>  cout<<"******2、最短尋道時(shí)間優(yōu)先算法(SSTF) **********"<<endl;    </p>

16、<p>  cout<<"******3、掃描算法 (SCAN)            **********"<<endl;    </p><p>  cout<<"******4、循環(huán)掃描算法 (CSC

17、AN)       **********"<<endl;    </p><p>  cout<<"******5、退出              &#

18、160;        **********"<<endl;   </p><p>  cout<<"**********************************************"<<endl;</p><p><

19、b>  }</b></p><p>  /*======================初始化序列=======================*/</p><p>  void init(int queue[],int queue_copy[],int n){   </p><p><b>  int i; 

20、;  </b></p><p>  for(i=0;i<n;++i)   </p><p>  queue[i]=queue_copy[i];</p><p><b>  }</b></p><p>  //對(duì)當(dāng)前正在執(zhí)行的磁道號(hào)進(jìn)行定位,返回磁道號(hào)小于當(dāng)前磁道中最大的一個(gè)

21、</p><p>  int fix ( int queue[], int n, int headstarts){ </p><p>  int i =0; while ( i<n && headstarts>queue[i] ) </p><p><b>  {  </b

22、></p><p><b>  i++; </b></p><p><b>  } </b></p><p>  if ( i>n-1 )  </p><p>  return n-1;     &

23、#160;  </p><p>  //當(dāng)前磁道號(hào)大于磁盤請(qǐng)求序列中的所有磁道 </p><p>  if ( i==0 )  </p><p>  return -1;         </p><p>  //當(dāng)前磁道號(hào)

24、小于磁盤請(qǐng)求序列中的所有磁道 </p><p><b>  else   </b></p><p>  return i-1;        </p><p>  //返回小于當(dāng)前磁道號(hào)中最大的一個(gè)</p><p><

25、;b>  }</b></p><p>  /*=================使用冒泡算法從小到大排序==============*/</p><p>  int *bubble(int queue[],int m)</p><p><b>  { </b></p><p><b>

26、;  int i,j;</b></p><p><b>  int temp;</b></p><p>  for( i=0; i<m;i++)</p><p>  for(j=i+1;j<m;j++)  </p><p><b>  {  

27、60;</b></p><p>  if( queue[i] > queue[j])   </p><p><b>  {    </b></p><p>  temp=queue[i];    </p>

28、<p>  queue[i]=queue[j];    </p><p>  queue[j]=temp;  </p><p><b>  }  </b></p><p><b>  }  </b></p&

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

30、;  cout<<queue[i]<<" "; </p><p><b>  }  </b></p><p>  cout<<endl;  </p><p>  return queue;</p><p><b

31、>  }</b></p><p>  /* ====================以下是FCFS算法==================*/</p><p>  void FCFS(int queue[],int n,int diskrode,int headstarts)  </p><p>  //queue是請(qǐng)求調(diào)度序列,n為其個(gè)

32、數(shù),diskroad為磁盤磁道數(shù),headstarts為正在調(diào)度的磁道</p><p><b>  {   </b></p><p>  cout<<"************以下為FCFS調(diào)度算法***********"<<endl;</p><p><b>  int

33、 i;   </b></p><p>  int count=0;   </p><p>  if ( headstarts>queue[0])    </p><p>  count +=headstarts-queue[0];   </p>

34、<p><b>  else    </b></p><p>  count+=queue[0]-headstarts;</p><p>  cout<<"調(diào)度序列為: ";       </p><p>  co

35、ut<<headstarts<<" ";    </p><p>  for(i=0;i<n-1;++i)    </p><p><b>  {      </b></p><p> 

36、 cout<<queue[i]<<" ";           </p><p>  if ( queue[i]>queue[i+1])           

37、;    </p><p>  count +=queue[i]-queue[i+1];     </p><p>  else      </p><p>  count +=queue[i+1]-queue[i];  

38、60; </p><p><b>  }    </b></p><p>  cout<<queue[i];    </p><p>  cout<<endl;    </p><p>  cout<&

39、lt;"總的尋道長度為: "<<count<<endl;       </p><p>  cout<<"平均尋道長度為: "<<float(count)/float(n)<<endl;</p><p><b>  }&l

40、t;/b></p><p>  /*=====================SSTF算法====================*/</p><p>  void SSTF( int queue[], int n, int diskrode, int headstarts)  </p><p><b>  { </b>

41、;</p><p><b>  int k=1; </b></p><p><b>  int l,r; </b></p><p>  int i,j,count=0; </p><p>  queue =bubble(queue,n);  

42、0; </p><p>  cout<<"************以下為SSTF調(diào)度算法***********"<<endl;  </p><p>  if ( queue[n-1] <=headstarts)   </p><p>  //若當(dāng)前磁道號(hào)大于請(qǐng)求序列中最大者,則

43、直接由外向內(nèi)依次給予各請(qǐng)求服務(wù)  </p><p><b>  {   </b></p><p>  cout<<"磁盤掃描序列為: ";   </p><p>  cout<<headstarts<<&quo

44、t; ";   </p><p>  for(i=n-1;i>=0;i--)     </p><p>  cout<<queue[i]<<" ";    </p><p>  count =headstar

45、ts-queue[0];  </p><p><b>  }  </b></p><p>  if ( queue[0] >=headstarts)   </p><p>  //若當(dāng)前磁道號(hào)小于請(qǐng)求序列中最小者,則直接由內(nèi)向外依次給予各請(qǐng)求服務(wù)  </

46、p><p><b>  {   </b></p><p>  cout<<"磁盤掃描序列為: ";   </p><p>  cout<<headstarts<<" ";   <

47、/p><p>  for(i=0;i<n;i++)    </p><p>  cout<<queue[i]<<" "<<endl;   </p><p>  count =queue[n-1]-headstarts;  

48、;</p><p><b>  }  </b></p><p>  if( headstarts >queue[0] && headstarts <queue[n-1])   </p><p>  //若當(dāng)前磁道號(hào)大于請(qǐng)求序列中最小者且小于最大者  <

49、/p><p><b>  {    </b></p><p>  cout<<"磁盤掃描序列為:";    </p><p>  cout<<headstarts<<" ";    &

50、lt;/p><p>  while ( queue[k] <headstarts)   </p><p>  //確定當(dāng)前磁道在已排的序列中的位置    </p><p><b>  {    </b></p><p>

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

52、<p>  while ( ( l >=0) && ( r<n))   </p><p>  //當(dāng)前磁道在請(qǐng)求序列范圍內(nèi)     </p><p><b>  {       </b></p>&

53、lt;p>  if (  (headstarts-queue[l]) <(queue-headstarts))</p><p><b>  {        </b></p><p>  cout<<queue[l]<<" ";

54、60;       </p><p>  count +=headstarts-queue[l];        </p><p>  headstarts =queue[l];       

55、  </p><p>  l=l-1;       </p><p><b>  }       </b></p><p>  else if ( (headstarts-queue[l]) ==(queue-hea

56、dstarts))       </p><p><b>  {        </b></p><p>  cout<<queue[l]<<" ";    

57、;    </p><p>  count +=headstarts-queue[l];        </p><p>  headstarts =queue[l];        </p><p&g

58、t;  l =l-1;       </p><p>  } else {          </p><p>  cout<<queue<<" ";  &#

59、160;       </p><p>  count+=queue-headstarts;       </p><p>  headstarts =queue;      </p>&

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

61、lt;b>  {</b></p><p>  //磁頭移動(dòng)到序列的最小號(hào),返回外側(cè)掃描仍未掃描的磁道     </p><p>  for ( j=r;j<n;j++)       </p><p>  {   &

62、#160;     </p><p>  cout<<queue[j]<<" ";       </p><p><b>  }        </b>&l

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

64、=l;j>=0;j--)      </p><p><b>  {       </b></p><p>  cout<<queue[j]<<" ";     

65、; </p><p><b>  }      </b></p><p>  count +=queue[n-1]-queue[0];     </p><p><b>  }    </b></p

66、><p><b>  }    </b></p><p>  cout<<endl;    </p><p>  cout<<"總的尋道長度為:  "<<count<<endl;   

67、; </p><p>  cout<<"平均尋道長度為: "<<(float)(count)/(float)(n)<<endl;  </p><p><b>  }</b></p><p>  /*======================以下是SCAN算法=====

68、===============*/</p><p>  void SCAN( int queue[], int n, int diskrode, int headstarts )</p><p><b>  { </b></p><p>  int direction, i, fixi; </p><p&

69、gt;  cout<<"***********以下是SCAN調(diào)度算法*************"<<endl; </p><p>  cout<<"請(qǐng)輸入磁頭的走向:1.由內(nèi)向外 2.由外向內(nèi)"<<endl; </p><p>  cout<<"請(qǐng)輸入磁頭的走向

70、: ";</p><p>  cin>>direction; double count=0; </p><p>  *bubble(queue,n); fixi = fix(queue,n,headstarts); </p><p>  cout<<fixi<<endl; 

71、;cout<<"調(diào)度序列為:  "<<headstarts<<" "; </p><p>  if ( fixi ==-1)      </p><p>  //  headstarts比請(qǐng)求調(diào)度序列都小 </p>

72、<p><b>  {  </b></p><p>  if ( direction ==1)  </p><p><b>  //從大到小  </b></p><p><b>  {   </b></

73、p><p>  for ( i=0;i<n;i++)   </p><p><b>  {    </b></p><p>  cout<<queue[i]<<" ";    </p&

74、gt;<p>  count +=queue[i]-headstarts;    </p><p>  headstarts =queue[i];   </p><p><b>  }  </b></p><p><b>  }&#

75、160; </b></p><p>  if ( direction ==2)  </p><p><b>  //從小到大  </b></p><p><b>  {   </b></p><p>  for (i=

76、0; i<n; i++)   </p><p><b>  {    </b></p><p>  cout<<queue[i]<<" ";    </p><p>  count +=

77、queue[i]-headstarts;    </p><p>  headstarts =queue[i];   </p><p><b>  }  </b></p><p><b>  } </b></p>

78、<p>  }  else if ( fixi ==n-1)  </p><p>  //headstarts比請(qǐng)求調(diào)度序列的都大  </p><p><b>  {   </b></p><p>  if ( direction ==1)  

79、;  </p><p><b>  {    </b></p><p>  for ( i=n-1; i>=0;i--)    </p><p><b>  {     </

80、b></p><p>  cout<<queue[i]<<" ";     </p><p>  count +=headstarts-queue[i];     </p><p>  headstarts =queu

81、e[i];    </p><p><b>  }   </b></p><p><b>  }   </b></p><p>  if ( direction ==2)    </p&g

82、t;<p><b>  //從小到大   </b></p><p><b>  {    </b></p><p>  for ( i=n-1;i>=0;i--)  </p><p>  //從大到小  

83、  </p><p><b>  {     </b></p><p>  cout<<queue[i]<<" ";     </p><p>  count +=headstart

84、s-queue[i];     </p><p>  headstarts =queue[i];    </p><p><b>  }   </b></p><p><b>  }  </

85、b></p><p>  }  else   {   </p><p>  if (direction ==1) </p><p><b>  //從大到小   </b></p><p><b>  {&#

86、160;   </b></p><p>  for ( i=fixi;i>-1;i--)    </p><p><b>  {     </b></p><p>  cout<<queue[i]

87、<<" ";     </p><p>  count +=headstarts-queue[i];        </p><p>  headstarts =queue[i];    </p

88、><p><b>  }    </b></p><p>  count +=queue[fixi+1]-queue[0];    </p><p>  //磁頭走到0再反向走    </p><p>  

89、headstarts =queue[fixi+1];    </p><p>  cout<<headstarts<<" ";    </p><p>  for ( i =fixi+2;i<n;i++)    </

90、p><p><b>  {     </b></p><p>  cout<<queue[i]<<" ";     </p><p>  count +=queue[i]-headstarts; 

91、    </p><p>  headstarts =queue[i];    </p><p><b>  }   </b></p><p><b>  }   </b></p

92、><p>  if (direction ==2) </p><p><b>  //從小到大   </b></p><p><b>  {    </b></p><p>  for ( i=fixi+1;i<n;i++)&#

93、160;   </p><p><b>  {     </b></p><p>  cout<<queue[i]<<" ";     </p><p>  count +

94、=queue[i]-headstarts;     </p><p>  headstarts =queue[i];    </p><p><b>  }       </b></p><

95、p>  headstarts =queue[fixi];    </p><p>  count +=queue[n-1]-queue[fixi];     </p><p>  //磁頭走到n-1再反向走    </p><p>  cou

96、t<<headstarts<<" ";     </p><p>  for ( i=fixi-1;i>-1;i--)     </p><p>  //從大到小    </p><p><b

97、>  {     </b></p><p>  cout<<queue[i]<<" ";     </p><p>  count +=headstarts-queue[i];    

98、60;</p><p>  headstarts =queue[i];   </p><p><b>  }   </b></p><p><b>  }  </b></p><p><b>  } 

99、 </b></p><p>  cout<<endl;  </p><p>  cout<<"總的尋道長度為: "<<count<<endl;  </p><p>  cout<<"平均尋道長度為:  &q

100、uot;<<float(count)/n<<endl;</p><p><b>  }   </b></p><p>  /*======================以下是CSCAN算法====================*/</p><p>  void CSCAN(int queue[],

101、int n,int diskrode,int headstarts)</p><p><b>  { </b></p><p>  int direction,i,fixi; cout<<"***********以下是CSCAN調(diào)度算法*************"<<endl; </p&g

102、t;<p>  cout<<"請(qǐng)輸入磁頭的走向:1.由內(nèi)向外 2.由外向內(nèi)"<<endl; </p><p>  cout<<"請(qǐng)輸入磁頭的走向: "; </p><p>  cin>>direction; int count=0;  &#

103、160;  </p><p>  //count表示磁道移動(dòng)的長度 </p><p>  *bubble(queue,n); </p><p>  fixi=fix(queue,n,headstarts); </p><p>  cout<<"調(diào)度序列為:  

104、"<<headstarts<<" "; </p><p>  if(fixi==-1)       </p><p>  //headstarts比請(qǐng)求調(diào)度序列都小 </p><p><b>  {  &

105、lt;/b></p><p>  if(direction==1)     </p><p><b>  //從大到小  </b></p><p><b>  {    </b></p><p>  co

106、unt +=queue[fixi+1]-queue[0];    </p><p>  //反向再反向   </p><p>  headstarts =queue[n-1];    </p><p>  cout<<headstarts<<"

107、 ";   </p><p>  for ( i=n-2;i>-1;--i)   </p><p><b>  {    </b></p><p>  cout<<queue[i]<<" &quo

108、t;;    </p><p>  count +=headstarts-queue[i];    </p><p>  headstarts=queue[i];   </p><p><b>  }  </b>&l

109、t;/p><p><b>  }  </b></p><p>  if(direction==2)    </p><p><b>  //從小到大  </b></p><p><b>  {  

110、0;</b></p><p>  for(i=0;i<n;++i)   </p><p><b>  {    </b></p><p>  cout<<queue[i]<<" ";  

111、0; </p><p>  count +=queue[i]-headstarts;    </p><p>  headstarts=queue[i];   </p><p><b>  }  </b></p><p>

112、<b>  } </b></p><p>  } else if(fixi==n-1)    </p><p>  //headstarts比請(qǐng)求調(diào)度序列都大 </p><p><b>  {  </b></p><p>

113、;  if(direction==1)    </p><p><b>  //從大到小  </b></p><p><b>  {   </b></p><p>  for(i=n-1;i>-1;--i)  

114、0;</p><p><b>  {    </b></p><p>  cout<<queue[i]<<" ";    </p><p>  count +=headstarts-queue[i];  

115、;  </p><p>  headstarts=queue[i];   </p><p><b>  }  </b></p><p><b>  }  </b></p><p>  if( direction

116、==2)    </p><p><b>  //從小到大  </b></p><p><b>  {   </b></p><p>  cout<<queue[0]<<" ";  

117、;  </p><p>  for(i=1;i<n;++i)   </p><p><b>  {    </b></p><p>  cout<<queue[i]<<" ";  

118、60; </p><p>  count +=queue[i]-queue[i-1];       </p><p><b>  }   </b></p><p>  count +=headstarts-queue[0]; 

119、 </p><p><b>  } </b></p><p>  } else {  </p><p>  if ( direction==1)     </p><p><b>  //從大到小 &#

120、160;</b></p><p><b>  {   </b></p><p>  for ( i=fixi;i>-1;i--)   </p><p><b>  {    </b></p>

121、<p>  cout<<queue[i]<<" ";    </p><p>  count +=headstarts-queue[i];    </p><p>  headstarts=queue[i];   </p&

122、gt;<p><b>  }   </b></p><p>  count +=queue[n-1]-queue[0];        </p><p>  //磁頭走到0時(shí)再反向...   </p><p

123、>  headstarts=queue[n-1];   </p><p>  cout<<headstarts<<" ";   for ( i=n-2;i>fixi;i--)   </p><p><b>  {  

124、  </b></p><p>  cout<<queue[i]<<" ";    </p><p>  count +=headstarts-queue[i];    </p><p>  headstarts

125、=queue[i];   </p><p><b>  }  </b></p><p><b>  }  </b></p><p>  if(direction==2)      </p>

126、<p><b>  //從小到大  </b></p><p><b>  {   </b></p><p>  for( i=fixi+1;i<n;i++)   </p><p><b>  {  

127、     </b></p><p>  if (direction==2)    </p><p>  //從小到大    </p><p>  {        &

128、#160;   </p><p>  cout<<queue[i]<<" ";        </p><p>  count +=queue[i]-headstarts;       

129、</p><p>  headstarts =queue[i];    </p><p><b>  }   </b></p><p>  }         </p><p&

130、gt;  count +=queue[n-1]-queue[0];    </p><p>  //磁頭走到n-1再反向走...   </p><p>  headstarts =queue[0];  </p><p>  cout<<headstarts<<&q

131、uot; ";   </p><p>  for(i=1;i<fixi+1;i++)   </p><p><b>  {    </b></p><p>  cout<<queue[i]<<"

132、";    </p><p>  count +=queue[i]-headstarts;   </p><p>  headstarts=queue[i];   </p><p><b>  }  </b><

133、/p><p><b>  } </b></p><p><b>  } </b></p><p>  cout<<endl; </p><p>  cout<<"總的尋道長度為: "<<count<<end

134、l; </p><p>  cout<<"平均尋道長度為: "<<float(count)/n<<endl;</p><p><b>  }</b></p><p>  void main(){ </p><p>  int n, i, disk

135、rode, headstarts;        </p><p>  //n表示調(diào)度磁盤請(qǐng)求序列queue的長度,diskrode表示磁盤磁道的個(gè)數(shù),headstarts表示目前正在調(diào)度的磁道; </p><p>  cout<<"請(qǐng)輸入磁盤的總磁道數(shù):"<<end

136、l; cin>> diskrode; cout<<"請(qǐng)輸入磁盤調(diào)度請(qǐng)求序列個(gè)數(shù):"<<endl; </p><p>  cin>>n; int *queue; queue =(int*)malloc(n*sizeof(int));     

137、0;    </p><p>  //給quneue數(shù)組分配空間... </p><p>  int *queue_copy; queue_copy =(int*)malloc(n*sizeof(int)); </p><p>  cout<<"請(qǐng)依次輸入該序列的值:"<

138、;<endl; </p><p>  for ( i=0;i<n;i++)  </p><p>  cin>>queue[i]; </p><p>  for ( i=0;i<n;i++)  </p><p>  queue_copy[i] =queue

139、[i]; </p><p>  cout<<"請(qǐng)輸入正在調(diào)度的磁道:  "; </p><p>  cin>>headstarts; int menux; menu(); </p><p>  cout<<"請(qǐng)按菜單選擇,輸入相應(yīng)的數(shù)字: &

140、quot;; </p><p>  cin>>menux; while (menux !=0) </p><p><b>  {   </b></p><p>  if (menux ==1)   </p><p>  

141、FCFS(queue,n,diskrode,headstarts);     </p><p>  if (menux ==2)   </p><p>  SSTF(queue,n,diskrode,headstarts);    </p><p>

142、;  if (menux ==3)   </p><p>  SCAN(queue,n,diskrode,headstarts);</p><p>  if (menux ==4)   </p><p>  CSCAN(queue,n,diskrode,headstarts);</p><

143、;p>  if (menux ==5)   </p><p>  cout<<"程序結(jié)束,謝謝使用!"<<endl;</p><p>  cout<<endl;  </p><p>  init(queue,queue_copy,n); <

144、/p><p><b>  menu();  </b></p><p>  cout<<"請(qǐng)按菜單選擇,輸入相應(yīng)的數(shù)字: ";  </p><p>  cin>>menux;  cout<<endl; </p>

145、<p><b>  }</b></p><p><b>  }</b></p><p>  2 Linux代碼分析</p><p>  為了進(jìn)一步了解操作系統(tǒng)內(nèi)核,學(xué)習(xí)了Linux操作系統(tǒng)的段頁式存儲(chǔ)管理程序虛擬內(nèi)存映射管理部分,部分源代碼如下:</p><p>  struct vm_s

146、truct</p><p><b>  {</b></p><p>  unsigned long flags; </p><p>  void *addr; /*虛擬內(nèi)存塊的其始地址 */</p><p>  unsigned long size; /*

147、虛擬內(nèi)存塊的長度*/</p><p>  struct vm_struct *next; /*下一個(gè)虛擬內(nèi)存塊*/</p><p><b>  }</b></p><p>  struct vm_area_struct </p><p><b>  {</b></p><

148、;p>  struct mm_struct * vm_mm; /*指向該虛存段所屬進(jìn)程的mm_struct */</p><p>  unsigned long vm_start; /*虛擬內(nèi)存開始地址 */</p><p>  unsigned long vm_end; /*虛擬內(nèi)存結(jié)束地址*/</p><p>  struct vm_

149、area_struct vm_next;</p><p>  unsigned short vm_flags; /*本vma塊的屬性標(biāo)志位*/</p><p>  short vm_avl_height;</p><p>  struct vm_area_struct * vm_avl_left;</p><p>  struct vm

150、_area_struct * vm_avl_right; /*上述三項(xiàng)用于對(duì)AVL樹操作*/</p><p>  struct vm_operations_struct * vm_ops; /*指向?qū)ma塊操作的結(jié)構(gòu)體指針*/</p><p>  unsigned long vm_offset;</p><p>  struct file * vm_file;

151、/*指向文件的inode結(jié)構(gòu)體或NULL */</p><p>  unsigned long vm_pte;</p><p><b>  }; </b></p><p>  static inline unsigned long do_mmap (struct file *file, unsigned long addr,unsign

152、ed long len, unsigned long prot,unsigned long flag, unsigned long offset)</p><p><b>  {</b></p><p>  unsigned long ret = -EINVAL;</p><p>  if ((offset + PAGE_ALIGN(len)

153、) < offset)</p><p><b>  goto out;</b></p><p>  if (! (offset & ~PAGE_MASK))</p><p>  ret = do_mmap_pgoff (file, addr, len, prot, flaoffset>>PAGE_SHIFT);<

154、;/p><p><b>  out:</b></p><p>  return ret; </p><p><b>  } </b></p><p><b>  功能說明</b></p><p>  這一段程序的主要功能為:</p><p

155、> ?。?)進(jìn)程對(duì)內(nèi)存區(qū)域的分配最終多會(huì)歸結(jié)到do_mmap()函數(shù)上來,同樣釋放一個(gè)內(nèi)存區(qū)域使用函數(shù)do_ummap(),它會(huì)銷毀對(duì)應(yīng)的內(nèi)存區(qū)域。(這里do_ummap暫不做說明)</p><p>  (2)Linux使用內(nèi)核函數(shù)do_mmap()完成可執(zhí)行映像等向虛擬區(qū)域的映射,由它建立有關(guān)的虛存區(qū)域,并指定虛存區(qū)域的開始地址、虛存大小以及屬性等。</p><p><b&g

156、t;  接口說明</b></p><p>  本程序的輸入?yún)?shù)為:</p><p>  file:表示要映射的文件。</p><p>  offset:文件內(nèi)的偏移量,因?yàn)槲覀儾⒉皇恰伦尤坑成湟粋€(gè)文件,可能只是映射文件的一部分,offset就表示那部分的起始位置。</p><p>  len:要映射的文件部分的長度。&

157、lt;/p><p>  addr:虛擬空間的一個(gè)地址,表示從這個(gè)地址開始查找一個(gè)空閑的虛擬區(qū)。</p><p>  prot:指定對(duì)這個(gè)虛擬區(qū)的存取權(quán)限。</p><p><b>  輸出結(jié)果為:</b></p><p>  該段程序返回的應(yīng)為long類型的數(shù)據(jù),為經(jīng)過do_mmap()映射處理后的虛存區(qū)域的起始地址。否則則

158、返回MAP_FAILED(-1)。</p><p><b>  局部數(shù)據(jù)結(jié)構(gòu)</b></p><p>  本程序共有4個(gè)局部變量及數(shù)據(jù)結(jié)構(gòu),其類型定義及語義如下:</p><p>  struct mm_struct</p><p><b>  {</b></p><p> 

159、 //mm_struct結(jié)構(gòu)包含了用戶進(jìn)程與存儲(chǔ)有關(guān)的信息</p><p>  struct vm_area_struct mmap; /*指向虛擬內(nèi)存段雙向鏈表指針 */ </p><p>  struct vm_area_struct *mmap_avl;  /*指向虛擬內(nèi)存段AVL樹指針 */</p><p>  pgd_t *pgd

160、;    /*進(jìn)程頁目錄起始地址  */</p><p>  int map_count;    /*此進(jìn)程所用虛擬內(nèi)存的塊數(shù) */</p><p>  unsigned long start_code,end_code;  /*進(jìn)程代碼段起始地址和結(jié)束地址*/</p><p>  unsigned long start_data,end_data;  

161、/*進(jìn)程數(shù)據(jù)段起始地址和結(jié)束地址*/</p><p>  unsigned long start_stack;    /*進(jìn)程堆棧段起始地址   */</p><p>  unsigned long rss;    /*進(jìn)程駐留在物理內(nèi)存的頁面總數(shù)*/</p><p><b>  ……</b></p><p>

162、<b>  }</b></p><p>  struct vm_struct</p><p><b>  {</b></p><p>  //為虛擬內(nèi)存結(jié)構(gòu)體</p><p>  unsigned long flags; </p><p>  void *ad

163、dr; /*虛擬內(nèi)存塊的其始地址 */</p><p>  unsigned long size; /*虛擬內(nèi)存塊的長度*/</p><p>  struct vm_struct *next; /*下一個(gè)虛擬內(nèi)存塊*/</p><p><b>  }</b></p><

164、;p>  struct vm_area_struct </p><p><b>  {</b></p><p>  //虛擬內(nèi)存塊存儲(chǔ)結(jié)構(gòu)體</p><p>  struct mm_struct * vm_mm; /*指向該虛存段所屬進(jìn)程的mm_struct */</p><p>  unsigned long

165、 vm_start; /*虛擬內(nèi)存開始地址*/</p><p>  unsigned long vm_end; /*虛擬內(nèi)存結(jié)束地址*/</p><p>  struct vm_area_struct vm_next;</p><p>  unsigned short vm_flags; /*本vma塊的屬性標(biāo)志位*/</p><

166、p>  short vm_avl_height;</p><p>  struct vm_area_struct * vm_avl_left;</p><p>  struct vm_area_struct * vm_avl_right; /*上述三項(xiàng)用于對(duì)AVL樹操作 */</p><p>  struct vm_operations_stru

167、ct * vm_ops; /*指向?qū)ma塊操作的結(jié)構(gòu)體指針 */</p><p>  unsigned long vm_offset;</p><p>  struct file * vm_file; /*指向文件的inode結(jié)構(gòu)體或NULL */</p><p>  unsigned long vm_pte;</p><p&g

168、t;<b>  }; </b></p><p>  typedef struct page</p><p><b>  {</b></p><p><b>  //頁存儲(chǔ)結(jié)構(gòu)</b></p><p>  struct list_head list;    /*該頁根據(jù)不同用

169、途掛到不同鏈表中 */</p><p>  struct page *next, *prev;   /*前一個(gè)和下一個(gè)頁 */</p><p>  unsigned long index;    /*頁存放代碼或數(shù)據(jù)所屬文件的位移 */ </p><p>  struct inode *inode;    /*該頁所屬文件的位移

170、 */ </p><p>  atomic count;      /*使用該頁的進(jìn)程數(shù),0表示空閑 */ </p><p>  unsigned long age;    /*頁年齡 */ </p><p><b>  ……</b></p><p

溫馨提示

  • 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. 眾賞文庫僅提供信息存儲(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)論