操作系統(tǒng)課程設(shè)計報告---進程調(diào)度的模擬實現(xiàn)_第1頁
已閱讀1頁,還剩11頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p><b>  操作系統(tǒng)</b></p><p><b>  課程設(shè)計報告</b></p><p>  題目:進程調(diào)度的模擬實現(xiàn)的模擬實現(xiàn)</p><p><b>  一、設(shè)計目的</b></p><p>  本課程設(shè)計是學習完“操作系統(tǒng)原理”課程后進行的一次全面

2、的綜合訓練,通過課程設(shè)計,更好地掌握操作系統(tǒng)的原理及實現(xiàn)方法,加深對操作系統(tǒng)基礎(chǔ)理論和重要算法的理解,加強學生的動手能力。</p><p>  在多道程序和多任務(wù)系統(tǒng)中,系統(tǒng)內(nèi)同時處于就緒狀態(tài)的進程可能有若干個。也就是說能運行的進程數(shù)大于處理機個數(shù)。為了使系統(tǒng)中的進程能有條不紊地工作,必須選用某種調(diào)度策略,選擇一進程占用處理機。要求學生設(shè)計一個模擬處理機調(diào)度算法,以鞏固和加深處理機調(diào)度的概念。</p>

3、<p><b>  二、設(shè)計內(nèi)容</b></p><p><b>  1)概述</b></p><p>  選擇一個調(diào)度算法,實現(xiàn)處理機調(diào)度。</p><p><b>  設(shè)計要求:</b></p><p>  1)進程調(diào)度算法包括:時間片輪轉(zhuǎn)法,短作業(yè)優(yōu)先算法,

4、動態(tài)優(yōu)先級算法。</p><p><b>  2)可選擇進程數(shù)量</b></p><p>  3)本程序包括三種算法,用C或C++語言實現(xiàn),執(zhí)行時在主界面選擇算法(可用函數(shù)實現(xiàn)),進入子頁面后輸入進程數(shù),(運行時間,優(yōu)先數(shù)由隨機函數(shù)產(chǎn)生),執(zhí)行,顯示結(jié)果。</p><p><b>  2)設(shè)計原理</b></p>

5、;<p>  1.進程控制塊的內(nèi)容如下:</p><p>  其中優(yōu)先數(shù)是賦給進程的優(yōu)先級</p><p>  調(diào)度時總是選取優(yōu)先數(shù)最大的進程優(yōu)先運行</p><p>  2.每個進程的優(yōu)先數(shù),運行時間,由程序任意指定。</p><p>  3.為了調(diào)度方便,把進程按給定優(yōu)先級(動態(tài)優(yōu)先級算法中)從小到大排成一個隊列。按給定運行

6、時間(短作業(yè)優(yōu)先)從小到大排成一個隊列用一個變量作為隊首指針,指向隊列的第一個進程。</p><p>  4.處理機調(diào)度總是選隊首進程運行。由于本實驗是模擬處理機調(diào)度,所以被選中的進程并不實際的啟動運行,而是執(zhí)行:</p><p>  優(yōu)先數(shù)-1(動態(tài)優(yōu)先級算法中)</p><p><b>  要求運行時間-1</b></p>&

7、lt;p>  來模擬進程的一次運行。</p><p>  5.進程運行一次后,若要求運行時間不等于0,則再將它加入隊列(動態(tài)優(yōu)先級算法中:按優(yōu)先數(shù)大小插入。),且改變隊首指針:若要求運行時間=0,則把它的狀態(tài)改為完成(C)狀態(tài),且退出隊列。</p><p>  6.若就緒隊列不空,則重復(fù)上述的4和5,直接所有的進程成為完成狀態(tài)。</p><p>  7.在所設(shè)

8、計的程序中應(yīng)有顯示或打印語句,以顯示或打印每次被選中的進程的進程名以及運行一次后進程隊列的變化。</p><p><b>  3)詳細設(shè)計及編碼</b></p><p><b>  流程圖如下</b></p><p><b>  2. 實驗分析</b></p><p>  (1

9、)PCB結(jié)構(gòu)通常包括以下信息:進程名,進程優(yōu)先數(shù),輪轉(zhuǎn)時間片,進程已占用的CPU時間,進程還需要的CPU時間,進程的狀態(tài),當前隊列指針等??筛鶕?jù)實驗的不同,PCB結(jié)構(gòu)的內(nèi)容可以作適當?shù)脑鰟h</p><p>  (2)本程序用兩種算法對五個進程進行調(diào)度,每個進程可有三個狀態(tài):就緒、執(zhí)行、完成。并假設(shè)初始狀態(tài)為就緒狀態(tài)。 </p><p>  (3)為了便于處理,程序中的某進程運行時間以時間片

