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

下載本文檔

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

文檔簡介

1、<p><b>  計(jì)算機(jī)科學(xué)與應(yīng)用系</b></p><p><b>  操作系統(tǒng)原理</b></p><p><b>  課程設(shè)計(jì)報(bào)告</b></p><p>  題目: 進(jìn)程調(diào)度算法 </p><p><b>  班級: </b

2、></p><p>  姓名: </p><p>  專業(yè): 計(jì)算機(jī)科學(xué)與技術(shù) </p><p>  指導(dǎo)老師: </p><p><b>  進(jìn)程調(diào)度算法</b></p><p><b>  一、實(shí)驗(yàn)?zāi)康?lt;/b></p>

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

4、程的進(jìn)程控制塊PCB用結(jié)果來描述,包括以下字段</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時(shí)間CPUtime,進(jìn)

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

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

7、/p><p><b>  三、實(shí)驗(yàn)步驟</b></p><p>  1、進(jìn)程管理程序調(diào)式好后,運(yùn)行進(jìn)程管理程序</p><p><b>  Y</b></p><p><b>  N</b></p><p><b>  N</b><

8、;/p><p><b>  Y</b></p><p><b>  Y</b></p><p><b>  N</b></p><p><b>  N</b></p><p><b>  Y</b></p&

9、gt;<p><b>  Y</b></p><p><b>  N</b></p><p><b>  N</b></p><p><b>  Y</b></p><p><b>  2、優(yōu)先權(quán)調(diào)度</b></p

10、><p>  (1)輸入1選擇優(yōu)先權(quán)調(diào)度算法模擬。</p><p>  (2)輸入開始進(jìn)程個(gè)數(shù)n,創(chuàng)建n個(gè)PCB并加入就緒隊(duì)列ready_queue中。</p><p> ?。?)就緒隊(duì)列ready_queue不為空,調(diào)度就緒隊(duì)列中第一個(gè)進(jìn)程運(yùn)行,否則,從閑逛隊(duì)列idleprocess中調(diào)度閑逛進(jìn)程運(yùn)行。</p><p> ?。?)在運(yùn)行過程中,

11、當(dāng)遇到阻塞,則該進(jìn)程插入到阻塞隊(duì)列block_queue中,且將該進(jìn)程從ready_queue中刪除。</p><p> ?。?)如果運(yùn)行時(shí)間CPUtime大于等于Alltime,該進(jìn)程運(yùn)行完畢,釋放該進(jìn)程;否則插入到就緒隊(duì)列中。</p><p> ?。?)更新就緒隊(duì)列中的優(yōu)先級數(shù)。</p><p> ?。?)隨機(jī)對阻塞隊(duì)列block_queue中的進(jìn)程PCB詢問是

12、否要喚醒,喚醒,即從喚醒隊(duì)列中選擇第一個(gè)進(jìn)程,且插入就緒隊(duì)列中;阻塞隊(duì)列中沒有阻塞進(jìn)程返回。</p><p> ?。?)重復(fù)上述步驟,直到本次調(diào)度結(jié)束。</p><p><b>  3、輪轉(zhuǎn)調(diào)度</b></p><p> ?。?)輸入2選擇優(yōu)先權(quán)調(diào)度算法模擬。</p><p> ?。?)輸入開始進(jìn)程個(gè)數(shù)n,創(chuàng)建n個(gè)PCB

13、并加入就緒隊(duì)列ready_queue中。</p><p>  (3)就緒隊(duì)列ready_queue不為空,調(diào)度就緒隊(duì)列中第一個(gè)進(jìn)程運(yùn)行,否則,從閑逛隊(duì)列idleprocess中調(diào)度閑逛進(jìn)程運(yùn)行。</p><p> ?。?)在運(yùn)行過程中,當(dāng)遇到阻塞,則該進(jìn)程插入到阻塞隊(duì)列block_queue中,且將該進(jìn)程從ready_queue中刪除。</p><p> ?。?)如

14、果運(yùn)行時(shí)間CPUtime大于等于Alltime,該進(jìn)程運(yùn)行完畢,釋放該進(jìn)程;否則插入到就緒隊(duì)列中。</p><p> ?。?)隨機(jī)對阻塞隊(duì)列block_queue中的進(jìn)程PCB詢問是否要喚醒,喚醒,即從喚醒隊(duì)列中選擇第一個(gè)進(jìn)程,且插入就緒隊(duì)列中;阻塞隊(duì)列中沒有阻塞進(jìn)程返回。</p><p> ?。?)如果時(shí)間到,本次調(diào)度結(jié)束,否則重復(fù)上述步驟,直到本次調(diào)度結(jié)束。</p>&l

