課程設計報告--磁盤調度算法的模擬實現_第1頁
已閱讀1頁,還剩13頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p><b>  操作系統(tǒng)課程設計</b></p><p>  磁盤調度算法的模擬實現</p><p>  學 院 計算機科學與技術 </p><p>  專 業(yè) 計算機科學與技術(師范)</p><p>  學 號 ************

2、</p><p>  學 生 姓 名 *** </p><p>  指導教師姓名 *** </p><p><b>  2015年7月1日</b></p><p><b>  目錄</b></p><p><b

3、>  一、引言2</b></p><p><b>  二、總體設計2</b></p><p><b>  1.功能實現2</b></p><p><b>  2.流程圖3</b></p><p><b>  3.具體內容3<

4、/b></p><p><b>  三、實驗驗證5</b></p><p><b>  1.結果截圖7</b></p><p><b>  2.代碼分析6</b></p><p><b>  四、源代碼9</b></p>

5、<p><b>  五、總結13</b></p><p>  六、參考資料13</p><p><b>  引言</b></p><p>  1、課程設計的目的:</p><p>  操作系統(tǒng)課程設計是計算機專業(yè)重要的教學環(huán)節(jié),它為學生提供了一個既動手又動腦,將課本上的理論知識和

6、實際有機的結合起來,獨立分析和解決實際問題的機會。 </p><p>  進一步鞏固和復習操作系統(tǒng)的基礎知識。 </p><p>  培養(yǎng)學生結構化程序、模塊化程序設計的方法和能力。 </p><p>  提高學生調試程序的技巧和軟件設計的能力。 </p><p>  提高學生分析問題、解決問題以及綜合利用 C 語言進行程序設計的能力。 &l

7、t;/p><p>  2、設計內容:設計并實現一個本別利用下列磁盤調度算法進行磁盤調度的模擬程序。</p><p>  1、先來先服務算法FCFS </p><p>  2、最短尋道時間優(yōu)先算法SSTF </p><p><b>  3、設計要求:</b></p><p>  磁頭初始磁道號

8、,序列長度,磁道號序列等數據可從鍵盤輸入,也可從文件讀入。 </p><p>  最好能實現磁道號序列中磁道號的動態(tài)增加。</p><p>  磁道訪問序列以鏈表的形式存儲</p><p>  4. 給出各磁盤調度算法的調度順序和平均尋道長度</p><p><b>  總體設計</b></p>&l

9、t;p><b>  1、算法實現</b></p><p>  1.先來先服務算法(FCFS)</p><p>  先來先服務(FCFS)調度:按先來后到次序服務,未作優(yōu)化。</p><p>  最簡單的移臂調度算法是“先來先服務”調度算法,這個算法實際上不考慮訪問者要求訪問的物理位置,而只是考慮訪問者提出訪問請求的先后次序。例如,如果現在

10、讀寫磁頭正在50號柱面上執(zhí)行輸出操作,而等待訪問者依次要訪問的柱面為130、199、32、159、15、148、61、99,那么,當50號柱面上的操作結束后,移動臂將按請求的先后次序先移到130號柱面,最后到達99號柱面。</p><p>  采用先來先服務算法決定等待訪問者執(zhí)行輸入輸出操作的次序時,移動臂來回地移動。先來先服務算法花費的尋找時間較長,所以執(zhí)行輸入輸出操作的總時間也很長。</p>&

11、lt;p>  2.短尋道時間優(yōu)先算法(SSTF)</p><p>  最短尋找時間優(yōu)先調度算法總是從等待訪問者中挑選尋找時間最短的那個請求先執(zhí)行的,而不管訪問者到來的先后次序?,F在仍利用同一個例子來討論,現在當50號柱面的操作結束后,應該先處理61號柱面的請求,然后到達32號柱面執(zhí)行操作,隨后處理15號柱面請求,后繼操作的次序應該是99、130、148、159、199。</p><p&g

12、t;  采用最短尋找時間優(yōu)先算法決定等待訪問者執(zhí)行操作的次序時,讀寫磁頭總共移動了200多個柱面的距離,與先來先服務、算法比較,大幅度地減少了尋找時間,因而縮短了為各訪問者請求服務的平均時間,也就提高了系統(tǒng)效率。</p><p>  但最短查找時間優(yōu)先(SSTF)調度,FCFS會引起讀寫頭在盤面上的大范圍移動,SSTF查找距離磁頭最短(也就是查找時間最短)的請求作為下一次服務的對象。SSTF查找模式有高度局部化的

