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

下載本文檔

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

文檔簡介

1、<p>  操作系統(tǒng)課程設(shè)計報告</p><p>  題 目: 進(jìn)程調(diào)度算法 </p><p>  Minix操作系統(tǒng)實踐 </p><p>  姓 名: ********* </p><p>  學(xué) 號:

2、 ********* </p><p>  專 業(yè): 計算機(jī)科學(xué)與技術(shù) </p><p>  指導(dǎo)教師: ***** </p><p><b>  實驗一</b></p><p><b>  1.實驗?zāi)康?lt;/b>

3、;</p><p>  通過優(yōu)先權(quán)法和輪轉(zhuǎn)算法的模擬加深對進(jìn)程概念和進(jìn)程調(diào)度過程的理解,掌握進(jìn)程狀態(tài)之間的切換,同時掌握進(jìn)程調(diào)度算法的實現(xiàn)方法和技巧。</p><p><b>  2.實驗內(nèi)容</b></p><p>  1.用C++語言來實現(xiàn)對n個進(jìn)程采用優(yōu)先權(quán)優(yōu)先算法以及輪轉(zhuǎn)算法的進(jìn)程調(diào)度。</p><p>  2.

4、每個用來標(biāo)識進(jìn)程的進(jìn)程控制塊PCB用結(jié)構(gòu)來描述,包括以下字段:</p><p> ?。?)進(jìn)程標(biāo)識ID,其中0為閑逛進(jìn)程,用戶進(jìn)程的標(biāo)識數(shù)為1,2,3…。</p><p> ?。?)進(jìn)程優(yōu)先級Priority,閑逛進(jìn)程(idle)的優(yōu)先級為0,用戶進(jìn)程的優(yōu)先級大于0,且隨機(jī)產(chǎn)生,標(biāo)識數(shù)越大,優(yōu)先級越高。</p><p> ?。?)進(jìn)程占用的CPU時間CPUtime,

5、進(jìn)程每運行一次,累計值等于4。</p><p> ?。?)進(jìn)程總共需要運行時間Alltime,利用隨機(jī)函數(shù)產(chǎn)生。</p><p>  (5)進(jìn)程狀態(tài),0-就緒態(tài);1-運行態(tài);2-阻塞態(tài)。</p><p>  (6)隊列指針next,用來將多個進(jìn)程控制塊PCB鏈接為隊列。</p><p>  3.優(yōu)先數(shù)改變的原則</p><

6、p>  (1)進(jìn)程在就緒隊列中每呆一個時間片,優(yōu)先數(shù)增加1。</p><p> ?。?)進(jìn)程每運行一個時間片,優(yōu)先數(shù)減3。</p><p>  4.在調(diào)度前,系統(tǒng)中擁有的進(jìn)程數(shù)PCB_number由鍵盤輸入,經(jīng)初始化后,所有的進(jìn)程控制塊PCB鏈接成就緒隊列。</p><p>  5.為了清楚地觀察諸進(jìn)程的調(diào)度過程,程序應(yīng)將每個時間片內(nèi)的進(jìn)程的情況顯示出來, &

7、lt;/p><p><b>  3.實驗步驟</b></p><p><b>  進(jìn)程調(diào)度的思想</b></p><p> ?。?)當(dāng)系統(tǒng)空閑(就緒隊列為空)時,系統(tǒng)運行閑逛進(jìn)程,否則運行其他進(jìn)程,發(fā)生變遷1(就緒→運行)。</p><p> ?。?)在運行進(jìn)程(包括閑逛進(jìn)程)的過程中,可能發(fā)生變遷2(

8、運行→阻塞),即將運行進(jìn)程插入到阻塞隊列(閑逛進(jìn)程不能被阻塞),可能有其他新的進(jìn)程創(chuàng)建PCB,還可能喚醒阻塞隊列中的某些進(jìn)程PCB,發(fā)生變遷3(阻塞→就緒),即從阻塞隊列中移出并插入就緒隊列中。</p><p> ?。?)時間片運行結(jié)束后,若進(jìn)程累計占用CPU時間大于等于進(jìn)程需要運行的時間,則進(jìn)程執(zhí)行結(jié)束,釋放其PCB。若進(jìn)程累計占用CPU時間小于進(jìn)程需要運行時間,發(fā)生變遷4(運行→就緒),即將當(dāng)前運行的進(jìn)程插入

9、就緒隊列中。</p><p><b>  程序流程圖</b></p><p>  動態(tài)優(yōu)先權(quán)的進(jìn)程調(diào)度算法模擬流程</p><p>  2.輪轉(zhuǎn)法進(jìn)程調(diào)度算法模擬流程</p><p><b>  程序代碼</b></p><p>  /*以下程序在C++環(huán)境調(diào)試通過*/<

