操作系統(tǒng)課程設(shè)計——進(jìn)程調(diào)度模擬算法_第1頁
已閱讀1頁,還剩14頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p><b>  計算機與信息學(xué)院</b></p><p><b>  課程設(shè)計報告</b></p><p>  2014年1月16日</p><p>  目 錄</p><p>  1.進(jìn)程調(diào)度算法模擬課程設(shè)計的目的……………………………………………1</p>

2、<p>  2.進(jìn)程調(diào)度算法模擬課程設(shè)計的要求……………………………………………1</p><p>  3.進(jìn)程調(diào)度算法模擬課程設(shè)計報告內(nèi)容…………………………………………1</p><p>  3.1前言 ………………………………………………………………………1</p><p>  3.2進(jìn)程調(diào)度算法模擬設(shè)計的環(huán)境 …………………………………………1

3、</p><p>  3.3系統(tǒng)流程圖及各模塊 ……………………………………………………2</p><p>  4.總結(jié) …………………………………………………………………………18</p><p>  參考文獻(xiàn)………………………………………………………………………19</p><p>  參考網(wǎng)站…………………………………………………………

4、……………19</p><p><b>  進(jìn)程調(diào)度算法模擬</b></p><p>  1.進(jìn)程調(diào)度算法模擬課程設(shè)計的目的和意義</p><p>  2013-2014學(xué)年,在學(xué)習(xí)了《操作系統(tǒng)》這門課后,對當(dāng)中的進(jìn)程調(diào)度算法產(chǎn)生了濃厚的興趣。各種調(diào)度算法,理論上比較好理解。為了加深印象,我決定把各種調(diào)度算法用C語言寫出來。于是便產(chǎn)生這份從頭到

5、尾都讓我絞盡腦汁的課程設(shè)計。</p><p>  做這份課程設(shè)計,對從事系統(tǒng)開發(fā)的人員來說,是必要的,可以在一定程度上為自己以后的發(fā)展鋪路。雖然用處不是特別明顯,但對加深系統(tǒng)調(diào)用算法的理解無疑用處是巨大的。</p><p>  2.進(jìn)程調(diào)度算法模擬課程設(shè)計的要求</p><p>  用C語言寫出至少兩種進(jìn)程調(diào)度算法。</p><p><

6、b>  畫出大概流程圖。</b></p><p>  對算法過程出現(xiàn)的bug進(jìn)行調(diào)試。</p><p><b>  展示最后的算法結(jié)果</b></p><p><b>  3.1前言:</b></p><p>  目前比較常見的幾種進(jìn)程調(diào)度算法有:</p><p

7、>  先到先服務(wù)(FCFS)</p><p>  短進(jìn)程優(yōu)先(非搶占和搶占)算法(SPF)</p><p><b>  高響應(yīng)比優(yōu)先算法</b></p><p><b>  時間片輪轉(zhuǎn)算法</b></p><p>  我選出其中三種即先到先服務(wù),短進(jìn)程優(yōu)先(2種)和時間片輪轉(zhuǎn)算法進(jìn)行C語言描&

8、lt;/p><p>  述以加深對這三種算法的理解。</p><p>  3.2進(jìn)程調(diào)度算法模擬設(shè)計的環(huán)境</p><p>  VC++6.0及CodeBlocks,32位計算機WIN7操作系統(tǒng)。</p><p><b>  3.3流程圖</b></p><p><b>  定義進(jìn)程結(jié)構(gòu)體:

9、</b></p><p>  struct Pro{</p><p>  int num;//進(jìn)程號</p><p>  int time_in;//進(jìn)程到達(dá)時間</p><p>  int work_time;//進(jìn)程服務(wù)時間</p><p>  int btime;//用于搶占式進(jìn)程優(yōu)先記錄該進(jìn)程

10、開始時間</p><p>  int l_w_time;//用于搶占式進(jìn)程優(yōu)先記錄剩余服務(wù)時間</p><p>  int end_time; //記錄該進(jìn)程結(jié)束時間,(需要時時監(jiān)測)</p><p>  int judge;//用于需要時的標(biāo)記</p><p>  }pro[10];//進(jìn)程結(jié)構(gòu)體</p><

11、p><b>  1先到先服務(wù)</b></p><p>  算法描述:把所有進(jìn)程按到達(dá)先后排序,每次取最先到的進(jìn)程執(zhí)行后淘汰,再取下一個,直到所有進(jìn)程調(diào)度完畢。</p><p><b>  主要代碼:</b></p><p>  void FCFS() //先到先服務(wù)</p><p><b

12、>  {</b></p><p>  char s[] = {"先到先服務(wù)"};</p><p>  printmat(s);</p><p><b>  PT;</b></p><p><b>  int i, j;</b></p><p&

13、gt;<b>  int min;</b></p><p>  int t = pro_num;</p><p>  int begin_time = 0x7fff;</p><p>  for(i = 1; i <= pro_num; i++)</p><p><b>  {</b><

14、/p><p>  if(pro[i].time_in < begin_time)</p><p>  begin_time = pro[i].time_in;</p><p>  pro[i].judge = 0;//所有進(jìn)程號查找標(biāo)志置0,表示還未查找</p><p><b>  }</b></p>

15、<p>  while(t--)</p><p><b>  {</b></p><p>  for(i = 1; i <= pro_num; i++)</p><p><b>  {</b></p><p>  if(pro[i].judge==0)</p><

16、;p><b>  {</b></p><p>  min = i;//設(shè)其為目前最早到達(dá)的時間</p><p>  for(j = i+1; j <= pro_num; j++)</p><p><b>  {</b></p><p>  if(pro[j].judge == 0 &a

17、mp;& pro[j].time_in <= pro[min].time_in)//該進(jìn)程號若還未被查找且小于預(yù)設(shè)</p><p>  min = j;</p><p><b>  }</b></p><p>  pro[min].judge = 1;//該進(jìn)程號被查找過</p><p>  pr

18、intf(Format2,pro[min].num,pro[min].time_in,pro[min].work_time,</p><p>  begin_time,begin_time+pro[min].work_time,begin_time+pro[min].work_time-pro[min].time_in);</p><p>  begin_time += pro[min].

19、work_time;</p><p><b>  puts("");</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>

20、;  printmat(s);</p><p><b>  puts("");</b></p><p><b>  }</b></p><p><b>  程序截圖:</b></p><p><b>  2段進(jìn)程優(yōu)先非搶占</b><

21、;/p><p>  算法描述:每次選出最短的進(jìn)程進(jìn)行調(diào)度,調(diào)度完畢則淘汰,直到所有進(jìn)程都調(diào)度完畢;</p><p>  void SJF() //短進(jìn)程優(yōu)先(非搶占)</p><p><b>  {</b></p><p>  char s[] = "非搶占短進(jìn)程優(yōu)先";</p><

22、p>  printmat(s);</p><p><b>  PT;</b></p><p>  struct Pro *p,*q,*head;</p><p>  int t_num,t_work_time,t_time_in;</p><p>  head = &pro[1];</p>&

23、lt;p>  /************************按所有進(jìn)程到達(dá)時間排序*************/</p><p><b>  p = head;</b></p><p>  while(p - head < pro_num)</p><p><b>  {</b></p><

24、;p>  for(q = p+1; q-head < pro_num; q++)</p><p><b>  {</b></p><p>  if(q->time_in < p->time_in || (q->work_time < p->work_time && q->time_in == p-&

25、gt;time_in))</p><p><b>  {</b></p><p>  t_num = p->num,t_time_in = p->time_in,t_work_time = p->work_time;</p><p>  p->num = q->num,p->time_in = q->t

26、ime_in,p->work_time = q->work_time;</p><p>  q->num = t_num, q->time_in = t_time_in,q->work_time = t_work_time;</p><p><b>  }</b></p><p><b>  }</

27、b></p><p><b>  p++;</b></p><p><b>  }</b></p><p>  /*************************************************************/</p><p>  /**********找出第一個執(zhí)

28、行的進(jìn)程,即最先到達(dá)的最短進(jìn)程*********/</p><p>  int time = 0;</p><p><b>  p = head;</b></p><p>  for(q = head; q < head + pro_num; q++)</p><p><b>  {</b>&

29、lt;/p><p>  q->judge = 0;</p><p>  if(q->time_in < p->time_in)</p><p><b>  p = q;</b></p><p>  if(q->time_in == p->time_in && q->w

30、ork_time < p->work_time)</p><p><b>  p = q;</b></p><p><b>  }</b></p><p>  int cnt = pro_num;</p><p><b>  p = head;</b></p&

31、gt;<p>  while(cnt--)</p><p><b>  {</b></p><p>  time = time < p->time_in ? p->time_in:time;</p><p>  p->judge = 1;</p><p>  p->begin_

32、time = time;</p><p>  time += p->work_time;</p><p>  p->end_time = time;</p><p>  for(q = head; q < head + pro_num; q++)</p><p><b>  {</b></p>

33、;<p>  if(p->judge == 1 && q->judge == 0)</p><p><b>  p = q;</b></p><p>  else if(p->judge == 0 &&(q->work_time < p->work_time))</p>&

34、lt;p><b>  {</b></p><p><b>  p = q;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p>&

35、lt;p>  for(p = head; p < head+pro_num; p++)</p><p><b>  {</b></p><p>  printf(Format2,p->num,p->time_in,p->work_time,p->begin_time,p->end_time,p->end_time-p-&

36、gt;time_in);</p><p><b>  puts("");</b></p><p><b>  }</b></p><p>  printmat(s);</p><p><b>  puts("");</b></p&g

37、t;<p><b>  }</b></p><p>  3短進(jìn)程優(yōu)先(搶占)</p><p>  算法描述:按時間疊加,當(dāng)新進(jìn)程到達(dá)時,判斷如果比當(dāng)前執(zhí)行的進(jìn)程短,則發(fā)生搶占,執(zhí)行完的淘汰,直到所有進(jìn)程都調(diào)度完畢。</p><p>  int find(int pp,int time)</p><p>&l

38、t;b>  {</b></p><p><b>  int i;</b></p><p>  for(i = 1; i <= pro_num; i++)</p><p><b>  {</b></p><p>  if(pro[pp].l_w_time == 0 ||( pr

39、o[i].l_w_time != 0 && pro[i].l_w_time < pro[pp].l_w_time && time >= pro[i].time_in))</p><p><b>  pp = i;</b></p><p><b>  }</b></p><p> 

40、 return pp;</p><p><b>  }</b></p><p>  void test()</p><p><b>  {</b></p><p><b>  int i;</b></p><p>  for(i = 1; i <=

41、 pro_num; i++)</p><p><b>  {</b></p><p>  printf(Format2,pro[i].num,pro[i].time_in,pro[i].work_time,pro[i].btime,pro[i].end_time,pro[i].end_time-pro[i].time_in);</p><p>

42、<b>  puts("");</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  void SJF2()//搶占式短進(jìn)程優(yōu)先</p><p><b>  {</b></p

43、><p>  char s[] = {"搶占式短進(jìn)程優(yōu)先"};</p><p>  printmat(s);</p><p><b>  PT;</b></p><p><b>  int i;</b></p><p>  struct Pro *p,*q;/

44、/ 先對到達(dá)時間進(jìn)行排序//</p><p>  struct Pro *head = &pro[1];</p><p>  int t_num, t_time_in,t_work_time;</p><p>  int time_cnt = 0,time;</p><p>  p = head = &pro[1];</

45、p><p>  while(p - head < pro_num)</p><p><b>  {</b></p><p>  for(q = p+1; q-head < pro_num; q++)</p><p><b>  {</b></p><p>  if(q

46、->time_in < p->time_in)</p><p><b>  {</b></p><p>  t_num = p->num,t_time_in = p->time_in,t_work_time = p->work_time;</p><p>  p->num = q->num,p-&

47、gt;time_in = q->time_in,p->work_time = q->work_time;</p><p>  q->num = t_num, q->time_in = t_time_in,q->work_time = t_work_time;</p><p><b>  }</b></p><p&

48、gt;<b>  }</b></p><p><b>  p++;</b></p><p><b>  }</b></p><p>  for(i = 1; i <= pro_num; i++)</p><p><b>  {</b></p&

49、gt;<p>  pro[i].l_w_time = pro[i].work_time;</p><p>  time_cnt += pro[i].work_time;</p><p><b>  }</b></p><p>  int pp = 1;</p><p>  time = pro[pp].ti

50、me_in;</p><p>  while(time_cnt--)</p><p><b>  {</b></p><p>  pro[pp].l_w_time--;</p><p><b>  time++;</b></p><p>  if(pro[pp].l_w_ti

51、me==0){pro[pp].end_time = time;}else;</p><p>  if(pro[pp].btime == 0 && pro[pp].time_in != 0)pro[pp].btime = time-1;else;</p><p>  pp = find(pp,time);</p><p><b>  }<

52、;/b></p><p><b>  test();</b></p><p>  printmat(s);</p><p><b>  puts("");</b></p><p><b>  }</b></p><p>  4時

53、間片輪轉(zhuǎn)(以單位1為例)</p><p>  取當(dāng)前已經(jīng)到達(dá)的進(jìn)程,執(zhí)行一個時間片,跳轉(zhuǎn)至下一個已經(jīng)到達(dá)的進(jìn)程,再執(zhí)行一個時間片,直到所有進(jìn)程都調(diào)度完畢。</p><p>  void TROT()</p><p><b>  {</b></p><p>  char *s = "時間片輪轉(zhuǎn)算法";&

54、lt;/p><p>  printmat(s);</p><p><b>  PT;</b></p><p>  struct Pro *p,*q,*head;</p><p>  int t_num,t_time_in,t_work_time;</p><p>  head = &pro[1

55、];</p><p><b>  p = head;</b></p><p>  /************************給所有進(jìn)程按到達(dá)時間排序*************/</p><p>  while(p - head < pro_num)</p><p><b>  {</b>

56、;</p><p>  for(q = p+1; q-head < pro_num; q++)</p><p><b>  {</b></p><p>  if(q->time_in < p->time_in)</p><p><b>  {</b></p>&

57、lt;p>  t_num = p->num,t_time_in = p->time_in,t_work_time = p->work_time;</p><p>  p->num = q->num,p->time_in = q->time_in,p->work_time = q->work_time;</p><p>  q-&g

58、t;num = t_num, q->time_in = t_time_in,q->work_time = t_work_time;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  p++;</b></p><p

59、><b>  }</b></p><p>  /*************************************************************/</p><p>  int time = pro[1].time_in;</p><p>  for(p = head; p < head+pro_num; p

60、++){p->judge = 0;p->left_work = p->work_time;}</p><p>  int flag = 1;</p><p>  for(p = head; flag; p++)</p><p><b>  {</b></p><p>  if(p->time_i

61、n <= time && p->left_work > 0)</p><p><b>  {</b></p><p>  p->left_work--;</p><p>  if(p->judge == 0){p->judge = 1; p->begin_time = time;}&l

62、t;/p><p>  if(p->left_work == 0)p->end_time = time+1;</p><p><b>  }</b></p><p>  else continue;</p><p><b>  time++;</b></p><p>

63、  for(q = head; q < head+pro_num; q++)</p><p><b>  {</b></p><p>  if(q->left_work!=0)break;</p><p><b>  }</b></p><p>  if(q == head + pro

64、_num)flag = 0;</p><p>  if(p == head + pro_num - 1)//設(shè)從開頭再開始找</p><p>  p = head-1;</p><p><b>  }</b></p><p>  for(q = head; q < head + pro_num; q++)</

65、p><p><b>  {</b></p><p>  printf(Format2,q->num,q->time_in,q->work_time,q->begin_time,q->end_time,q->end_time-q->time_in);</p><p><b>  puts("

66、;");</b></p><p><b>  }</b></p><p>  printmat(s);</p><p><b>  }</b></p><p><b>  5高響應(yīng)比優(yōu)先</b></p><p>  先對所有進(jìn)程排序

67、,已經(jīng)到達(dá)的進(jìn)程,每次選取響應(yīng)比最高的進(jìn)程進(jìn)行調(diào)度,直到所有進(jìn)程調(diào)度完畢。</p><p>  void FPF()</p><p><b>  {</b></p><p>  char *s = "高響應(yīng)比優(yōu)先算法";</p><p>  char *ss = "*************

68、***";</p><p>  printmat(s);</p><p><b>  PT;</b></p><p>  struct Pro *p,*q,*head;</p><p>  int t_num,t_time_in,t_work_time;</p><p>  head =

69、 &pro[1];</p><p><b>  p = head;</b></p><p>  /************************給所有進(jìn)程按到達(dá)時間排序*************/</p><p>  while(p - head < pro_num)</p><p><b> 

70、 {</b></p><p>  for(q = p+1; q-head < pro_num; q++)</p><p><b>  {</b></p><p>  if(q->time_in < p->time_in)</p><p><b>  {</b>&l

71、t;/p><p>  t_num = p->num,t_time_in = p->time_in,t_work_time = p->work_time;</p><p>  p->num = q->num,p->time_in = q->time_in,p->work_time = q->work_time;</p><

72、p>  q->num = t_num, q->time_in = t_time_in,q->work_time = t_work_time;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  p++;</b></p

73、><p><b>  }</b></p><p>  /*************************************************************/</p><p>  int time = pro[1].time_in;</p><p>  int cnt = pro_num;</p&

74、gt;<p>  for(p = head; p < head+pro_num; p++){p->judge = 0;p->left_work = p->work_time;}</p><p><b>  p = head;</b></p><p>  while(cnt--)//查找、打印cnt次</p>&l

75、t;p><b>  {</b></p><p><b>  p = head;</b></p><p><b>  while(1)</b></p><p><b>  {</b></p><p>  if(p->judge == 0) bre

76、ak;</p><p><b>  else p++;</b></p><p><b>  }</b></p><p>  time = time < p->time_in?p->time_in:time;</p><p>  for(q = head; q < head+p

77、ro_num; q++)</p><p><b>  {</b></p><p>  if(q->judge == 0 && time >= q->time_in && (time-q->time_in)*p->work_time>(time-p->time_in)/q->work_tim

78、e)</p><p><b>  p = q;</b></p><p><b>  }</b></p><p>  p -> judge = 1;</p><p>  p->begin_time = time;</p><p>  time += p->wo

79、rk_time;</p><p>  p->end_time = time;</p><p>  printf(Format2,p->num,p->time_in,p->work_time,p->begin_time,p->end_time,p->end_time - p->time_in);</p><p><

80、b>  puts("");</b></p><p><b>  }</b></p><p>  printmat(ss);</p><p><b>  }</b></p><p><b>  4總結(jié):</b></p><

81、p>  在本次課程設(shè)計過程中,我碰到不少程序調(diào)試的問題,但通過不懈努力一一解決了,從中我也學(xué)到了很多調(diào)試技巧,從而提升了自己在以后程序編寫中的技能。</p><p>  另外,進(jìn)程調(diào)度算法,雖然不是很難,但是再寫一次,能加深對算法的理解和運用,好處還是很多的。</p><p><b>  參考文獻(xiàn):</b></p><p>  《操作系統(tǒng)

溫馨提示

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

最新文檔

評論

0/150

提交評論