15、t;p><b>  Y</b></p><p><b>  N</b></p><p><b>  N</b></p><p><b>  Y</b></p><p><b>  Y</b></p><p&g

16、t;<b>  N</b></p><p><b>  N</b></p><p><b>  Y</b></p><p><b>  Y</b></p><p><b>  N</b></p><p>&l

17、t;b>  N</b></p><p><b>  Y</b></p><p><b>  Y</b></p><p>  四、實(shí)驗(yàn)過程中遇到的問題及解決方案</p><p>  1、請仔細(xì)閱讀動態(tài)優(yōu)先權(quán)的進(jìn)程調(diào)度算法的模擬實(shí)現(xiàn)代碼,說明該算法與教材中介紹的算法做了哪些簡單化處理.

18、</p><p>  優(yōu)先權(quán)模擬時(shí)優(yōu)先權(quán)是隨機(jī)產(chǎn)生,在實(shí)際的系統(tǒng)中,系統(tǒng)進(jìn)程的優(yōu)先權(quán)高于一般用戶進(jìn)程的優(yōu)先權(quán)。</p><p>  2、為什么對進(jìn)程的優(yōu)先數(shù)可按上述原則進(jìn)行修改?</p><p>  最高優(yōu)先權(quán)調(diào)度算法僅照顧了優(yōu)先權(quán)高的進(jìn)程,當(dāng)不斷有優(yōu)先權(quán)高的進(jìn)程需調(diào)度時(shí),而優(yōu)先權(quán)低的進(jìn)程將很難得到處理機(jī)的調(diào)度,所以進(jìn)程在就緒隊(duì)列中每呆一個(gè)時(shí)間片,優(yōu)先數(shù)增加1,使優(yōu)

19、先權(quán)低的進(jìn)程不總是忙等。</p><p>  3、請給出設(shè)計(jì)實(shí)現(xiàn)的輪轉(zhuǎn)發(fā)進(jìn)程調(diào)度算法的設(shè)計(jì)思想.</p><p>  時(shí)間輪轉(zhuǎn)調(diào)度算法:系統(tǒng)將所有的就像進(jìn)程按先來先服務(wù)的原則,排成一個(gè)隊(duì)列,每次調(diào)度時(shí),把CPU分配給首進(jìn)程,并令其執(zhí)行一個(gè)時(shí)間片。當(dāng)執(zhí)行的時(shí)間片用完時(shí),發(fā)出中斷請求,調(diào)度程序便據(jù)此信號來停止該進(jìn)程的執(zhí)行,并將其送到就緒隊(duì)列的末尾,如此反復(fù),就可以保證就緒隊(duì)列中的所有進(jìn)程在一個(gè)

20、給定的時(shí)間內(nèi),均能獲得一時(shí)間片處理機(jī)執(zhí)行時(shí)間。</p><p>  4、在實(shí)際的進(jìn)程調(diào)度中,除了按調(diào)度算法選擇下一個(gè)執(zhí)行的進(jìn)程外,還應(yīng)處理哪些工作?</p><p>  最高優(yōu)先權(quán)調(diào)度算法,常用于批處理系統(tǒng)中,作為作業(yè)調(diào)度算法,也作為多種操作系統(tǒng)中的進(jìn)程調(diào)度算法,還可以用于實(shí)時(shí)系統(tǒng)中:時(shí)間輪轉(zhuǎn)調(diào)度算法,一般用于分時(shí)系統(tǒng)中。</p><p><b>  五、