10、;/p><p>  #define NULL 0</p><p>  #include <stdio.h></p><p>  #include <stdlib.h></p><p>  #include<iostream></p><p>  using namespace std

11、;</p><p>  /*以下僅列出動態(tài)優(yōu)先權(quán)的進(jìn)程調(diào)度算法模擬*/</p><p>  /*進(jìn)程PCB結(jié)構(gòu)*/</p><p>  struct Pcb</p><p><b>  {</b></p><p>  int ID;//進(jìn)程標(biāo)識ID,其中0為閑逛進(jìn)程,用戶進(jìn)程的標(biāo)識數(shù)為1,2,3…

12、</p><p>  int priority;//進(jìn)程優(yōu)先級Priority,閑逛進(jìn)程(idle)的優(yōu)先級為0,用戶進(jìn)程的優(yōu)先級大于0,且隨機(jī)產(chǎn)生,標(biāo)識數(shù)越大,優(yōu)先級越高。</p><p>  int CPUtime;//進(jìn)程占用的CPU時間CPUtime,進(jìn)程每運行一次,累計值等于4</p><p>  int ALLtime;//進(jìn)程總共需要運行時間Allti

13、me</p><p>  int State;//進(jìn)程狀態(tài),0-就緒態(tài);1-運行態(tài);2-阻塞態(tài)。</p><p>  struct Pcb *next;//隊列指針next,用來將多個進(jìn)程控制塊PCB鏈接為隊列</p><p><b>  };</b></p><p>  typedef struct Pcb PCB;&

14、lt;/p><p>  void init(); /*產(chǎn)生idle進(jìn)程,輸入用戶進(jìn)程數(shù)目,調(diào)用insert()*/</p><p>  void print(PCB *pcb); /*輸出進(jìn)程屬性信息*/</p><p>  void print_init(PCB *pcb); /*輸出所有PCB的初始值*/</p&g

15、t;<p>  void insert_queue(PCB *queue,PCB *item); /*動態(tài)優(yōu)先權(quán)調(diào)試算法將item插入到隊列中,使得插入后,隊列中按照優(yōu)先級從高到低有序*/</p><p>  void insert_queue1(PCB *queue,PCB *item); /*輪轉(zhuǎn)法將item插入到隊列末尾*/</p><p>  void pu

16、shback_queue(PCB *queue,PCB *item); /*將item插入到隊列的尾部*/</p><p>  void insert(); /*動態(tài)優(yōu)先權(quán)的進(jìn)程調(diào)度算法生成進(jìn)程屬性信息,插入進(jìn)程就緒隊列*/</p><p>  void insert1(); /*輪轉(zhuǎn)法的進(jìn)程調(diào)度算法生成進(jìn)程屬性信息,插入進(jìn)程就緒隊列

17、*/</p><p>  void run(PCB *pcb); /*運行進(jìn)程,隨機(jī)阻塞進(jìn)程、產(chǎn)生新進(jìn)程,插入就緒隊列,喚醒阻塞進(jìn)程*/</p><p>  void run1(PCB *pcb); /*輪轉(zhuǎn)法試運行參數(shù)PCB所指的進(jìn)程*/</p><p>  void block(PCB *pcb); /*調(diào)用destroy

18、(),將進(jìn)程插入阻塞隊列*/</p><p>  void wakeup(); /*動態(tài)優(yōu)先權(quán)的進(jìn)程調(diào)度算法喚醒進(jìn)程,插入就緒隊列*/</p><p>  void wakeup1(); /*輪轉(zhuǎn)法的進(jìn)程調(diào)度算法喚醒進(jìn)程,插入就緒隊列*/</p><p>  void proc_priority(); /

19、*優(yōu)先權(quán)調(diào)度算法模擬*/</p><p>  void proc_loop(); /*輪轉(zhuǎn)法調(diào)度算法模擬*/</p><p>  void update(PCB *pcb); /*更新進(jìn)程信息*/</p><p>  PCB *ready_queue,*block_queue,*idleprocess; /*就緒隊列,阻塞隊列及閑逛進(jìn)

20、程指針變量*/</p><p>  void main()</p><p><b>  {</b></p><p><b>  int i=0;</b></p><p><b>  while(1)</b></p><p><b>  {<

21、;/b></p><p>  cout<<("\n Please select a number (1,2,0) ");</p><p>  cout<<("\n 1-- priority ");</p><p>  cout<<("\n 2-- loop");&l

22、t;/p><p>  cout<<("\n 0-- exit\n");</p><p><b>  cin>>i;</b></p><p><b>  if(i==1)</b></p><p><b>  {</b></p>

23、<p>  cout<<("\nThis is an example for priority processing:\n");</p><p><b>  init();</b></p><p>  ::proc_priority();</p><p><b>  }</b>&

24、lt;/p><p>  else if (i==2)</p><p><b>  {</b></p><p>  cout<<("\nThis is an example for round robin processing:\n");</p><p><b>  init();&l

25、t;/b></p><p>  proc_loop();</p><p><b>  }</b></p><p>  else if(i==0)</p><p><b>  exit(1);</b></p><p><b>  }</b></

26、p><p><b>  }</b></p><p>  /*輸出所有PCB的初始值,此函數(shù)用于測試程序*/</p><p>  void print_init(PCB *pcb)</p><p><b>  {</b></p><p>  PCB *temp=pcb->ne

27、xt;</p><p>  cout<<("\n ID priority CPUtime ALLtime State\n");</p><p>  while(temp!=NULL)</p><p><b>  {</b></p><p>  cout<

28、;<"\n"<<" "<<temp->ID<<" "<<temp->priority<<" "<<temp->CPUtime<<" "<<temp->ALLt

29、ime;</p><p>  if (temp->State==0)</p><p>  cout<<(" ready");</p><p>  else if (temp->State==1)</p><p>  cout<<(" runn

30、ing");</p><p><b>  else</b></p><p>  cout<<(" blocked");</p><p>  temp=temp->next;</p><p><b>  }</b></p>

31、<p><b>  }</b></p><p>  /*輸出進(jìn)程屬性信息*/</p><p>  void print(PCB *pcb)</p><p><b>  {</b></p><p>  PCB *temp;</p><p><b>  te

32、mp=pcb;</b></p><p>  if (pcb->ID==0) </p><p>  cout<<("\n\tThe idle process is running!");</p><p><b>  else</b></p><p><b>  {

33、</b></p><p>  cout<<"\n"<<" "<<temp->ID<<" "<<temp->priority<<" "<<temp->CPUtime<<&

34、quot; "<<temp->ALLtime;</p><p>  if (temp->State==0)</p><p>  cout<<(" ready");</p><p>  else if (temp->State==1)</p><

35、p>  cout<<(" running");</p><p><b>  else</b></p><p>  cout<<(" blocked");</p><p><b>  }</b></p>&

36、lt;p><b>  }</b></p><p>  void insert_queue(PCB *queue,PCB *item)</p><p>  {//動態(tài)優(yōu)先權(quán)調(diào)試算法將item插入到隊列中,使得插入后,隊列中按照優(yōu)先級從高到低有序</p><p>  PCB *p,*q;</p><p>  q=que

37、ue;p=q->next;</p><p>  while(p!=0 &&p->priority>=item->priority )</p><p><b>  {</b></p><p><b>  q=p;</b></p><p>  p=p->ne

38、xt;</p><p><b>  }</b></p><p><b>  if(p==0)</b></p><p><b>  {//在隊尾插入</b></p><p>  item->next=0;</p><p>  q->next=i

39、tem;</p><p><b>  }</b></p><p><b>  else</b></p><p>  {//在q之后、p之前插入</p><p>  item->next=p;</p><p>  q->next=item;</p>&

40、lt;p><b>  }</b></p><p><b>  }</b></p><p>  void insert_queue1(PCB *queue,PCB *item)</p><p>  {//輪轉(zhuǎn)法將item插入到隊列末尾</p><p>  PCB *p,*q;</p>

41、<p>  q=queue;p=q->next;</p><p>  item->next=0;</p><p>  q->next=item;</p><p><b>  }</b></p><p>  void pushback_queue(PCB *queue,PCB *item)&

42、lt;/p><p>  {//將item插入到隊列的尾部</p><p>  PCB *p,*q;</p><p>  q=queue;p=q->next;</p><p>  while(p!=0 )</p><p><b>  {</b></p><p><b&

43、gt;  q=p;</b></p><p>  p=p->next;</p><p><b>  }</b></p><p>  item->next=q->next;</p><p>  q->next=item;</p><p><b>  }&l

44、t;/b></p><p>  void sort_queue(PCB *&queue)</p><p>  {//對queue中的結(jié)點進(jìn)行排序,按照優(yōu)先級從大到小</p><p>  PCB *temp=new PCB;</p><p>  temp->next=0;</p><p>  whil

45、e(queue->next)</p><p><b>  {</b></p><p><b>  PCB *p;</b></p><p>  p=queue->next;queue->next=p->next;</p><p>  ::insert_queue(temp,p)

46、;</p><p><b>  }</b></p><p>  queue->next=temp->next;</p><p>  delete temp;</p><p><b>  }</b></p><p>  /*動態(tài)優(yōu)先權(quán)的進(jìn)程調(diào)度生成進(jìn)程屬性信息,插入

47、進(jìn)程就緒隊列,顯示進(jìn)程信息*/</p><p>  void insert()</p><p><b>  {</b></p><p>  PCB *newp=0;</p><p>  static long id=0;</p><p>  newp=new PCB;</p><

48、;p><b>  id++;</b></p><p>  newp->ID=id;</p><p>  newp->State=0;</p><p>  newp->CPUtime=0;</p><p>  newp->priority=rand()%3+1;</p><

49、p>  newp->ALLtime=rand()%3+1;</p><p>  newp->next=NULL;</p><p>  ::pushback_queue(ready_queue,newp);//將新生成進(jìn)程插入到就緒隊列尾部</p><p>  print(newp);</p><p>  cout<&l

50、t;("\t建立: Creating -> ready\n");</p><p><b>  }</b></p><p>  /*輪轉(zhuǎn)法的進(jìn)程調(diào)度生成進(jìn)程屬性信息,插入進(jìn)程就緒隊列,顯示進(jìn)程信息*/</p><p>  void insert1()</p><p><b>  {<

51、;/b></p><p>  PCB *newp=0;</p><p>  static long id=0;</p><p>  newp=new PCB;</p><p><b>  id++;</b></p><p>  newp->ID=id;</p><p

52、>  newp->State=0;</p><p>  newp->CPUtime=0;</p><p>  newp->ALLtime=rand()%3+1;</p><p>  newp->next=NULL;</p><p>  ::pushback_queue(ready_queue,newp);//將新

53、生成進(jìn)程插入到就緒隊列尾部</p><p>  print(newp);</p><p>  cout<<("\t建立: Creating -> ready\n");</p><p><b>  }</b></p><p>  /*生成n個進(jìn)程屬性信息,插入進(jìn)程就緒隊列,顯示進(jìn)程信息

54、*/</p><p>  void insert(int n)</p><p><b>  {</b></p><p>  for(int i=1;i<=n;i++)</p><p><b>  {</b></p><p><b>  insert();<

55、;/b></p><p><b>  } </b></p><p><b>  }</b></p><p>  /*動態(tài)優(yōu)先權(quán)調(diào)度產(chǎn)生idle進(jìn)程,輸入用戶進(jìn)程數(shù)目,調(diào)用insert()*/</p><p>  void init()</p><p><b>

56、  {</b></p><p>  //為每個隊列設(shè)立頭結(jié)點,便于插入刪除操作</p><p>  block_queue=new PCB;</p><p>  block_queue->next=0;</p><p>  ready_queue=new PCB;</p><p>  ready_qu

57、eue->next=0;</p><p>  int i,pcb_number=-1;</p><p>  idleprocess=NULL; /*設(shè)置閑逛進(jìn)程PCB各字段值*/</p><p>  idleprocess=(PCB *)malloc(sizeof(PCB));</p><p>  idleproce

58、ss->ID=0;</p><p>  idleprocess->State=0;</p><p>  idleprocess->CPUtime=0;</p><p>  idleprocess->priority=0;</p><p>  idleprocess->ALLtime=1;</p>&

59、lt;p>  idleprocess->next=NULL;</p><p>  //閑逛進(jìn)程放入就緒隊列</p><p>  idleprocess->next=ready_queue->next;</p><p>  ready_queue->next=idleprocess; </p><p>  //也可

60、假定初始時系統(tǒng)中只有一個idle進(jìn)程</p><p>  ////輸入初始時進(jìn)程的個數(shù)</p><p>  //while (pcb_number<0)</p><p><b>  //{</b></p><p>  //cout<<("Input the number of the PCB

61、 to be started:");</p><p>  //cin>>pcb_number;</p><p><b>  //}</b></p><p>  //cout<<("\n ID priority CPUtime ALLtime State");

62、</p><p>  //for (i=0;i<pcb_number;i++)</p><p>  //insert();</p><p>  cout<<"就緒隊列初始化成功"<<endl;</p><p>  ::print_init(ready_queue);</p>&

63、lt;p>  cout<<endl;</p><p><b>  }</b></p><p>  /*調(diào)用destroy(),將進(jìn)程插入阻塞隊列*/</p><p>  void block(PCB *pcb)</p><p>  {//將pcb插入到阻塞隊列</p><p>

64、  pcb->State=2; /*將PCB所指進(jìn)程的狀態(tài)設(shè)置為阻塞*/</p><p>  pcb->CPUtime-=2; /*設(shè)進(jìn)程執(zhí)行半個時間片單位后被阻塞*/</p><p>  /*pcb->next=NULL;*/</p><p>  print(pcb);</p><p>

65、;  cout<<(" 變遷2:running -> blocked\n");</p><p>  //將pcb插入到阻塞隊列</p><p>  //按照什么方式插入呢,需要參考喚醒條件</p><p>  //因為是隨機(jī)喚醒一個進(jìn)程,所以我們就簡單地把它放置在阻塞隊列的頭部</p><p>

66、  pcb->next=block_queue->next;</p><p>  block_queue->next=pcb;</p><p><b>  }</b></p><p>  void update(PCB *pcb)</p><p>  {//就緒隊列中進(jìn)程的優(yōu)先級均增加1</p&g

67、t;<p>  PCB *temp=ready_queue->next;</p><p>  while(temp && temp->next )</p><p>  {//就緒隊列的最后一個是閑逛進(jìn)程</p><p>  temp->priority++;</p><p>  temp=tem

68、p->next;</p><p><b>  }</b></p><p><b>  }</b></p><p>  /*動態(tài)優(yōu)先權(quán)調(diào)度試運行參數(shù)PCB所指的進(jìn)程*/</p><p>  void run(PCB *pcb) </p><p

69、><b>  {</b></p><p>  //如果pcb是閑逛進(jìn)程,則不做處理,再次放入就緒隊列ready_queue</p><p>  if(pcb->ID==0)</p><p><b>  {</b></p><p>  ::insert_queue(ready_queue,

70、pcb);</p><p>  print(pcb);</p><p>  cout<<" 變遷1:ready -> running\n";</p><p><b>  }</b></p><p><b>  else</b></p>&

71、lt;p>  {//如果不是閑逛進(jìn)程,則進(jìn)行如下處理</p><p>  pcb->State=1;/*設(shè)置該進(jìn)程的狀態(tài)為"運行"*/</p><p>  pcb->CPUtime+=4;/*累計該進(jìn)程占用CPU的時間*/</p><p>  pcb->priority=pcb->priority-3; /*每運行一

72、個時間片,其優(yōu)先數(shù)減3*/</p><p>  if(pcb->priority<1)pcb->priority=1;</p><p>  print(pcb);</p><p>  printf(" 變遷1:ready -> running\n");</p><p>  if (rand

73、()%3==1 ) /*PCB不是閑逛進(jìn)程,滿足條件則阻塞此進(jìn)程*/</p><p><b>  {</b></p><p>  if(pcb->CPUtime-2<pcb->ALLtime)</p><p>  block(pcb);</p><p><b>  else</b>

74、;</p><p>  {//已經(jīng)執(zhí)行完畢,應(yīng)該銷毀進(jìn)程</p><p>  cout<<endl;</p><p>  cout<<"\t the process no "<<pcb->ID<<" is completed! 銷毀:running->Destroy&q

75、uot;<<endl;</p><p>  delete pcb;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  else</b></p><p>  {//否則看改進(jìn)程是否執(zhí)行完

76、畢,如果執(zhí)行完,則釋放,否則再次放入就緒隊列</p><p>  if(pcb->CPUtime>=pcb->ALLtime)</p><p><b>  {//釋放</b></p><p>  cout<<endl;</p><p>  cout<<"\t the p

77、rocess no "<<pcb->ID<<" is completed! 銷毀:running->Destroy"<<endl;</p><p>  delete pcb;</p><p><b>  }</b></p><p><b>  els

78、e</b></p><p>  {//再次放入就緒隊列,按照優(yōu)先級有序</p><p>  ::insert_queue(ready_queue,pcb);</p><p><b>  }</b></p><p><b>  }</b></p><p><b

79、>  }</b></p><p>  update(ready_queue);/*更新就緒隊列進(jìn)程優(yōu)先數(shù)*/</p><p>  if (rand()%5==1)</p><p><b>  {</b></p><p>  insert(3); /*創(chuàng)建3個新進(jìn)程*/</p>&l

80、t;p>  ::sort_queue(ready_queue);</p><p><b>  }</b></p><p>  if (rand()%7==1)</p><p>  wakeup(); /*喚醒一個進(jìn)程*/ </p><p>  /*返回當(dāng)前進(jìn)程是否被阻塞,

81、1(已阻塞),0(未阻塞)*/</p><p><b>  }</b></p><p>  /*輪轉(zhuǎn)法試運行參數(shù)PCB所指的進(jìn)程*/</p><p>  void run1(PCB *pcb) </p><p><b>  {</b></p><

82、p>  //如果pcb是閑逛進(jìn)程,則不做處理,再次放入就緒隊列ready_queue</p><p>  if(pcb->ID==0)</p><p><b>  {</b></p><p>  ::insert_queue1(ready_queue,pcb);</p><p>  print(pcb);&l

83、t;/p><p>  cout<<" 變遷1:ready -> running\n";</p><p><b>  }</b></p><p><b>  else</b></p><p>  {//如果不是閑逛進(jìn)程,則進(jìn)行如下處理</p>

84、<p>  pcb->State=1;/*設(shè)置該進(jìn)程的狀態(tài)為"運行"*/</p><p>  pcb->CPUtime+=4;/*累計該進(jìn)程占用CPU的時間*/</p><p>  //if(pcb->priority<1)pcb->priority=1;</p><p>  //print(pcb);

85、</p><p>  // printf(" 變遷1:ready -> running\n");</p><p>  if (rand()%3==1 ) /*PCB不是閑逛進(jìn)程,滿足條件則阻塞此進(jìn)程*/</p><p><b>  {</b></p><p>  if(pcb-&g

86、t;CPUtime-2<pcb->ALLtime)</p><p>  block(pcb);</p><p><b>  else</b></p><p>  {//已經(jīng)執(zhí)行完畢,應(yīng)該銷毀進(jìn)程</p><p>  cout<<endl;</p><p>  cout<

87、;<"\t the process no "<<pcb->ID<<" is completed! 銷毀:running->Destroy"<<endl;</p><p>  delete pcb;</p><p><b>  }</b></p><

88、p><b>  }</b></p><p><b>  else</b></p><p>  {//否則看改進(jìn)程是否執(zhí)行完畢,如果執(zhí)行完,則釋放,否則再次放入就緒隊列</p><p>  if(pcb->CPUtime>=pcb->ALLtime)</p><p><b

89、>  {//釋放</b></p><p>  cout<<endl;</p><p>  cout<<"\t the process no "<<pcb->ID<<" is completed! 銷毀:running->Destroy"<<endl;&l

90、t;/p><p>  delete pcb;</p><p><b>  }</b></p><p><b>  else</b></p><p>  {//再次放入就緒隊列</p><p>  ::insert_queue1(ready_queue,pcb);</p>

91、;<p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  if (rand()%5==1)</p><p><b>  {</b></p><p&

92、gt;  insert(3); /*創(chuàng)建3個新進(jìn)程*/</p><p>  //::sort_queue(ready_queue);</p><p><b>  }</b></p><p>  if (rand()%7==1)</p><p>  wakeup1(); /*喚醒一

93、個進(jìn)程*/ </p><p>  /*返回當(dāng)前進(jìn)程是否被阻塞,1(已阻塞),0(未阻塞)*/</p><p><b>  }</b></p><p>  /*喚醒,即從阻塞隊列中選擇一個PCB,且插入就緒隊列中*/</p><p>  void wakeup()</p><p>  {/

94、/隨機(jī)喚醒一個阻塞進(jìn)程</p><p>  //這里采取的方法是遍歷阻塞隊列,每訪問一個,就產(chǎn)生一個隨機(jī)數(shù)</p><p>  //如果該隨機(jī)數(shù)對20求余恰好是1,則當(dāng)前結(jié)點被喚醒,就要納入就緒隊列</p><p>  if(block_queue->next==0)//此時沒有被阻塞的進(jìn)程,無所謂喚醒</p><p><b>

95、;  return;</b></p><p>  PCB *q,*p;//下面遍歷阻塞隊列,q永遠(yuǎn)指向p的前驅(qū)</p><p>  while(true)</p><p><b>  {</b></p><p>  q=block_queue;</p><p>  p=q->ne

96、xt;</p><p>  while(p && rand()%20!=1)</p><p><b>  {</b></p><p><b>  q=p;</b></p><p>  p=p->next;</p><p><b>  }<

97、/b></p><p><b>  if(p!=0)</b></p><p>  {//p就是要喚醒的進(jìn)程</p><p>  q->next=p->next;</p><p><b>  break;</b></p><p><b>  }<

98、;/b></p><p><b>  }</b></p><p>  p->State=0;</p><p>  cout<<endl;</p><p>  ::print(p);</p><p>  cout<<" 變遷3:blocked->r

99、eady"<<endl;</p><p>  ::insert_queue(ready_queue,p);</p><p><b>  }</b></p><p>  void wakeup1()</p><p>  {//隨機(jī)喚醒一個阻塞進(jìn)程</p><p>  //這里采

100、取的方法是遍歷阻塞隊列,每訪問一個,就產(chǎn)生一個隨機(jī)數(shù)</p><p>  //如果該隨機(jī)數(shù)對20求余恰好是1,則當(dāng)前結(jié)點被喚醒,就要納入就緒隊列</p><p>  if(block_queue->next==0)//此時沒有被阻塞的進(jìn)程,無所謂喚醒</p><p><b>  return;</b></p><p&g

101、t;  PCB *q,*p;//下面遍歷阻塞隊列,q永遠(yuǎn)指向p的前驅(qū)</p><p>  while(true)</p><p><b>  {</b></p><p>  q=block_queue;</p><p>  p=q->next;</p><p>  while(p &

102、& rand()%20!=1)</p><p><b>  {</b></p><p><b>  q=p;</b></p><p>  p=p->next;</p><p><b>  }</b></p><p><b>  i

103、f(p!=0)</b></p><p>  {//p就是要喚醒的進(jìn)程</p><p>  q->next=p->next;</p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  

104、}</b></p><p>  p->State=0;</p><p>  cout<<endl;</p><p>  ::print(p);</p><p>  cout<<" 變遷3:blocked->ready"<<endl;</p><

105、p>  ::insert_queue1(ready_queue,p);</p><p><b>  }</b></p><p>  /*優(yōu)先權(quán)優(yōu)先調(diào)度算法*/</p><p>  void proc_priority()</p><p><b>  {</b></p><p

106、>  ::sort_queue(ready_queue);//對queue中的結(jié)點進(jìn)行排序,按照優(yōu)先級從大到小</p><p>  PCB *temp=0,*running=0; /*running的PCB指針*/</p><p>  int times;</p><p>  for(times=0;times<10;times++)<

107、/p><p><b>  {</b></p><p>  //找到優(yōu)先級最高的進(jìn)程,并且從隊列中刪除</p><p>  cout<<"本次調(diào)度前:"<<endl;</p><p>  ::print_init(ready_queue);</p><p> 

108、 running=ready_queue->next; /*running指向就緒隊列隊首PCB*/</p><p>  ready_queue->next=running->next;</p><p>  cout<<endl;</p><p>  cout<<"本次調(diào)度開始"<<en

109、dl;</p><p>  ::run(running);</p><p>  cout<<"\n本次調(diào)度結(jié)束。"<<endl;</p><p><b>  }</b></p><p><b>  }</b></p><p>  /

110、*輪轉(zhuǎn)法進(jìn)程調(diào)用算法*/</p><p>  void proc_loop()</p><p><b>  {</b></p><p>  PCB *temp=0,*running=0; /*running的PCB指針*/</p><p>  int times;</p><p> 

111、 for(times=0;times<10;times++)</p><p><b>  {</b></p><p>  cout<<"本次調(diào)度前:"<<endl;</p><p>  ::print_init(ready_queue);</p><p>  runnin

112、g=ready_queue->next; /*running指向就緒隊列隊首PCB*/</p><p>  ready_queue->next=running->next;</p><p>  cout<<endl;</p><p>  cout<<"本次調(diào)度開始"<<endl;<

113、/p><p>  ::run1(running);</p><p>  cout<<"\n本次調(diào)度結(jié)束。"<<endl;</p><p><b>  }</b></p><p><b>  }</b></p><p>  圖0 輸入實現(xiàn)

114、調(diào)度的方法</p><p>  圖1 輸入1 在動態(tài)優(yōu)先級調(diào)度算法下執(zhí)行</p><p><b>  圖2</b></p><p>  圖3 輸入2 在輪轉(zhuǎn)法調(diào)度算法下執(zhí)行</p><p><b>  圖4</b></p><p>  4.實驗過程中遇到的問題及解決方案<

115、;/p><p>  對進(jìn)程調(diào)度的思想理解不夠深刻,不知道如何實現(xiàn)對進(jìn)程優(yōu)先級的排序,以及進(jìn)程控制塊如何配置信息。在翻閱在大量書箱和同學(xué)的幫助下,解決了用動態(tài)優(yōu)先級在方法實現(xiàn)進(jìn)程調(diào)度模擬算法。在對C++語言的使用尤其是在編寫代碼方面很欠缺,在組織語言時出錯不斷。經(jīng)過自己的多次修改之后,程序才得以運行。在做輪轉(zhuǎn)法實現(xiàn)的過程中,參考動態(tài)優(yōu)先級在方法,便很容易實現(xiàn)。</p><p><b>

116、  5.課程設(shè)計總結(jié)</b></p><p>  通過本次的課程設(shè)計,使我能夠正確運用操作系統(tǒng)課程中所學(xué)的基本理論和知識,加深了對進(jìn)程調(diào)度基本概念的理解,還有讓我感受很深的是對C++語言的應(yīng)用,由于對C++語言在平時運用的不夠,在對C++語言的使用尤其是在編寫代碼方面很欠缺,在組織語言時出錯不斷。在設(shè)計過程中,需要大量的相關(guān)資料,為了本次課程設(shè)計我在網(wǎng)上和圖書館查閱了大量資料,不斷的發(fā)現(xiàn)問題、提出問題

117、、解決問題。在編程和調(diào)試的過程中,經(jīng)常會出現(xiàn)意想不到的問題,并非每個問題都可以從相關(guān)資料中找到解決方法,有些問題是無法預(yù)料到的,這就需要通過自己理性的分析得出問題的解決方案。我還希望我們可以有更多這樣的學(xué)習(xí)機(jī)會,使我們的知識體系變的更加牢固。</p><p><b>  實驗二</b></p><p>  在Windows操作系統(tǒng)上安裝Bochs虛擬機(jī)。配置Bochs

118、虛擬機(jī),并完成Minix操作系統(tǒng)的運行。</p><p><b>  1.實驗?zāi)康?lt;/b></p><p>  閱讀并理解Bochs虛擬機(jī)的基本概念,成功安裝Bochs虛擬機(jī)。閱讀Minix操作系統(tǒng)相關(guān)技術(shù)資料,理解Minix操作系統(tǒng)的安裝過程和Minix操作系統(tǒng)的模塊結(jié)構(gòu),實現(xiàn)Minix操作系統(tǒng)的運行;</p><p><b>  

119、2.實驗內(nèi)容</b></p><p>  Minix操作系統(tǒng)的安裝、運行及退出</p><p><b>  3.實驗步驟</b></p><p>  步驟一、在http://sourceforge.net地址下載Bochs-2.0.2虛擬機(jī)軟件Bochs-2.0.2.Win32-bin.zip,大小為2.55MB,將其安裝在C:\b

120、ochs-2.0.2目錄下(安裝目錄可以是任意硬盤分區(qū),本處為C盤分區(qū));</p><p>  步驟二、下載Minix操作系統(tǒng)鏡像Minix204.zip,大小為6.84MB,并用WINRAR解壓縮軟件解壓縮鏡像文件,將鏡像文件復(fù)制到C:\bochs-2.0.2\Minix204目錄下;</p><p>  步驟三、配置Minix操作系統(tǒng)的啟動文件C:\bochs-2.0.2\Minix2

121、04\run.bat,配置內(nèi)容如下:</p><p>  #設(shè)置BXSHARE環(huán)境變量</p><p>  SET BXSHARE=C:\bochs-2.0.2</p><p>  #將當(dāng)前目錄換到C:\Bochs-2.0.2\minix204</p><p>  cd "C:\Bochs-2.0.2\minix204"&

122、lt;/p><p>  #使用當(dāng)前目錄下的minix.bxrc配置文件運行bochs</p><p>  ..\bochs -q -f minix.bxrc</p><p>  步驟四、在C:\bochs-2.0.2\Minix204\目錄下配置Minix操作系統(tǒng)硬件配置文件minix.bxrc,配置內(nèi)容如下:</p><p><b>

123、  megs: 40</b></p><p>  romimage: file=$BXSHARE/BIOS-bochs-latest, address=0xf0000</p><p>  vgaromimage: $BXSHARE/VGABIOS-elpin-2.40</p><p>  ata0-master: type=disk, path=mini

124、x.img, cylinders=200, heads=16, spt=32</p><p>  log: bochsout.txt</p><p>  panic: action=ask</p><p>  error: action=report</p><p>  info: action=report</p><p

125、>  debug: action=ignore</p><p>  ips: 1000000</p><p>  mouse: enabled=0</p><p>  user_shortcut: keys=ctrlaltdel</p><p>  boot: disk</p><p>  floppya: 1_

126、44=vfloppya.img, status=inserted</p><p>  ata0-slave: type=cdrom, path=d:, status=inserted</p><p>  步驟五、在C:\bochs-2.0.2\Minix204\目錄下,雙擊run.bat,運行Minix操作系統(tǒng);</p><p>  如圖3-2所示,在此處選擇使用單

127、機(jī)版的Minix,還是網(wǎng)絡(luò)版的Minix(鍵入=,選擇單機(jī)版Minix;鍵入n,選擇網(wǎng)絡(luò)版Minix)</p><p>  網(wǎng)絡(luò)版與單機(jī)版選擇界面</p><p>  Minix操作系統(tǒng)登錄界面</p><p><b>  4.實驗結(jié)果</b></p><p>  4.實驗過程中遇到的問題及解決方案</p>

128、<p>  在安裝Minix和配置Bochs的過程中不知道配置問題,在老師給的參考下成功的配置了Bochs并且運行了Minix。</p><p>  運行Minix的過程中出現(xiàn)的命令不知道如何操作在同學(xué)的幫助下也克服了這一困難,最終實現(xiàn)了Minix的命令的運行,并且的到了運行界面。</p><p><b>  5.課程設(shè)計總結(jié)</b></p>

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論