13、傾向,會推遲一些請求的服務,甚至引起無限拖延(又稱饑餓)。</p><p> ?、傧葋硐确账惴ǎ‵CFS)流程圖:</p><p> ?、谧疃虒さ罆r間優(yōu)先算法(SSTF)流程圖:</p><p><b>  三、總體驗證</b></p><p>  1、數據結構及信號量定義的說明;</p><p&g

14、t;  本系統(tǒng)劃分為四個模塊:先來先服務算法模塊void FCFS(int array[],int m)、最短尋道時間優(yōu)先算法模塊void SSTF(int array[],int m)、掃描算法模塊void SCAN(int array[],int m) 和循環(huán)掃描算法模塊:void CSCAN(int array[],int m) 。</p><p>  2. 先來先服務算法模塊:void FCFS(int

15、array[],int m)</p><p>  輸入磁道號,按先來先服務的策略輸出磁盤請求序列,求平均尋道長度,輸出移動平均磁道數。</p><p>  3、 最短尋道時間優(yōu)先算法模塊:void SSTF(int array[],int m)</p><p>  將磁道號用冒泡法從小到大排序,輸出排好序的磁道序列,輸入當前磁道號,根據前磁道在已排的序列中的位置,選

16、擇掃描的順序,求出平均尋道長度,輸出移動的平均磁道數。</p><p><b>  4、代碼分析</b></p><p>  1、先來先服務算法模塊:void FCFS(int array[],int m)</p><p><b>  主要代碼:</b></p><p>  for(i=0,j=1;

17、j<m;i++,j++) </p><p><b>  {</b></p><p>  sum+=abs(array[j]-array[i]);</p><p>  ave=(float)(sum)/(float)(m);</p><p><b>  }</b></p><

18、;p>  2 最短尋道時間優(yōu)先算法模塊:void SSTF(int array[],int m)</p><p><b>  主要代碼:</b></p><p>  for(i=0;i<m;i++) /*使用冒泡法按從小到大順序排列*/</p><p>  for(j=i+1;j<m;j++)</p>&l

19、t;p><b>  {</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>  

20、array[j]=temp;</p><p><b>  }</b></p><p><b>  }</b></p><p>  if(array[m-1]<=now) /*若當前磁道號大于請求序列中最大者,則直接由外向內依次給予各請求服務*/</p><p><b>  {&

21、lt;/b></p><p>  for(i=m-1;i>=0;i--)</p><p>  cout<<array[i]<<" ";</p><p>  sum=now-array[0];</p><p><b>  }</b></p><p&