10、為單位計算。各進程的優(yōu)先數(shù)或輪轉(zhuǎn)時間數(shù)以及進程需運行的時間片數(shù)的初始值均由用戶給定。 </p><p>  (4)在優(yōu)先數(shù)算法中,優(yōu)先數(shù)可以先取值為一個常數(shù)減去進程所需要的時間片數(shù)目,進程每執(zhí)行一次,優(yōu)先數(shù)減3,CPU時間片數(shù)加1,進程還需要的時間片數(shù)減1。在輪轉(zhuǎn)算法中,采用固定時間片(即:每執(zhí)行一次進程,該進程的執(zhí)行時間片數(shù)為已執(zhí)行了2個單位),這時,CPU時間片數(shù)加2,進程還需要的時間片數(shù)減2,并排列到就緒隊

11、列的尾上。</p><p>  (5)對于遇到優(yōu)先數(shù)一致的情況,采用FIFO策略解決。</p><p><b>  3.概要設(shè)計</b></p><p>  (1)本程序用兩種算法對五個進程進行調(diào)度,每個進程可有三個狀態(tài),并假設(shè)初始狀態(tài)為就緒狀態(tài)。</p><p>  (2)為了便于處理,程序中的某進程運行時間以時間片為

12、單位計算。各進程的優(yōu)先數(shù)或輪轉(zhuǎn)時間數(shù)以及進程需運行的時間片數(shù)的初始值均由用戶給定。</p><p>  (3)在優(yōu)先數(shù)算法中,優(yōu)先數(shù)的值為50與運行時間的差值,即P_TIME-process->needtime。進程每執(zhí)行一次,優(yōu)先數(shù)減3,CPU時間片數(shù)加1,進程還需要的時間片數(shù)減1。在輪轉(zhuǎn)算法中,采用固定時間片(即:每執(zhí)行一次進程,該進程的執(zhí)行時間片數(shù)為已執(zhí)行了2個單位),這時,CPU時間片數(shù)加2,進程還

13、需要的時間片數(shù)減2,并排列到就緒隊列的尾上。</p><p>  (4)對于遇到優(yōu)先數(shù)一致的情況,采用FIFO策略解決</p><p><b>  4.詳細設(shè)計</b></p><p>  (1)struct pcb() 定義pcb塊</p><p>  (2)Void display() 顯示結(jié)果信息函數(shù)</p

14、><p>  (3)int process_finish(pcb *q) 進程完成標示</p><p>  (4)void display_round() 顯示循環(huán)輪轉(zhuǎn)調(diào)度算法運行結(jié)果</p><p>  (5)priority_cal() 優(yōu)先數(shù)調(diào)度算法</p><p>  (6)void cpu_round()處理器的工作狀態(tài)</p&g

15、t;<p><b>  5.源程序代碼</b></p><p>  #include<stdio.h> </p><p>  #include <dos.h> </p><p>  #include<stdlib.h> </p><p>  #include<con

16、io.h> </p><p>  #include<iostream.h> </p><p>  #include<windows.h></p><p>  #define P_NUM 5 </p><p>  #define P_TIME 50 </p><p>  enum state