21、課程設(shè)計(jì)總結(jié)</b></p><p>  1、當(dāng)把該算法用于作業(yè)調(diào)度時(shí),系統(tǒng)將從后備隊(duì)列中選擇若干個(gè)優(yōu)先權(quán)最高的作業(yè),裝入內(nèi)存,當(dāng)用于進(jìn)程調(diào)度算法時(shí),該算法是把處理及分配給就緒隊(duì)列中優(yōu)先權(quán)最高的進(jìn)程。</p><p>  2、當(dāng)系統(tǒng)空閑(就緒隊(duì)列為空)時(shí),系統(tǒng)運(yùn)行閑逛進(jìn)程,否則運(yùn)行其他進(jìn)程,發(fā)生變遷(就緒運(yùn)行)</p><p>  3、在運(yùn)行進(jìn)程(包括閑

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

23、當(dāng)前運(yùn)行的進(jìn)程插入就緒隊(duì)列中。</p><p>  附:進(jìn)程調(diào)度算法代碼</p><p>  // process.cpp : Defines the entry point for the console application.</p><p><b>  //</b></p><p>  #include &quo

24、t;stdafx.h"</p><p>  #include "stdio.h"</p><p>  #include "stdlib.h"</p><p>  #include "iostream.h"</p><p>  #define NULL 0</p>

25、<p>  #define false 0</p><p>  #define true 1</p><p>  bool _state=0;</p><p>  struct PCB</p><p><b>  {</b></p><p><b>  int ID;<

26、;/b></p><p>  int priority;</p><p>  int CPUtime;</p><p>  int ALLtime;</p><p>  int State;</p><p>  PCB* next;</p><p><b>  };</b&

27、gt;</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><p>  void in

28、sert();/*生成進(jìn)程屬性信息,插入進(jìn)程就緒隊(duì)列*/</p><p>  void Run_priority(PCB *pcb);/*運(yùn)行進(jìn)程,隨機(jī)阻塞進(jìn)程、產(chǎn)生新進(jìn)程,插入就緒隊(duì)列,喚醒阻塞進(jìn)程*/</p><p>  void block(PCB *pcb);/*調(diào)用destroy()將進(jìn)程插入阻塞隊(duì)列*/</p><p>  void wakeup();/

29、*喚醒進(jìn)程,插入就緒隊(duì)列*/</p><p>  void proc_priority();/*優(yōu)先權(quán)調(diào)度算法模擬*/</p><p>  //void Run_loop(PCB *pcb);</p><p>  void proc_loop();/*輪轉(zhuǎn)法調(diào)度算法模擬*/</p><p>  void update(PCB *pcb);/*

30、更新進(jìn)程信息*/</p><p>  void pushback_queue(PCB *queue,PCB *item);/*將item插入到隊(duì)列的尾部*/</p><p>  void insert_queue(PCB *queue,PCB *item);/*將item插入到隊(duì)列中,使得插入后,隊(duì)列中按照優(yōu)先級從高到低有序*/</p><p>  void sor

31、t_queue(PCB *&queue);/*對queue中的結(jié)點(diǎn)進(jìn)行排序,按照優(yōu)先級從大到小*/</p><p>  PCB *ready_queue,*block_queue,*idleprocess;/*就緒隊(duì)列,阻塞隊(duì)列及閑逛進(jìn)程指針變量*/</p><p>  int main(int argc, char* argv[])</p><p><