22、gt;  else if(array[0]>=now) /*若當前磁道號小于請求序列中最小者,則直接由內向外依次給予各請求服務*/</p><p>  while((l>=0)&&(r<m)) /*當前磁道在請求序列范圍內*/</p><p><b>  {</b></p><p>  if((now-

23、array[l])<=(array[r]-now)) /*選擇與當前磁道最近的請求給予服務*/</p><p><b>  {</b></p><p>  cout<<array[l]<<" ";</p><p>  sum+=now-array[l];</p><p>

24、  now=array[l];</p><p><b>  l=l-1;</b></p><p><b>  }</b></p><p><b>  3、實驗的步驟;</b></p><p>  1 先來先服務算法 </p><p>

25、  輸入磁道序列:55 58 39 18 90 160 150 38 184 當前磁道號:100 </p><p>  2 最短尋道時間優(yōu)先算法 </p><p>  當前磁道號大于磁道序列中的最大的磁道號時    </p&g

26、t;<p>  輸入磁道序列:55 58 39 18 90 160 150 38 184 </p><p>  當前磁道號:100 </p><p><b>  四、源代碼:</b></p><p>  #include<io

27、stream></p><p>  #include<cmath></p><p>  #include<stdio.h></p><p>  using namespace std;</p><p>  typedef struct node</p><p><b>  {&l

28、t;/b></p><p><b>  int data;</b></p><p>  struct node *next;</p><p>  }Node,*Linklist;</p><p>  void main()</p><p><b>  {</b><

29、/p><p>  void Create_Linklist(Node *);</p><p>  void fcfs();//聲明先來先服務函數FCFS</p><p>  void sstf();//聲明最短尋道時間優(yōu)先函數sstf</p><p>  void print(Node *);</p><p><b&

30、gt;  int s;</b></p><p>  printf("**************磁盤調度算法***************\n");</p><p>  printf("\t***1,先來先服務算法FCFS\n");</p><p>  printf("\t***2,最短尋道時間優(yōu)先算法S

31、STF\n");</p><p>  printf("\t***0,退出\n");</p><p>  printf("\t***請選擇:");</p><p>  scanf("%d",&s);</p><p>  while(s!=0)</p>&

32、lt;p><b>  {</b></p><p><b>  switch(s)</b></p><p><b>  {</b></p><p>  case 1:printf("\t\t********你選擇了:先來先服務算法FCFS\n");fcfs();break;&l

33、t;/p><p>  case 2:printf("\t\t******你選擇了:最短尋道時間優(yōu)先算法SSTF\n");sstf();break;</p><p><b>  }</b></p><p>  printf("\t\t*******退出請選0,繼續(xù)請選1,2,\n");scanf("%

34、d",&s);</p><p><b>  }</b></p><p><b>  }</b></p><p>  /******************************************************************/</p><p>  void

35、 fcfs()//先來先服務算法</p><p><b>  { </b></p><p>  void Create_Linklist(Node *);</p><p>  void print(Node*);</p><p>  int Length_Linklist(Node *);</p><

36、p>  Node *l,*head;//*m,*n;*/</p><p>  float num=0;//num為平均尋道長度 </p><p><b>  int c,f;</b></p><p>  head=(Node *)malloc(sizeof(Node));</p><p>  head->n

37、ext=NULL;</p><p>  printf("**************新建一個單鏈表,以0作為結束標志:********\n");</p><p>  Create_Linklist(head);</p><p>  c=Length_Linklist(head);</p><p>  printf(&quo

38、t;\t\t******從幾號磁道開始:********");</p><p>  scanf("%d",&f);//f為磁道號 </p><p>  print(head);</p><p>  printf("\t***鏈表長度為:%d\n",c); </p><p>  l=h

39、ead->next; </p><p>  for(int i=0;i<c;i++) </p><p><b>  {</b></p><p>  num+=abs(l->data-f);f=l->data;l=l->next;</p><p><b>  }</b

40、></p><p>  num=num/c;</p><p>  printf("\t\t*****先來先服務的尋道順序是:\n");</p><p>  print(head);</p><p>  printf("\t\t******平均尋道長度:%f\n",num);</p>

41、<p><b>  }</b></p><p>  /*****************************************************************/ </p><p>  void sstf()//最短尋道時間優(yōu)先算法</p><p><b>  {</b></p>

42、;<p>  void Create_Linklist(Node *);</p><p>  void print(Node *);</p><p>  int Length_Linklist(Node *);</p><p>  Node *p,*q,*r,*s,*l,*m,*head;</p><p><b>  

43、int c,f;</b></p><p>  head=(Node *)malloc(sizeof(Node));head->next=NULL;</p><p>  printf("**************新建一個單鏈表,以0作為結束標志:********\n"); </p><p>  Create_Linklist(

44、head); c=Length_Linklist(head); </p><p>  printf("\t\t******從幾號磁道開始:********"); </p><p>  scanf("%d",&f); //f為磁

45、道號</p><p>  print(head); </p><p>  printf("\t***鏈表長度為:%d\n",c); </p><p>  l=(Node *)malloc(sizeof(Node)); </p><p>  l->next=NULL; m=l; </p><

46、p>  q=head; p=head->next; </p><p>  s=head; r=head->next; </p><p>  float num=0; </p><p>  for(int i=0;i<c;i++) </p><p><b>  { </b></p&

47、gt;<p>  int min=abs(f-r->data); </p><p>  for(int j=0;j<c-i-1;j++) </p><p><b>  { </b></p><p>  p=p->next; </p><p>  q=q->next; &

48、lt;/p><p>  if(abs(f-p->data)<min) </p><p><b>  { </b></p><p>  min=abs(f-p->data); </p><p><b>  r=p; </b></p><p>

49、<b>  s=q; </b></p><p><b>  } </b></p><p><b>  } </b></p><p>  num+=abs(f-r->data); </p><p>  f=r->data; </p><

50、p>  s->next=r->next; </p><p>  r->next=NULL; </p><p>  m->next=r; </p><p><b>  m=r; </b></p><p>  q=head; </p><p&g

51、t;  p=head->next; </p><p>  s=head; </p><p>  r=head->next; </p><p><b>  } </b></p><p>  num=num/c; </p><p>  printf("\t\t*****

52、*最短尋道時間優(yōu)先順序是:\n"); </p><p>  print(l); </p><p>  printf("\t\t*********平均尋道長度:%f\n",num); </p><p><b>  } </b></p><p>  /*********************

53、************************************/ </p><p>  void print(Node *head) //輸出鏈表 </p><p><b>  {</b></p><p><b>  Node *p;</b></p><p>  p=head

54、->next; </p><p>  cout<<"單鏈表顯示:"; </p><p>  if(p==NULL) </p><p><b>  { </b></p><p>  printf("單鏈表為空:\n"); </p><p&

55、gt;<b>  } </b></p><p>  else if(p->next==NULL) </p><p>  { </p><p>  printf("%d\t",p->data); </p><p>  pri

56、ntf("\n"); </p><p><b>  } </b></p><p><b>  else </b></p><p><b>  { </b></p><p>  while(p->next!=NULL) </p>&

57、lt;p><b>  { </b></p><p>  printf("%d\t",p->data); </p><p>  p=p->next; </p><p><b>  } </b></p><p>  printf("%d\t&qu

58、ot;,p->data); </p><p>  printf("\n"); </p><p><b>  } </b></p><p><b>  } </b></p><p>  /*****************************************

59、****************/ void Create_Linklist(Node *head)//創(chuàng)建鏈表</p><p><b>  { </b></p><p>  Node *p,*q; </p><p><b>  int i; </b></p><p>  scanf(&quo

60、t;%d",&i); </p><p><b>  q=head; </b></p><p>  while(i!=0) </p><p><b>  { </b></p><p>  p=(Node *)malloc(sizeof(Node)); </p>

61、;<p>  p->next=NULL; </p><p>  p->data=i; </p><p>  q->next=p; </p><p><b>  q=p; </b></p><p><b>  cin>>i; </b><

62、;/p><p>  } /* c++;*/ </p><p><b>  } </b></p><p>  /**************************************************/ </p><p>  int Length_Linklist(Node *head)//計算鏈表長</p

63、><p><b>  {</b></p><p><b>  int l;</b></p><p><b>  Node *p; </b></p><p>  p= head->next; </p><p><b>  l=1; </

64、b></p><p>  while(p->next) </p><p><b>  { </b></p><p>  p=p->next; </p><p><b>  l++; </b></p><p><b>  } </b>

65、;</p><p>  return l; </p><p><b>  }</b></p><p><b>  五、總結</b></p><p>  通過此次課程設計,我對操作系統(tǒng)的基礎知識了解得更透徹了,同時對磁盤調度的四種算法——先來先服務算法(FCFS)、最短尋道時間優(yōu)先算法(SSTF)、有

66、了更深刻的理解和掌握,使我能夠為磁盤調度選擇適當的算法,提高CPU工作效率。設計過程中遇到的困難在老師和同學的幫助下順利解決并通過了驗收,我深刻認識到算法的邏輯性對程序的重要影響,算法的準確度對程序運行結果的重要影響,這對我以后在操作系統(tǒng)的學習中有極大幫助。</p><p><b>  六、 參考資料</b></p><p>  黃維通等. Visual C++ 面向

67、對象與可視化程序設計. 北京:清華大學出版社,2011.</p><p>  鄭宗漢等. 算法設計與分析. 北京:清華大學出版社,2005.</p><p>  趙劍云等譯, [美]George Shepherd等著. 深入解析MFC. 北京:中國電力出版社,2003.</p><p>  Microsoft Platform SDK, August 2001 Ed

溫馨提示

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

評論

0/150

提交評論