2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩13頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p>  計算機與通信工程學院</p><p><b>  操作系統(tǒng)課程設計</b></p><p>  設計題目 動態(tài)優(yōu)先權(quán)算法模擬 </p><p><b>  課程設計任務書</b></p><p>  專業(yè):計算機科學與技術 學號:

2、 學生姓名(簽名): </p><p>  設計題目:動態(tài)優(yōu)先權(quán)算法模擬</p><p><b>  一、設計實驗條件</b></p><p><b>  綜合樓808</b></p><p><b>  二、設計任務及要求</b></p><p>

3、  模擬單處理機環(huán)境下的進程調(diào)度模型,調(diào)度采用基于動態(tài)優(yōu)先權(quán)的調(diào)度算法。</p><p><b>  三、設計報告的內(nèi)容</b></p><p><b>  設計題目與設計任務</b></p><p>  設計題目:動態(tài)優(yōu)先權(quán)算法模擬</p><p>  設計任務:模擬單處理機環(huán)境下的進程調(diào)度模型,

4、調(diào)度采用基于動態(tài)優(yōu)先權(quán)的調(diào)度算法。</p><p><b>  前言(緒論)</b></p><p>  在操作系統(tǒng)中調(diào)度算法的實質(zhì)是一種資源的分配,因而調(diào)度算法是指“根據(jù)系統(tǒng)資源分配策略所規(guī)定的資源分配算法”。對于不同的操作系統(tǒng)和系統(tǒng)目標,通常采用不同的調(diào)度算法。</p><p>  為了照顧緊迫作業(yè),使之在進入系統(tǒng)后便獲得優(yōu)先處理,引入了最

5、高優(yōu)先權(quán)先調(diào)度算法。在作為進程調(diào)度算法時,該算法是把處理機分配給就緒隊列優(yōu)先權(quán)最高的進程。這可以分為搶占式優(yōu)先權(quán)算法和非搶占式優(yōu)先權(quán)算法。</p><p>  對于最高優(yōu)先權(quán)優(yōu)先調(diào)度算法,其關鍵在于:它是使用靜態(tài)優(yōu)先權(quán)還是動態(tài)優(yōu)先權(quán),以及如何確定進程的優(yōu)先權(quán)。本次課程設計所實現(xiàn)的算法就是動態(tài)優(yōu)先權(quán)算法的搶占式優(yōu)先權(quán)調(diào)度算法和非搶占式動態(tài)優(yōu)先權(quán)算法。</p><p>  動態(tài)優(yōu)先權(quán)擁有其特有

6、的靈活優(yōu)點,同時,若所有的進程都具有相同的優(yōu)先權(quán)初值,則顯然是最先進入就緒隊列的進程,將因其動態(tài)優(yōu)先權(quán)變得高而優(yōu)先獲得處理機,此即FCFS算法。若所有的就緒進程具有各不相同優(yōu)先權(quán)初值,那么,對于優(yōu)先權(quán)初值低的進程,在等待了足夠長的時間后,其優(yōu)先權(quán)便可能升為最高,從而獲得處理機。當采用搶占式優(yōu)先權(quán)調(diào)度算法時,如果規(guī)定當前進程的優(yōu)先權(quán)以一定速率下降,則可防止一個長作業(yè)長期壟斷處理機。</p><p>  這里,我們采

7、用高響應比來決定每個進程的優(yōu)先權(quán)。</p><p>  設計主體(各部分設計內(nèi)容、分析、結(jié)論等)</p><p><b>  【設計內(nèi)容】</b></p><p>  動態(tài)優(yōu)先權(quán)是指在創(chuàng)建進程時所賦予的優(yōu)先權(quán),是可以隨進程的推進或隨其等待時間的增加而改變的,以便獲得更好的調(diào)度性能。</p><p>  非搶占式優(yōu)先權(quán)調(diào)度