32、;b>  {</b></p><p><b>  int i=0;</b></p><p><b>  while(1)</b></p><p><b>  {</b></p><p>  cout<<"\\**********PROCE

33、SS**********/";</p><p>  cout<<("\n Please select a num in(1,2,0) ");</p><p>  cout<<("\n 1--priority ");</p><p>  cout<<("\n 2--loop

34、 ");</p><p>  cout<<("\n 0-- exit\n");</p><p>  cout<<"Please select a num:";</p><p><b>  cin>>i;</b></p><p><

35、b>  while(i)</b></p><p><b>  {</b></p><p><b>  if(i==1)</b></p><p><b>  {</b></p><p>  cout<<("\n This is a exam

36、ple for priority processing: \n ");</p><p><b>  init();</b></p><p>  proc_priority();</p><p><b>  }</b></p><p>  else if (i==2)</p>

37、<p><b>  {</b></p><p>  cout<<("\n This is a example for round robin processing: \n ");</p><p><b>  init();</b></p><p>  proc_loop();<

38、;/p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  cout<<"Please select a num in(1,2,0)\n";</p>

39、<p><b>  }</b></p><p>  cout<<"Please select a num:";</p><p><b>  cin>>i;</b></p><p><b>  }</b></p><p>

40、<b>  return 0;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  ///////輸出所有PCB的初始值</p><p>  void print_init(PCB *pcb)</p><

41、;p><b>  {</b></p><p>  PCB* temp=pcb->next ;</p><p>  cout<<("\nID priority CPUtime ALLtime State");</p><p>  while(temp!=NULL)</p><

42、p><b>  {</b></p><p>  cout<<"\n"<<temp->ID<<" "<<temp->priority<<" "<<temp->CPUtime<<"

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

44、;(" running");</p><p><b>  else</b></p><p>  cout<<(" blocked");</p><p>  temp=temp->next;</p><p><b>  }</b>&

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

46、<b>  temp=pcb;</b></p><p>  if(pcb->ID==0)</p><p>  cout<<("\nThe idle peocess id running!");</p><p><b>  else</b></p><p><

47、;b>  {</b></p><p>  cout<<"\n"<<temp->ID<<" "<<temp->priority<<" "<<temp->CPUtime<<" "

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

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

50、p><p>  ///////將item插入到隊(duì)列中,使得插入后,隊(duì)列中按照優(yōu)先級從高到低有序</p><p>  void insert_queue(PCB *queue,PCB *item)</p><p><b>  {</b></p><p>  PCB *p,*q;</p><p>  q=

51、queue;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->n

52、ext;</p><p><b>  }</b></p><p><b>  if(p==0)</b></p><p><b>  {</b></p><p>  item->next =0;</p><p>  q->next=item;&

53、lt;/p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  item->next =p;</p><p>  q->next =item;</p>

54、;<p><b>  }</b></p><p><b>  }</b></p><p>  ///////將item插入到阻塞隊(duì)列的尾部</p><p>  void pushback_queue(PCB *queue,PCB *item)</p><p><b>  {&

55、lt;/b></p><p>  PCB *p,*q;</p><p>  q=queue,p=q->next;</p><p>  while(p!=0)</p><p><b>  {</b></p><p><b>  q=p;</b></p>

56、<p>  p=p->next;</p><p><b>  }</b></p><p>  item->next =q->next ;</p><p>  q->next =item;</p><p><b>  }</b></p><p&g

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

58、><p>  while(queue->next )</p><p><b>  {</b></p><p><b>  PCB *p;</b></p><p>  p=queue->next;</p><p>  queue->next =p->next

59、 ;</p><p>  insert_queue(temp,p);</p><p><b>  }</b></p><p>  queue->next =temp->next ;</p><p>  delete temp;</p><p><b>  }</b>

60、;</p><p>  ///////生成進(jìn)程屬性信息,插入進(jìn)程就緒隊(duì)列,顯示進(jìn)程信息</p><p>  void insert()</p><p><b>  {</b></p><p>  PCB *newp=0;</p><p>  static long id =0;</p>

61、<p>  newp=new PCB;</p><p><b>  id++;</b></p><p>  newp->ID =id;</p><p>  newp->State=0;</p><p>  newp->CPUtime=0;</p><p>  new

62、p->priority=rand()%3+1;</p><p>  newp->ALLtime=rand()%3+1;</p><p>  newp->next =NULL;</p><p>  pushback_queue(ready_queue,newp);</p><p>  //print(newp);</p&

63、gt;<p>  //cout<<("建立: Creating -> ready\n");</p><p><b>  }</b></p><p>  ////////生成n個(gè)進(jìn)程屬性信息,插入進(jìn)程就緒隊(duì)列,顯示進(jìn)程信息</p><p>  void insert(int n)</p&

64、gt;<p><b>  {</b></p><p>  for(int i=0;i<n;i++)</p><p><b>  insert();</b></p><p><b>  }</b></p><p>  ///////產(chǎn)生idle進(jìn)程,輸入用戶進(jìn)

65、程數(shù)目,調(diào)用insert()</p><p>  void init()</p><p><b>  {</b></p><p>  block_queue=new PCB;</p><p>  block_queue->next=0;</p><p>  ready_queue=new P

66、CB;</p><p>  ready_queue->next=0;</p><p>  int i=0,pcb_number=-1;//閑逛進(jìn)程放入就緒隊(duì)列</p><p>  idleprocess=NULL;</p><p>  idleprocess=(PCB *)malloc(sizeof(PCB));</p>

67、<p>  idleprocess->ID=0;</p><p>  idleprocess->State=0;</p><p>  idleprocess->CPUtime=0;</p><p>  idleprocess->priority=0;</p><p>  idleprocess->ALL

68、time=0;</p><p>  idleprocess->next=NULL;</p><p>  idleprocess->next=ready_queue->next;//閑逛進(jìn)程放入就緒隊(duì)列</p><p>  ready_queue->next=idleprocess;</p><p>  //也可以假定初

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

70、;);</p><p>  cin>>pcb_number;</p><p><b>  }</b></p><p>  cout<<("\nID priority CPUtime ALLtime State\n");</p><p>  for(;i<pcb_n

71、umber;i++)</p><p><b>  insert();</b></p><p>  cout<<"*就緒隊(duì)列初始化成功"<<endl;</p><p>  ::print_init(ready_queue);</p><p>  cout<<endl;

72、</p><p><b>  }</b></p><p>  ///////調(diào)用destroy()將進(jìn)程插入阻塞隊(duì)列</p><p>  void block(PCB *pcb)</p><p><b>  {</b></p><p>  pcb->State=2;&l