17、</p><p><b>  {</b></p><p><b>  ready, </b></p><p><b>  execute, </b></p><p><b>  block, </b></p><p><b&g

18、t;  finish</b></p><p><b>  }; </b></p><p>  struct pcb</p><p><b>  {</b></p><p>  char name[4]; </p><p>  int priority; </

19、p><p>  int cputime; </p><p>  int needtime; </p><p>  int count; </p><p>  int round; </p><p>  state process; </p><p>  pcb * next; </p>

20、<p><b>  }; </b></p><p>  pcb * get_process(); </p><p>  pcb * get_process()</p><p><b>  { </b></p><p><b>  pcb *q; </b></p

21、><p><b>  pcb *t; </b></p><p><b>  pcb *p; </b></p><p><b>  int i=0; </b></p><p>  cout<<"input name and time"<<e

22、ndl; </p><p>  while (i<P_NUM){</p><p>  q=(struct pcb *)malloc(sizeof(pcb)); </p><p>  cin>>q->name; </p><p>  cin>>q->needtime; </p><p

23、>  q->cputime=0; </p><p>  q->priority=P_TIME-q->needtime; </p><p>  q->process=ready; </p><p>  q->next=NULL; </p><p>  if (i==0){ p=q; t=q;} </p&

24、gt;<p>  else{t->next=q;t=q; } </p><p><b>  i++; </b></p><p>  } //while </p><p>  return p; </p><p><b>  } </b></p><p> 

25、 void display(pcb *p)</p><p><b>  {</b></p><p>  cout<<"name"<<" "<<"cputime"<<" "<<"needtime"<<

26、" "<<"priority"<<" "<<"state"<<endl; </p><p><b>  while(p)</b></p><p><b>  { </b></p><p>  co

27、ut<<p->name; </p><p>  cout<<" "; </p><p>  cout<<p->cputime; </p><p>  cout<<" "; </p><p>  cout<<p->needtim

28、e; </p><p>  cout<<" "; </p><p>  cout<<p->priority; </p><p>  cout<<" "; </p><p>  switch(p->process)</p><p>&

29、lt;b>  { </b></p><p>  case ready:cout<<"ready"<<endl;break; </p><p>  case execute:cout<<"execute"<<endl;break; </p><p>  case

30、block:cout<<"block"<<endl;break; </p><p>  case finish:cout<<"finish"<<endl;break; </p><p><b>  } </b></p><p>  p=p->next;

31、 </p><p><b>  } </b></p><p><b>  } </b></p><p>  int process_finish(pcb *q)</p><p><b>  { </b></p><p>  int bl=1; </

32、p><p>  while(bl&&q){ </p><p>  bl=bl&&q->needtime==0;</p><p>  q=q->next; </p><p><b>  } </b></p><p>  return bl; </p>

33、;<p><b>  } </b></p><p>  void cpuexe(pcb *q)</p><p><b>  {</b></p><p>  pcb *t=q; </p><p>  int tp=0; </p><p>  while(q){ &

34、lt;/p><p>  if (q->process!=finish)</p><p><b>  {</b></p><p>  q->process=ready;</p><p>  if(q->needtime==0){</p><p>  q->process=fini

35、sh;</p><p><b>  } </b></p><p><b>  } </b></p><p>  if(tp<q->priority&&q->process!=finish)</p><p><b>  { </b></p&

36、gt;<p>  tp=q->priority;</p><p><b>  t=q; </b></p><p><b>  } </b></p><p>  q=q->next; </p><p><b>  } </b></p>&l

37、t;p>  if(t->needtime!=0){</p><p>  t->priority-=3; </p><p>  t->needtime--; </p><p>  t->process=execute; </p><p>  t->cputime++; </p><p>

38、;<b>  } </b></p><p><b>  } </b></p><p>  void priority_cal()</p><p><b>  { </b></p><p><b>  pcb * p; </b></p><

39、;p>  system("cls");</p><p>  p=get_process(); </p><p>  int cpu=0; </p><p>  system("cls"); </p><p>  while(!process_finish(p)){ </p><

40、p><b>  cpu++; </b></p><p>  cout<<"cputime:"<<cpu<<endl; </p><p>  cpuexe(p); </p><p>  display(p); </p><p>  //Sleep(100);&l

41、t;/p><p><b>  getch(); </b></p><p>  system("cls"); </p><p><b>  } </b></p><p>  printf("All processes have finished,press any key t

42、o exit"); </p><p><b>  getch(); </b></p><p><b>  } </b></p><p>  void display_menu()</p><p><b>  { </b></p><p>  c

43、out<<"CHOOSE THE ALGORITHM:"<<endl; </p><p>  cout<<"1 PRIORITY"<<endl; </p><p>  cout<<"2 ROUNDROBIN"<<endl; </p><p&

44、gt;  cout<<"3 EXIT"<<endl; </p><p><b>  } </b></p><p>  pcb * get_process_round()</p><p><b>  { </b></p><p><b>  pcb

45、 *q; </b></p><p><b>  pcb *t; </b></p><p><b>  pcb *p; </b></p><p><b>  int i=0; </b></p><p>  cout<<"input name an

46、d time"<<endl; </p><p>  while (i<P_NUM){ </p><p>  q=(struct pcb *)malloc(sizeof(pcb)); </p><p>  cin>>q->name; </p><p>  cin>>q->needt

47、ime; </p><p>  q->cputime=0; </p><p>  q->round=0; </p><p>  q->count=0; </p><p>  q->process=ready; </p><p>  q->next=NULL; </p><

48、;p>  if (i==0){ </p><p><b>  p=q; </b></p><p><b>  t=q; </b></p><p><b>  } </b></p><p><b>  else{ </b></p><

49、;p>  t->next=q; </p><p><b>  t=q; </b></p><p><b>  } </b></p><p><b>  i++; </b></p><p>  } //while </p><p>  retu

50、rn p; </p><p><b>  } </b></p><p>  void cpu_round(pcb *q)</p><p><b>  { </b></p><p>  q->cputime+=2; </p><p>  q->needtime-=2

51、; </p><p>  if(q->needtime<0) {</p><p>  q->needtime=0; </p><p><b>  } </b></p><p>  q->count++; </p><p>  q->round++; </p>

52、;<p>  q->process=execute; </p><p><b>  } </b></p><p>  pcb * get_next(pcb * k,pcb * head)</p><p><b>  {</b></p><p><b>  pcb * t

53、; </b></p><p><b>  t=k; </b></p><p><b>  do{ </b></p><p>  t=t->next; </p><p><b>  } </b></p><p>  while (t &a

54、mp;& t->process==finish); </p><p>  if(t==NULL){ </p><p><b>  t=head; </b></p><p>  while (t->next!=k && t->process==finish){ </p><p> 

55、 t=t->next; </p><p><b>  } </b></p><p><b>  } </b></p><p>  return t; </p><p><b>  } </b></p><p>  void set_state(pc

56、b *p){ </p><p>  while(p){ </p><p>  if (p->needtime==0){ </p><p>  p->process=finish; </p><p><b>  } </b></p><p>  if (p->process==ex

57、ecute){</p><p>  p->process=ready; </p><p><b>  } </b></p><p>  p=p->next; </p><p><b>  } </b></p><p><b>  } </b>

58、</p><p>  void display_round(pcb *p){ </p><p>  cout<<"NAME"<<" "<<"CPUTIME"<<" "<<"NEEDTIME"<<" "

59、<<"COUNT"<<" "<<"ROUND"<<" "<<"STATE"<<endl; </p><p>  while(p){ </p><p>  cout<<p->name; </p>

60、;<p>  cout<<" "; </p><p>  cout<<p->cputime; </p><p>  cout<<" "; </p><p>  cout<<p->needtime; </p><p>  cout&

61、lt;<" "; </p><p>  cout<<p->count; </p><p>  cout<<" "; </p><p>  cout<<p->round; </p><p>  cout<<" "; &l

62、t;/p><p>  switch(p->process){</p><p>  case ready:cout<<"ready"<<endl;break; </p><p>  case execute:cout<<"execute"<<endl;break; </p&

63、gt;<p>  case finish:cout<<"finish"<<endl;break; </p><p><b>  } </b></p><p>  p=p->next; </p><p><b>  } </b></p><p

64、><b>  } </b></p><p>  void round_cal()</p><p><b>  { </b></p><p><b>  pcb * p; </b></p><p><b>  pcb * r; </b></p&g

65、t;<p>  system("cls"); </p><p>  p=get_process_round();</p><p>  int cpu=0; </p><p>  system("cls"); </p><p><b>  r=p; </b></p

66、><p>  while(!process_finish(p)){ </p><p><b>  cpu+=2; </b></p><p>  cpu_round(r); </p><p>  r=get_next(r,p); </p><p>  cout<<"cpu &quo

67、t;<<cpu<<endl; </p><p>  display_round(p); </p><p>  set_state(p); </p><p>  //Sleep(100); </p><p><b>  getch();</b></p><p>  syste

68、m("cls"); </p><p><b>  } </b></p><p><b>  } </b></p><p>  void main(){ </p><p>  display_menu();</p><p><b>  int k;

69、 </b></p><p>  scanf("%d",&k); </p><p>  switch(k){ </p><p>  case 1:priority_cal();break; </p><p>  case 2:round_cal();break; </p><p>

70、  case 3:break; </p><p>  display_menu(); </p><p>  scanf("%d",&k); </p><p><b>  } </b></p><p><b>  }</b></p><p><

71、b>  4)結(jié)果及分析</b></p><p><b>  程序主界面</b></p><p>  運用優(yōu)先度調(diào)度算法的執(zhí)行結(jié)果</p><p>  一直按回車到第38次運行結(jié)束</p><p>  運用循環(huán)輪轉(zhuǎn)調(diào)度算法的執(zhí)行結(jié)果</p><p>  一直按回車20次得到結(jié)果&l