8、算法。在這種方式下,系統(tǒng)一旦把處理機分配給就緒隊列中優(yōu)先權(quán)最高的進程后,該進程便一直執(zhí)行下去,直至完成;或因發(fā)生某事件使該進程放棄處理機時,系統(tǒng)方可再將處理機重新分配給另一優(yōu)先權(quán)最高的進程。</p><p>  搶占式優(yōu)先權(quán)算法。系統(tǒng)同樣把處理機分配給優(yōu)先權(quán)最高的進程,使之執(zhí)行。但在其執(zhí)行期間,只要又出現(xiàn)了另一個優(yōu)先權(quán)更高的進程,進程調(diào)度程序就立即停止當前進程的執(zhí)行,重新將進程分配給優(yōu)先權(quán)最高的進程。</p

9、><p>  在批處理系統(tǒng)中,段作業(yè)優(yōu)先算法是一種比較好的算法,其主要不足之處,是長作業(yè)的運行得不到保證。如果我們?yōu)槊總€作業(yè)引入動態(tài)優(yōu)先權(quán),并使作業(yè)優(yōu)先級隨著等待時間的增加而以一定速率提高,則可以解決這個問題。優(yōu)先權(quán)的變化規(guī)律可描述為:</p><p>  優(yōu)先權(quán)=(等待時間+要求服務時間)/要求服務時間</p><p>  對優(yōu)先權(quán)計算完畢之后,要能夠通過正確的調(diào)度函

10、數(shù),完成相應進程的每個變量的更新,其中等待時間加一,運行進程的CPU時間減一,如果這時候運行的進程結(jié)束,則改變其狀態(tài)并記錄完成時間。</p><p><b>  【算法分析】</b></p><p>  模擬動態(tài)優(yōu)先權(quán)算法,在主函數(shù)中選擇采用搶占式進程調(diào)度算法還是非搶占式進程調(diào)度算法,進而調(diào)用對應的函數(shù)完成模擬。</p><p><b&g

11、t;  設置進程結(jié)構(gòu)體,</b></p><p>  struct PROCESS</p><p><b>  {</b></p><p>  int id; //進程id</p><p>  double response_rate; //優(yōu)先權(quán)</p><

12、p>  int cputime; //要求服務時間</p><p>  int waittime; //等待時間</p><p>  int endtime; //進程完成時間,未完成時標記-1</p><p>  int STATE; //進程當前狀態(tài)</p><p&g

13、t;<b>  };</b></p><p>  記錄完成的進程id,使用數(shù)組pro_list[10]</p><p><b>  功能函數(shù)</b></p><p>  display() 打印各進程當前狀態(tài)</p><p>  init() 初始化進程狀態(tài)</p>

14、<p>  change() 搶占式調(diào)度算法進程狀態(tài)更新</p><p>  no_change() 非搶占式調(diào)度算法進程狀態(tài)更新</p><p>  函數(shù)調(diào)用順序如圖1:</p><p>  圖1 函數(shù)調(diào)用順序圖</p><p>  采用高響應比作為進程調(diào)度的優(yōu)先權(quán),其特點如下:</p><p&

15、gt;  如果作業(yè)的等待時間相同,則要求服務時間愈短,其優(yōu)先權(quán)愈高,因而該算法有利于短作業(yè);</p><p>  當服務時間相同時,作業(yè)的優(yōu)先權(quán)決定于其等待時間,等待時間愈長,其優(yōu)先權(quán)愈高,因而它實現(xiàn)的是先來先服務。</p><p>  對于長作業(yè),作業(yè)的優(yōu)先級可以隨等待時間的增加而提高,當其等待時間足夠長時,其優(yōu)先級便可以升到很高,從而也可以獲得處理機。</p><p

16、><b>  【代碼實現(xiàn)】</b></p><p>  #include<iostream></p><p>  #include<cstring></p><p>  #include<stdio.h></p><p>  #include<cstdlib><