73、t;/p><p>  pcb->CPUtime-=2;</p><p>  if(pcb->CPUtime<=0)</p><p><b>  {</b></p><p>  pcb->CPUtime+=2;</p><p><b>  }</b><

74、/p><p>  cout<<"\nThe process no"<<pcb->ID<<" is blocked!";</p><p>  print(pcb);</p><p>  cout<<(" 變遷2:running -> blocked\n&q

75、uot;);</p><p>  pcb->next=block_queue->next;</p><p>  block_queue->next =pcb;</p><p><b>  }</b></p><p>  ///////更新進(jìn)程信息,就緒隊(duì)列中進(jìn)程的優(yōu)先級均增加1</p>&

76、lt;p>  void update(PCB *pcb)</p><p><b>  {</b></p><p>  PCB *temp=pcb->next;</p><p>  while(temp&&temp->next )</p><p><b>  {</b>

77、;</p><p>  temp->priority++;</p><p>  temp=temp->next;</p><p><b>  }</b></p><p><b>  }</b></p><p>  ///////喚醒進(jìn)程,插入就緒隊(duì)列</p&

78、gt;<p>  void wakeup()</p><p><b>  {</b></p><p>  if(block_queue->next==0)/*此時(shí)沒有阻塞的進(jìn)程,無所謂的喚醒*/</p><p><b>  return ;</b></p><p>  PCB *

79、q,*p;</p><p>  while(true)</p><p><b>  {</b></p><p>  q=block_queue;</p><p>  p=q->next;</p><p>  while(p&&rand()%20!=1)</p>

80、<p><b>  {</b></p><p><b>  q=p;</b></p><p>  p=p->next;</p><p><b>  }</b></p><p><b>  if(p!=0)</b></p>&l

81、t;p><b>  {</b></p><p>  q->next =p->next ;</p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  }</b></p>

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

83、>  insert_queue(ready_queue,p);</p><p><b>  }</b></p><p>  ///////運(yùn)行進(jìn)程,隨機(jī)阻塞進(jìn)程、產(chǎn)生新進(jìn)程,插入就緒隊(duì)列,喚醒阻塞進(jìn)程</p><p>  void Run_priority(PCB *pcb)</p><p><b>  

84、{</b></p><p>  if(pcb->ID==0)</p><p><b>  {</b></p><p>  insert_queue(ready_queue,pcb);</p><p>  print(pcb);</p><p>  cout<<&quo

85、t;變遷1: ready -> running\n";</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  pcb->State=1;</p>&l

86、t;p>  pcb->CPUtime+=4;</p><p>  pcb->priority=pcb->priority -3;/*每運(yùn)行一個(gè)時(shí)間片,其優(yōu)先數(shù)減3*/</p><p>  if(pcb->priority <1)</p><p>  pcb->priority=1;</p><p> 

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

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

89、;  cout<<"The process no"<<pcb->ID<<" is completed! 銷毀:running->Destroy"<<endl;</p><p>  delete pcb;</p><p><b>  }</b></p>&l

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

91、p><b>  {</b></p><p>  cout<<'\n';</p><p>  cout<<"The process no "<<pcb->ID<<" if completed! 銷毀:running -> Destrory"<&

92、lt;endl;</p><p>  delete pcb;</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  ::insert_queue(::ready_

93、queue,pcb);</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  update(ready_queue);/*更新就緒隊(duì)列的優(yōu)先級數(shù)*/</p><p> 

94、 if(rand()%5==1)</p><p><b>  {</b></p><p>  insert(3);</p><p>  ::sort_queue(ready_queue);</p><p><b>  }</b></p><p>  if(rand()%7==

95、1)</p><p><b>  wakeup();</b></p><p><b>  }</b></p><p>  ///////運(yùn)行進(jìn)程,隨機(jī)阻塞進(jìn)程、產(chǎn)生新進(jìn)程,插入就緒隊(duì)列,喚醒阻塞進(jìn)程</p><p>  void Run_loop(PCB *pcb)</p><p

96、><b>  {</b></p><p>  if(pcb->ID==0)</p><p><b>  {</b></p><p>  insert_queue(ready_queue,pcb);</p><p>  print(pcb);</p><p>  c

97、out<<"變遷1: ready -> running\n";</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  pcb->State=1

98、;</p><p>  pcb->CPUtime=pcb->ALLtime;</p><p>  print(pcb);</p><p>  printf("變遷1: ready -> running\n");</p><p>  if(rand()%3==1)/*PCB不是閑逛進(jìn)程,滿足條件側(cè)阻

99、塞此進(jìn)程*/</p><p><b>  {</b></p><p><b>  _state=1;</b></p><p>  block(pcb);</p><p><b>  }</b></p><p><b>  else</b&

100、gt;</p><p><b>  {</b></p><p>  cout<<'\n';</p><p>  cout<<"The process no "<<pcb->ID<<" if completed! 銷毀:running ->

101、Destrory"<<endl;</p><p>  delete pcb;</p><p><b>  }</b></p><p><b>  }</b></p><p>  if(rand()%5==1)</p><p><b>  {

102、</b></p><p>  insert(3);</p><p><b>  }</b></p><p>  if(rand()%7==1)</p><p><b>  wakeup();</b></p><p><b>  }</b>&l

103、t;/p><p>  ///////優(yōu)先權(quán)調(diào)度算法模擬</p><p>  void proc_priority()</p><p><b>  {</b></p><p>  sort_queue(ready_queue);</p><p>  PCB *temp=0,*running=0;<

104、/p><p>  int times=0;</p><p>  cout<<"*調(diào)度前:";</p><p>  ::print_init(ready_queue);</p><p>  for(;times<5;times++)</p><p><b>  {</

105、b></p><p>  running=ready_queue->next;</p><p>  ready_queue->next =running->next ;</p><p>  cout<<endl;</p><p>  cout<<"*調(diào)度開始"<<

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

107、<p>  ///////輪轉(zhuǎn)調(diào)度算法模擬</p><p>  void proc_loop()</p><p><b>  {</b></p><p>  PCB *temp=0,*running=0;</p><p>  int times=10;</p><p>  cout&

108、lt;<"*調(diào)度前:";</p><p>  ::print_init(ready_queue);</p><p><b>  while(1)</b></p><p><b>  {</b></p><p>  running=ready_queue->nex

109、t;</p><p>  ready_queue->next =running->next ;</p><p>  cout<<endl;</p><p>  if(times>0)</p><p><b>  {</b></p><p>  times=times-

110、running->ALLtime;//每次運(yùn)行一個(gè)進(jìn)程減去ALLtime;</p><p>  if(times>=0)</p><p><b>  {</b></p><p>  Run_loop(running);</p><p><b>  }</b></p><

111、;p>  else if(_state)//如果運(yùn)行時(shí)被阻塞,則運(yùn)行2個(gè)時(shí)間單位</p><p><b>  {</b></p><p>  times=times+2;</p><p><b>  _state=0;</b></p><p>  cout<<"5

112、487584574389574 fgfgfgfgf gfgfg38954378954375894378954375";</p><p><b>  }</b></p><p><b>  else</b></p><p>  pushback_queue(block_queue,running);//時(shí)間不過,則

113、阻塞該進(jìn)程,放到阻塞隊(duì)列</p><p><b>  }</b></p><p>  else if(times<=0)</p><p><b>  {</b></p><p>  cout<<"\n*本次調(diào)度時(shí)間片到!";</p><

114、;p><b>  break;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  cout<<"\n*本次調(diào)度結(jié)束。"<<endl;</p><p><b&g

115、t;  }</b></p><p><b>  Linux進(jìn)程管理</b></p><p><b>  一、實(shí)驗(yàn)?zāi)康?lt;/b></p><p>  進(jìn)程描述符即為進(jìn)程控制塊。Linux的進(jìn)程控制塊由task_struct結(jié)果表示,其結(jié)構(gòu)在sched.h里定義。主要進(jìn)城標(biāo)識、調(diào)度相關(guān)信息、進(jìn)程虛擬空間信息、文件相關(guān)

116、信息、信號處理信息、記賬信息及統(tǒng)計(jì)信息、描述進(jìn)程間關(guān)系的指針等。</p><p>  加深對進(jìn)程概念的理解,明確進(jìn)程和程序的區(qū)別,進(jìn)一步認(rèn)識并發(fā)的實(shí)質(zhì),通過分析進(jìn)程爭用資源的現(xiàn)象,學(xué)習(xí)解決進(jìn)程互斥的方法,了解Linux系統(tǒng)中進(jìn)程通信的基本原理。</p><p><b>  二、實(shí)驗(yàn)內(nèi)容</b></p><p>  閱讀Linux的sched.h

117、源碼文件,加深對進(jìn)程管理概念的理解。閱讀Linux的fork.c源碼文件,分析進(jìn)程的創(chuàng)建過程。</p><p>  學(xué)習(xí)Linux系統(tǒng)進(jìn)行C程序的編譯調(diào)式方法。GCC是GNU project Cand C++compiler宿寫,是C/C++語言的編譯器。因其后來可以多種語言的開發(fā),現(xiàn)在改變?yōu)镚NC Compiler Collection。使用gcc hello.c-o hello可以生成執(zhí)行的文件hello。&

118、lt;/p><p>  Linux的進(jìn)程狀態(tài)有五種:</p><p>  TASK_RUNNING(運(yùn)行):無論進(jìn)程是否正在占用CPU,只要具備運(yùn)行條件,都處于該狀態(tài)。Linux把處于該狀態(tài)的所有PCB組織成一個(gè)可運(yùn)行隊(duì)列run_queue,調(diào)度程序從這個(gè)隊(duì)列只中選擇進(jìn)程運(yùn)行。</p><p>  TASK_INTERRUPTIBLE(可中斷阻塞):Linux將阻塞態(tài)劃

119、分成TASK_UNINTERRUPTIBLE、TASK_STOPPED、TASK_ZOMBILE三種不同的狀態(tài): TASK_UNINTERRUPTIBLE(不可中斷喚醒):處于該狀態(tài)的進(jìn)程只有當(dāng)資源有效時(shí)被喚醒,不能通過信號或定時(shí)中斷喚醒;TASK_STOPPED(暫停):處于該狀態(tài)的進(jìn)程只能通過其他進(jìn)程的信號才能喚醒;TASK_ZOMBILE(僵死):進(jìn)程已結(jié)束但尚未消亡,已經(jīng)釋放了大部分資源,PCB仍未被釋放。處于TASK_UNIN

120、TERRUPTIBLE狀態(tài)的進(jìn)程資源有效時(shí)被喚醒,也可以通過信號或定時(shí)中斷喚醒。</p><p><b>  三、實(shí)驗(yàn)步驟</b></p><p><b>  1、進(jìn)程的創(chuàng)建</b></p><p>  編寫一段程序,使用系統(tǒng)調(diào)用fork()創(chuàng)建兩個(gè)進(jìn)程。當(dāng)此程序運(yùn)行時(shí),在系統(tǒng)中有一個(gè)父進(jìn)程和兩個(gè)子進(jìn)程活動。讓每個(gè)進(jìn)程在屏

121、幕上顯示一個(gè)字符:父進(jìn)程顯示字符“A”,子進(jìn)程分別顯示字符“B”和字符“C”。</p><p>  #include<stdio.h></p><p>  void main()</p><p><b>  {</b></p><p>  int p1,p2;</p><p>  wh

122、ile(p1=fork()==-1);//創(chuàng)建子進(jìn)程</p><p><b>  if(p1==0)</b></p><p>  putchar('b');</p><p><b>  else</b></p><p><b>  {</b></p>

123、<p>  while((p2==fork())==-1);//創(chuàng)建子進(jìn)程</p><p><b>  if(p2==0)</b></p><p>  putchar('c');</p><p><b>  else</b></p><p>  putchar('

124、;a');//父進(jìn)程</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  2、進(jìn)程的控制</b></p><p>  #include<stdio.h></p><p>  vo

125、id main()</p><p><b>  {</b></p><p>  int p1,p2;</p><p>  while(p1=fork()==-1);//創(chuàng)建子進(jìn)程</p><p><b>  if(p1==0)</b></p><p>  for(int i;

126、i<10;i++)</p><p>  printf("daugheter%d\n",i);</p><p><b>  else</b></p><p><b>  {</b></p><p>  while((p2==fork())==-1);//創(chuàng)建子進(jìn)程</p

127、><p><b>  if(p2==0)</b></p><p>  for(int i;i<10;i++)</p><p>  printf("son%d\n",i);</p><p><b>  else</b></p><p>  for(int

128、i;i<10;i++)</p><p>  printf("parent%d\n",i);</p><p><b>  }</b></p><p><b>  }</b></p><p>  #include<stdio.h></p><p&

129、gt;  #include<unistd.h></p><p>  #include<sys/wait.h></p><p>  #include<sys/stat.h></p><p>  #include<sys/types.h></p><p>  #include<fcntl.h&

130、gt;</p><p>  void main()</p><p><b>  {</b></p><p>  int fd,spid,ppid;</p><p>  char str[80];</p><p>  fd=open("myfile",O_RDWR|O_CREAT

131、,0644);</p><p>  if((cpid=fork())==-1)</p><p><b>  {</b></p><p>  lseek(fd,0,0);</p><p><b>  exit(1);</b></p><p><b>  }</b

132、></p><p>  else if(cpid>0)</p><p><b>  {</b></p><p>  lseek(fd,0,0);</p><p>  if(lockf(fd,0,0)==-1)</p><p><b>  {</b></p&g

133、t;<p>  perror("lock failure");</p><p><b>  exit(1);</b></p><p><b>  }</b></p><p>  printf("I am a parent process,my pid is %d\n",

134、getid());</p><p>  printf("Please input a string:\n");</p><p>  scanf("%s",str);</p><p>  lseek(fd,0,0);</p><p>  write(fd,str,sizeof(str));</p&g

135、t;<p>  lseek(fd,0,0);</p><p>  if(lockf(fd,0,0)==-1)</p><p><b>  {</b></p><p>  perror("unlock failure");</p><p><b>  exit(1);</b

136、></p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p><b>  sleep(1);</b></p><p>  lseek(fd,0

137、,0);</p><p>  if(lockf(fd,0,0)==-1)</p><p><b>  {</b></p><p>  perror("lock failure");</p><p><b>  exit(1);</b></p><p>&l

138、t;b>  }</b></p><p>  lseek(fd,0,0);</p><p>  read(fd,str,sizeof(str));</p><p>  lseek(fd,0,0);</p><p>  if(lockf(fd,0,0)==-1)</p><p><b>  {&

139、lt;/b></p><p>  perror("unlock failure");</p><p><b>  exit(1);</b></p><p><b>  }</b></p><p>  printf("\nI am a parent process,

140、my pid is %d\n",getid());</p><p>  printf("Please input a string:\n");</p><p>  printf("%s\n",str);</p><p><b>  }</b></p><p><b&

141、gt;  }</b></p><p><b>  }</b></p><p><b>  3、軟中斷通信</b></p><p>  編制一段程序,使其實(shí)現(xiàn)進(jìn)程的軟中斷通信。</p><p>  使用系統(tǒng)調(diào)度fork()創(chuàng)建兩個(gè)子進(jìn)程,再用系統(tǒng)調(diào)用signal()讓父進(jìn)程捕捉鍵盤上來的中

142、斷信號(即按Del鍵);當(dāng)捕捉到中斷信號后,父進(jìn)程用系統(tǒng)調(diào)用kill()向兩個(gè)子進(jìn)程發(fā)出信號,子進(jìn)程捕捉到信號后分別輸出下列信息后中止。</p><p>  Child Process 1 is killed by Parent!</p><p>  Child Process 2 is killed by Parent!</p><p>  #include<

143、;stdio.h></p><p>  #include<signal.h></p><p>  #include<unistd.h></p><p>  void stop();</p><p>  int wait_mark;</p><p>  void main()</p&g

144、t;<p><b>  {</b></p><p>  int p1,p2,stdout;</p><p>  while(p1=fork()==-1);</p><p><b>  if(p1>0)</b></p><p><b>  {</b></

145、p><p>  while((p2==fork())==-1);</p><p><b>  if(p2>0)</b></p><p><b>  {</b></p><p>  wait_mark=1;</p><p>  printf("Input any c

146、har to stop:");</p><p>  getchar();</p><p>  kill(p1,16);</p><p>  kill(p2,17);</p><p><b>  wait(0);</b></p><p><b>  wait(0);</b&

147、gt;</p><p>  printf("Parent process is killed!\n");</p><p><b>  exit(0);</b></p><p><b>  }</b></p><p><b>  else</b></p&

148、gt;<p><b>  {</b></p><p>  wait_mark=1;</p><p>  signal(17,stop);</p><p>  while(wait_mark!=0)</p><p><b>  {</b></p><p>  lo

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論