72、t;/p><p><b>  5)設(shè)計小結(jié)</b></p><p>  處理機調(diào)度問題實際上是處理機分配問題。只有那些參與競爭處理機所必須的資源都已得到滿足的進程才能享受競爭處理機的資格,這時它們處于內(nèi)存就緒狀態(tài)。這些必須的資源包括內(nèi)存、外設(shè)及有關(guān)數(shù)據(jù)結(jié)構(gòu)等。作業(yè)調(diào)度程序必須先調(diào)用存儲管理、外設(shè)管理,分配資源,讓它們能有競爭資格。</p><p>

73、  為了提高資源利用率,一部分在內(nèi)存中處于就緒、等待狀態(tài)而短期內(nèi)不能執(zhí)行進程、作業(yè)換出內(nèi)存,所以外存中除了處于后備狀態(tài)的作業(yè),還有處于就緒狀態(tài)的作業(yè)。這就需要一定的方法和策略來為這部分作業(yè)分配空間。</p><p>  為期一周的課程設(shè)計課使我對處理機調(diào)度問題更進一步的加深了了解更熟練的使用MS VC++程序,在寫代碼的過程中一開始犯了高達12個錯誤,然后一步一步的對程序進行修改完善最終使運行順利得到課程設(shè)計所需

溫馨提示

  • 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)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論