17、/p><p>  using namespace std;</p><p>  #define num 6</p><p>  #define RUN 1</p><p>  #define READY 0</p><p>  #define RUNOUT -1</p><p>  int time

18、=0;</p><p>  struct PROCESS</p><p><b>  {</b></p><p><b>  int id;</b></p><p>  double response_rate;</p><p>  int cputime;</p>

19、;<p>  int waittime;</p><p>  int endtime;</p><p>  int STATE;</p><p><b>  }pro[10];</b></p><p>  int pro_list[10],q=0;</p><p>  void di

20、splay()</p><p><b>  {</b></p><p>  cout<<"Time:"<<time<<endl;</p><p>  cout<<"==========================================="<

21、;<endl;</p><p>  cout<<"ID\t\t0\t1\t2\t3\t4\t5"<<endl;</p><p>  cout<<"respone_rate\t";</p><p>  for(int i=0;i<num;i++)</p><p&

22、gt;<b>  {</b></p><p>  cout<<pro[i].response_rate<<'\t';</p><p><b>  }</b></p><p>  cout<<endl;</p><p>  cout<<&

23、quot;cputime\t\t";</p><p>  for(int i=0;i<num;i++)</p><p><b>  {</b></p><p>  cout<<pro[i].cputime<<'\t';</p><p><b>  }<

24、;/b></p><p>  cout<<endl;</p><p>  cout<<"waittime\t";</p><p>  for(int i=0;i<num;i++)</p><p><b>  {</b></p><p>  c

25、out<<pro[i].waittime<<'\t';</p><p><b>  }</b></p><p>  cout<<endl;</p><p>  cout<<"endtime\t\t";</p><p>  for(int

26、i=0;i<num;i++)</p><p><b>  {</b></p><p>  cout<<pro[i].endtime<<'\t';</p><p><b>  }</b></p><p>  cout<<endl;</p&

27、gt;<p>  cout<<"STATE\t\t";</p><p>  for(int i=0;i<num;i++)</p><p><b>  {</b></p><p>  if(pro[i].STATE==RUN)</p><p>  cout<<

28、"RUN\t";</p><p>  else if(pro[i].STATE==READY)</p><p>  cout<<"READY\t";</p><p>  else cout<<"RUNOUT\t";</p><p><b>  }&l

29、t;/b></p><p>  cout<<endl;</p><p>  cout<<"the end process<end time>: ";</p><p>  for(int i=0;i<q;i++)</p><p><b>  {</b>&l

30、t;/p><p>  cout<<"->"<<pro_list[i]<<'<'<<pro[pro_list[i]].endtime<<'>';</p><p><b>  }</b></p><p>  cout<

31、<endl;</p><p>  cout<<"==========================================="<<endl;</p><p><b>  }</b></p><p>  void init()</p><p><b> 

32、 {</b></p><p>  for(int i=0;i<num;i++)</p><p><b>  {</b></p><p>  pro[i].id=i;</p><p>  pro[i].response_rate=1;</p><p>  pro[i].waitti

33、me=0;</p><p>  pro[i].endtime=-1;</p><p>  pro[i].STATE=0;</p><p><b>  }</b></p><p>  pro[0].cputime=5;</p><p>  pro[1].cputime=3;</p>&

34、lt;p>  pro[2].cputime=1;</p><p>  pro[3].cputime=2;</p><p>  pro[4].cputime=4;</p><p>  pro[5].cputime=6;</p><p><b>  }</b></p><p>  void ch

35、ange()</p><p><b>  {</b></p><p>  double runflag=0;</p><p>  int runprocess=0;</p><p>  for(int i=0;i<num;i++)</p><p><b>  {</b>

36、</p><p>  if(pro[i].STATE!=RUNOUT)</p><p><b>  {</b></p><p>  pro[i].response_rate=1.0*(pro[i].waittime+pro[i].cputime)/pro[i].cputime;</p><p>  if(pro[i].r

37、esponse_rate>runflag)</p><p><b>  {</b></p><p>  runflag=pro[i].response_rate;</p><p>  runprocess=i;</p><p><b>  }</b></p><p>&

38、lt;b>  }</b></p><p><b>  }</b></p><p>  for(int i=0;i<num;i++)</p><p><b>  {</b></p><p>  if(pro[i].STATE==RUN)</p><p>

39、<b>  {</b></p><p>  pro[i].STATE=READY;</p><p>  pro[i].waittime=-1;</p><p><b>  }</b></p><p><b>  }</b></p><p>  pro[r

40、unprocess].cputime--;</p><p>  pro[runprocess].waittime=-1;</p><p>  pro[runprocess].STATE=RUN;</p><p>  for(int i=0;i<num;i++)</p><p><b>  {</b></p&g

41、t;<p>  if(pro[i].STATE==RUNOUT)</p><p><b>  {</b></p><p><b>  continue;</b></p><p><b>  }</b></p><p>  pro[i].waittime++;<

42、;/p><p>  if(pro[i].cputime==0)</p><p><b>  {</b></p><p>  pro[i].endtime=time;</p><p>  pro[i].STATE=RUNOUT;</p><p>  pro[i].response_rate=0;<

43、/p><p>  pro_list[q++]=i;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  void no_change()</p><p

44、><b>  {</b></p><p>  int runprocess=0,flag=0;</p><p>  double runflag=0;</p><p>  for(int i=0;i<num;i++)</p><p><b>  {</b></p><

45、p>  if(pro[i].STATE==RUNOUT)</p><p><b>  {</b></p><p><b>  continue;</b></p><p><b>  }</b></p><p>  pro[i].response_rate=1.0*(pro

46、[i].waittime+pro[i].cputime)/pro[i].cputime;</p><p>  if(pro[i].response_rate>runflag)</p><p><b>  {</b></p><p>  runflag=pro[i].response_rate;</p><p>  

47、runprocess=i;</p><p><b>  }</b></p><p><b>  }</b></p><p>  for(int i=0;i<num;i++)</p><p><b>  {</b></p><p>  if(pro[

48、i].STATE==RUNOUT)</p><p><b>  {</b></p><p><b>  continue;</b></p><p><b>  }</b></p><p>  if(pro[i].STATE==RUN)</p><p>&

49、lt;b>  {</b></p><p><b>  flag=1;</b></p><p>  pro[i].cputime--;</p><p>  pro[i].waittime=-1;</p><p>  for(int j=0;j<num;j++)</p><p>

50、;<b>  {</b></p><p>  if(pro[j].STATE==RUNOUT)</p><p><b>  {</b></p><p><b>  continue;</b></p><p><b>  }</b></p>&

51、lt;p>  pro[j].waittime++;</p><p><b>  }</b></p><p>  if(pro[i].cputime==0)</p><p><b>  {</b></p><p>  pro[i].STATE=RUNOUT;</p><p&g

52、t;  pro[i].endtime=time;</p><p>  pro[i].response_rate=0;</p><p>  pro_list[q++]=i;</p><p><b>  }</b></p><p><b>  break;</b></p><p>

53、;<b>  }</b></p><p><b>  }</b></p><p><b>  if(!flag)</b></p><p><b>  {</b></p><p>  pro[runprocess].cputime--;</p>

54、<p>  pro[runprocess].waittime=-1;</p><p>  pro[runprocess].STATE=RUN;</p><p>  for(int j=0;j<num;j++)</p><p><b>  {</b></p><p>  if(pro[j].STATE==

55、RUNOUT)</p><p><b>  {</b></p><p><b>  continue;</b></p><p><b>  }</b></p><p>  pro[j].waittime++;</p><p><b>  }&l

56、t;/b></p><p>  if(pro[runprocess].cputime==0)</p><p><b>  {</b></p><p>  pro[runprocess].STATE=RUNOUT;</p><p>  pro[runprocess].endtime=time;</p>

57、<p>  pro[runprocess].response_rate=0;</p><p>  pro_list[q++]=runprocess;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b>

58、</p><p>  int main()</p><p><b>  {</b></p><p>  int flag=0,type;</p><p>  cout<<"selecet type£¨1.preemptive scheduling 2.non-preemptiv

59、e scheduling£©£º";</p><p>  cin>>type;</p><p><b>  init();</b></p><p><b>  while(1)</b></p><p><b>  {</b

60、></p><p><b>  flag=0;</b></p><p>  display();</p><p>  for(int i=0;i<num;i++)</p><p><b>  {</b></p><p>  if(pro[i].STATE!=RUN

61、OUT)</p><p><b>  {</b></p><p><b>  flag=1;</b></p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  }

62、</b></p><p>  if(!flag) break;</p><p><b>  time++;</b></p><p>  if(type==1)</p><p><b>  {</b></p><p><b>  change();<

63、/b></p><p><b>  }</b></p><p><b>  else</b></p><p>  no_change();</p><p>  cout<<endl;</p><p>  getchar();</p><p

64、><b>  }</b></p><p>  cout<<endl<<endl;</p><p>  cout<<"All processes have runed out!!"<<endl;</p><p><b>  }</b></p>

65、;<p><b>  【結(jié)果截圖】</b></p><p>  搶占式優(yōu)先權(quán)調(diào)度算法</p><p>  非搶占式優(yōu)先調(diào)度算法</p><p><b>  結(jié)束語</b></p><p>  本次課程設計是由小組合作完成,大家一同討論算法的可行性、實現(xiàn)流程、結(jié)構(gòu)安排等,一起討論交流使得

66、大家對這個算法了解得更加深刻,從各個不同的角度對它有了不同的認識,也發(fā)現(xiàn)了很多自己思考的死角,學到算法的同時也體會到團隊合作的重要性,培養(yǎng)了我們團隊合作的意識和能力。</p><p>  在代碼的編寫過程中還遇到很多設計是沒有考慮到的問題,都需要當場解決,應對各種突發(fā)事件,想到比較全面的解決方案。因為進程的結(jié)構(gòu)體內(nèi)有較多的變量,寫更新函數(shù)的時候必須要注意力集中,細心耐心的處理每一個變量。對于時間變量的每一次改變,

67、注意到各個進程狀態(tài)的變化,對于RUNOUT的進程是不參與這些更新的,等等諸如此類的問題,都需要在調(diào)試中發(fā)現(xiàn)和解決。代碼運行基本沒有問題的時候還需要進一步測試,有些隱藏的問題對于一組數(shù)據(jù)也許是表現(xiàn)不出來的,多次更改數(shù)據(jù)對代碼運行測試,解決發(fā)現(xiàn)了的隱藏bug,這一環(huán)節(jié)也是必不可少的。</p><p>  動態(tài)優(yōu)先權(quán)算法保證了緊急任務的高優(yōu)先權(quán)先處理,同時彌補了靜態(tài)優(yōu)先權(quán)事先設置數(shù)值不能完全適合每一個時刻的缺點,動態(tài)賦

68、值,更加的靈活。通過多次的嘗試討論,代碼的實現(xiàn),我們更加深刻的意識到了這一點,紙上得來終覺淺,絕知此事要躬行,尤其是作為計算機專業(yè)的我們,必須不斷地通過動手實踐來培養(yǎng)自己編程能力,才能寫出更加漂亮的算法。</p><p><b>  參考資料</b></p><p>  [1] 戴仕明,姚昌順.電子學發(fā)展史研究[M] .北京:科學出版社,2011.</p>

69、<p><b>  四、設計時間與安排</b></p><p>  1、設計時間: 2周</p><p>  2、設計時間安排: </p><p>  熟悉實驗設備、收集資料: 5 天</p><p>  設計圖紙、實驗、計算、程序編寫調(diào)試: 6 天</p><p&

溫馨提示

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

評論

0/150

提交評論