[優(yōu)秀畢業(yè)設(shè)計(jì)精品] 進(jìn)程模擬調(diào)度程序_第1頁(yè)
已閱讀1頁(yè),還剩35頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、<p><b>  數(shù)學(xué)與計(jì)算機(jī)學(xué)院</b></p><p><b>  課程設(shè)計(jì)說(shuō)明書</b></p><p>  課 程 名 稱: 操作系統(tǒng)原理-課程設(shè)計(jì) </p><p>  課 程 代 碼: </p><p>  題 目:

2、進(jìn)程調(diào)度模擬程序 </p><p>  年級(jí)/專業(yè)/班: 09級(jí) 計(jì)科 5班 </p><p>  學(xué) 生 姓 名: </p><p>  學(xué)   號(hào): </p><p>  開 始 時(shí) 間: 2011 年 12 月 9 日<

3、;/p><p>  完 成 時(shí) 間: 2011 年 12 月 23 日</p><p><b>  課程設(shè)計(jì)成績(jī):</b></p><p>  指導(dǎo)教師簽名: 年 月 日</p><p><b>  摘 要</b></p><p&

4、gt;  隨著計(jì)算機(jī)的普及,在計(jì)算機(jī)上配置合適的操作系統(tǒng),已成為不可或缺的因素,操作系統(tǒng)時(shí)配置在計(jì)算機(jī)硬件上的第一層軟件,時(shí)對(duì)硬件系統(tǒng)的首次擴(kuò)充,其他的諸如匯編程序,編譯程序,數(shù)據(jù)庫(kù)管理系統(tǒng)等系統(tǒng)軟件,以及大量的應(yīng)用軟件,都將依賴于操作系統(tǒng)的支持,取得它的服務(wù)。OS作為用戶與計(jì)算機(jī)硬件之間的接口,作為系統(tǒng)資源的管理者,實(shí)現(xiàn)了對(duì)計(jì)算機(jī)資源的抽象,因此,不斷提高計(jì)算機(jī)資源的利用率,方便用戶,以及器件的不斷更新?lián)Q代,計(jì)算機(jī)體系結(jié)構(gòu)的不斷發(fā)展,

5、已經(jīng)成為推動(dòng)計(jì)算機(jī)操作系統(tǒng)發(fā)展的主要因素,為了達(dá)到這些目的,了解操作系統(tǒng)的發(fā)展過(guò)程,熟悉操作系統(tǒng)的內(nèi)部結(jié)構(gòu),掌握操作系統(tǒng)的運(yùn)行,已經(jīng)成為當(dāng)代大學(xué)生,特別是計(jì)算機(jī)專業(yè)的學(xué)生所必不可少的知識(shí)。</p><p>  操作系統(tǒng)的主要任務(wù)是為多道程序的運(yùn)行提供良好的運(yùn)行環(huán)境,并能最大程度的提高系統(tǒng)中各種資源的利用率和方便用戶,為了實(shí)現(xiàn)這些功能,操作系統(tǒng)還應(yīng)該具有處理機(jī)管理,存儲(chǔ)器管理,設(shè)備管理和文件管理等功能。</p

6、><p>  關(guān)鍵詞:操作系統(tǒng);資源利用率;處理機(jī);文件管理</p><p><b>  目 錄 </b></p><p><b>  1 引 言1</b></p><p>  1.1 問(wèn)題的提出1</p><p>  1.2任務(wù)與分析1</p><

7、;p>  2 程序的主要函數(shù)2</p><p>  2.1建立將要模擬進(jìn)程調(diào)度的所有進(jìn)程PCB鏈表2</p><p>  2.2模擬CPU運(yùn)行進(jìn)程3</p><p><b>  2.3顯示4</b></p><p><b>  2.4排序5</b></p><p&

8、gt;  2.5建立先來(lái)先服務(wù)調(diào)度算法的就緒隊(duì)列7</p><p>  2.6建立最高優(yōu)先數(shù)優(yōu)先調(diào)度算法的就緒隊(duì)列8</p><p>  2.7進(jìn)程模擬調(diào)度9</p><p><b>  2.8主函數(shù)12</b></p><p>  3 程序運(yùn)行平臺(tái)14</p><p><b>

9、;  4 總體設(shè)計(jì)14</b></p><p>  5 程序結(jié)構(gòu)體的說(shuō)明14</p><p>  6 程序運(yùn)行結(jié)果15</p><p><b>  7 結(jié)論22</b></p><p><b>  8 參考文獻(xiàn)23</b></p><p><b&g

10、t;  9 附錄24</b></p><p><b>  1 引 言 </b></p><p><b>  1.1 問(wèn)題的提出</b></p><p>  隨著現(xiàn)在操作系統(tǒng)的日趨成熟,用戶對(duì)計(jì)算機(jī)的需求越來(lái)越多,處理機(jī)在同一時(shí)刻處理資源的能力是有限的,從而導(dǎo)致各種任務(wù)隨時(shí)隨地的爭(zhēng)奪使用處理機(jī),因而此對(duì)程序的

11、并發(fā)能力提出了更高的要求。</p><p>  引進(jìn)并發(fā)技術(shù)后,為了更好地說(shuō)明并發(fā)現(xiàn)象(尤其是動(dòng)態(tài)進(jìn)程),引入了進(jìn)程的概念。進(jìn)程是一個(gè)具有一定獨(dú)立功能的可并發(fā)執(zhí)行的關(guān)于某個(gè)數(shù)據(jù)集合一次運(yùn)行活動(dòng)的程序。一個(gè)程序的啟動(dòng)執(zhí)行,便是一個(gè)進(jìn)程的建立;一個(gè)程序執(zhí)行結(jié)束(正?;蛘呤遣徽#?,便是一個(gè)進(jìn)程的撤銷。由于同時(shí)處于就緒態(tài)(爭(zhēng)奪使用CPU資源)的進(jìn)程通常比較多,因此需要CPU調(diào)度算法來(lái)決定由哪個(gè)進(jìn)程獲得CPU使用權(quán)進(jìn)入運(yùn)

12、行狀態(tài),即進(jìn)程調(diào)度算法。</p><p><b>  1.2任務(wù)與分析</b></p><p>  本課題主要的目的是編寫并調(diào)試一個(gè)有N個(gè)進(jìn)程并發(fā)的進(jìn)程模擬調(diào)度程序。</p><p>  進(jìn)程調(diào)度算法:采用最高優(yōu)先數(shù)優(yōu)先的調(diào)度算法(即把處理機(jī)分配給優(yōu)先數(shù)最高的進(jìn)程)和先來(lái)先服務(wù)算法。</p><p>  每個(gè)進(jìn)程有一個(gè)進(jìn)

13、程控制塊( PCB)表示。進(jìn)程控制塊可以包含如下信息:進(jìn)程名、優(yōu)先數(shù)、到達(dá)時(shí)間、需要運(yùn)行時(shí)間、已用CPU時(shí)間、進(jìn)程狀態(tài)等等。 </p><p>  進(jìn)程的優(yōu)先數(shù)及需要的運(yùn)行時(shí)間可以事先人為地指定(也可以由隨機(jī)數(shù)產(chǎn)生)。進(jìn)程的到達(dá)時(shí)間為進(jìn)程輸入的時(shí)間。 </p><p>  進(jìn)程的運(yùn)行時(shí)間以時(shí)間片為單位進(jìn)行計(jì)算。</p><p>  等待I/O的時(shí)間以時(shí)間片為單位進(jìn)行

14、計(jì)算,可隨機(jī)產(chǎn)生,也可事先指定。</p><p>  每個(gè)進(jìn)程的狀態(tài)可以是就緒 R(Ready)、運(yùn)行R(Run)、等待(Wait)或完成F(Finish)四種狀態(tài)之一。 </p><p>  就緒進(jìn)程獲得 CPU后都只能運(yùn)行一個(gè)時(shí)間片。用已占用CPU時(shí)間加1來(lái)表示。 </p><p>  如果運(yùn)行一個(gè)時(shí)間片后,進(jìn)程的已占用 CPU時(shí)間已達(dá)到所需要的運(yùn)行時(shí)間,則撤消

15、該進(jìn)程,如果運(yùn)行一個(gè)時(shí)間片后進(jìn)程的已占用CPU時(shí)間還未達(dá)所需要的運(yùn)行時(shí)間,也就是進(jìn)程還需要繼續(xù)運(yùn)行,此時(shí)應(yīng)將進(jìn)程的優(yōu)先數(shù)減1(即降低一級(jí)),然后把它插入就緒隊(duì)列等待CPU。 </p><p>  每進(jìn)行一次調(diào)度程序都打印一次運(yùn)行進(jìn)程、就緒隊(duì)列、等待進(jìn)程以及各個(gè)進(jìn)程的 PCB,以便進(jìn)行檢查。</p><p>  重復(fù)以上過(guò)程,直到所要進(jìn)程都完成為止。</p><p>

16、<b>  2 程序的主要函數(shù)</b></p><p>  2.1建立將要模擬進(jìn)程調(diào)度的所有進(jìn)程PCB鏈表</p><p>  算法思想:要建立的進(jìn)程個(gè)數(shù)n作為函數(shù)參數(shù),頭指針作為返回,在函數(shù)內(nèi)部由一重循環(huán)建立每個(gè)進(jìn)程PCB的各個(gè)數(shù)據(jù)項(xiàng),其中進(jìn)程需要運(yùn)行時(shí)間、到達(dá)時(shí)間以及優(yōu)先數(shù)全部采用隨機(jī)生成。</p><p><b>  代碼:&l

17、t;/b></p><p>  plist *creatpro(int n) //建立所有將要進(jìn)行N個(gè)模擬調(diào)度的進(jìn)程</p><p><b>  {</b></p><p><b>  int j;</b></p><p>  plist *p, *q, *head;</p>&

18、lt;p>  p= (plist *) malloc(sizeof(plist));</p><p><b>  head = p;</b></p><p>  for(j=0;j<n;j++){</p><p><b>  q=p;</b></p><p>  p->name =

19、 j+1;</p><p>  p->needtime = 1+(int)(10.0*rand()/(RAND_MAX+1.0));</p><p>  p->arrivetime = (int)(10.0*rand()/(RAND_MAX+1.0));</p><p>  p->pri = 1+(int)(9.0*rand()/(RAND_MAX

20、+1.0));</p><p>  p->state = 0;</p><p>  p->cputime =0;</p><p>  p->next = (plist *) malloc(sizeof(plist));</p><p>  p=p->next;</p><p><b>

21、  }</b></p><p>  q->next = NULL;</p><p>  return head;</p><p><b>  }</b></p><p><b>  流程圖:</b></p><p>  2.2模擬CPU運(yùn)行進(jìn)程</p&

22、gt;<p>  算法思想:需要運(yùn)行進(jìn)程的PCB作為函數(shù)參數(shù),先修改進(jìn)程狀態(tài),然后修改再修改進(jìn)程已運(yùn)行時(shí)間和還需運(yùn)行時(shí)間。</p><p><b>  代碼:</b></p><p>  void action(plist * nowpro)</p><p>  //模擬CUP運(yùn)行進(jìn)程的過(guò)程</p><p>

23、;<b>  {</b></p><p>  nowpro->state = 2; //設(shè)置進(jìn)程狀態(tài)為運(yùn)行態(tài)</p><p>  printf("now is process %d ",nowpro->name);</p><p>  nowpro->needtime--; //修改進(jìn)程還需

24、運(yùn)行時(shí)間</p><p>  nowpro->cputime++; //修改進(jìn)程已運(yùn)行時(shí)間</p><p>  nowpro->state = 1;</p><p>  if(nowpro->needtime==0)//進(jìn)程運(yùn)行結(jié)束</p><p><b>  {</b></p>&

25、lt;p>  printf("\tthe process %d is end\n",nowpro->name); </p><p>  nowpro->state = 4; //進(jìn)程運(yùn)行結(jié)束,設(shè)置進(jìn)程狀態(tài)為結(jié)束態(tài)</p><p><b>  }</b></p><p><b>  else<

26、/b></p><p><b>  {</b></p><p>  printf("\tprocess %d needtime is %d\n",nowpro->name,nowpro->needtime);</p><p><b>  }</b></p><p&

27、gt;  printf("-----------------------------\n");</p><p><b>  }</b></p><p><b>  流程圖:</b></p><p><b>  2.3 顯示</b></p><p>  算法思

28、想:先判斷鏈表借點(diǎn)是否為空,然后利用循環(huán)輸出各PCB信息</p><p><b>  代碼:</b></p><p>  void show(plist * process) </p><p><b>  //顯示</b></p><p><b>  {</b></p&g

29、t;<p>  if(!process)</p><p><b>  {</b></p><p>  printf("there is no process now\n");</p><p><b>  }</b></p><p>  while(process&a

30、mp;&process->state!=4)</p><p><b>  {</b></p><p>  printf("name of process %d",process->name);</p><p>  printf("\tneedtime %d",process->n

31、eedtime);</p><p>  printf(" arrivetime %d",process->arrivetime);</p><p>  printf(" pri %d",process->pri);</p><p>  printf(" state %d",proce

32、ss->state);</p><p>  printf(" cputime %d\n",process->cputime);</p><p>  process = process->next;</p><p><b>  }</b></p><p><b>  }&

33、lt;/b></p><p><b>  流程圖:</b></p><p><b>  2.4排序</b></p><p>  算法思想:利用兩層循環(huán),比較相鄰兩個(gè)元素的大小,第一遍將最大的數(shù)排到最末,第二遍將次大的數(shù)排到最末的數(shù)的前面,經(jīng)N-1遍后將滿足排序的要求。</p><p><

34、b>  代碼:</b></p><p>  plist *sort(plist *head) </p><p>  //將進(jìn)程隊(duì)列按到達(dá)先后順序排序</p><p><b>  {</b></p><p>  plist *p,*p1,*p2,*p3,*temp;</p><p&g

35、t;<b>  p=head;</b></p><p>  while(p->next!=NULL) {</p><p>  p=p->next;</p><p><b>  }</b></p><p>  while(p!=head){</p><p>  p3

36、=p1=head;</p><p>  p2=p1->next;</p><p>  while(p1!=p && p1->next!=NULL){</p><p>  if((p1->arrivetime)>(p2->arrivetime)){</p><p>  if(p1==head){&l

37、t;/p><p><b>  head=p2;</b></p><p><b>  }</b></p><p><b>  else{</b></p><p>  p3->next=p2;</p><p><b>  }</b>&

38、lt;/p><p>  temp=p2->next;</p><p>  p2->next=p1;</p><p>  p1->next=temp;</p><p><b>  temp=p1;</b></p><p><b>  p1=p2;</b></

39、p><p><b>  p2=temp;</b></p><p><b>  }</b></p><p><b>  p3=p1;</b></p><p>  p1=p1->next;</p><p>  p2=p1->next;</p&g

40、t;<p><b>  }</b></p><p><b>  p=p3;</b></p><p><b>  }</b></p><p>  return head;</p><p><b>  }</b></p><p

41、>  2.5建立先來(lái)先服務(wù)調(diào)度算法的就緒隊(duì)列</p><p>  算法思想:先來(lái)先服務(wù)調(diào)度算法中的就緒隊(duì)列是按到達(dá)時(shí)間的先后排序的,當(dāng)就緒隊(duì)列為空時(shí),直接將作為將要添加的進(jìn)程PCB temp作為隊(duì)頭,如果就緒隊(duì)列不為空,則將temp添加到隊(duì)列末尾。</p><p>  添加到就緒隊(duì)列后再修改進(jìn)程狀態(tài)為就緒態(tài)。</p><p><b>  代碼:<

42、;/b></p><p>  plist *fcfs_creatready(plist *ready_queue,plist *temp) </p><p>  //將進(jìn)程temp添加到就緒隊(duì)列ready_queue的尾部</p><p><b>  {</b></p><p><b>  plist *

43、q;</b></p><p>  q=ready_queue;</p><p>  if(ready_queue) { //當(dāng)就緒隊(duì)列不為空時(shí),新進(jìn)入的進(jìn)程添加到就緒隊(duì)列末尾</p><p>  while(q->next){</p><p>  q=q->next;</p><p>  }

44、 //使指針P指向就緒隊(duì)列中最后一個(gè)進(jìn)程</p><p>  q->next=temp;</p><p>  temp->state=1;//修改進(jìn)程狀態(tài)</p><p>  temp->next=NULL;</p><p><b>  }</b></p><p>  else

45、{ //當(dāng)就緒隊(duì)列為空時(shí),新進(jìn)入的進(jìn)程作為就緒隊(duì)列頭部</p><p>  ready_queue=temp;</p><p>  ready_queue->state = 1; //將進(jìn)程狀態(tài)設(shè)為就緒狀態(tài)</p><p>  temp->next=NULL;</p><p><b>  }</b><

46、;/p><p>  return ready_queue;</p><p><b>  }</b></p><p><b>  流程圖:</b></p><p>  2.6建立最高優(yōu)先數(shù)優(yōu)先調(diào)度算法的就緒隊(duì)列</p><p>  算法思想:最高優(yōu)先數(shù)優(yōu)先調(diào)度算法中的就緒隊(duì)列是按進(jìn)

47、程優(yōu)先數(shù)遞減排序的,當(dāng)就緒隊(duì)列為空時(shí),直接將作為將要添加的進(jìn)程PCB temp作為隊(duì)頭,如果就緒隊(duì)列不為空,則將temp添加到隊(duì)列合適位置。然后再修改進(jìn)程狀態(tài)為就緒態(tài)。</p><p><b>  代碼:</b></p><p>  plist *hrrn_creatready(plist *ready_queue, plist *temp)</p>&

48、lt;p>  //按優(yōu)先數(shù)遞減的順序?qū)⑦M(jìn)程temp添加到就緒隊(duì)列ready_queue的合適位置</p><p><b>  {</b></p><p>  plist *q, *p;</p><p>  p=q=ready_queue;</p><p>  if(ready_queue && re

49、ady_queue->pri>temp->pri) { </p><p>  //按優(yōu)先數(shù)遞減的順序?qū)⑦M(jìn)程temp添加到就緒隊(duì)列ready_queue的合適位置</p><p>  while(q&&q->pri>=temp->pri){</p><p><b>  p=q;</b></

50、p><p>  q=q->next;</p><p>  } //使指針P->next指向就緒隊(duì)列中進(jìn)程temp的插入位置</p><p>  p->next=temp;</p><p>  temp->next=q;</p><p>  temp->state=1;//修改進(jìn)程狀態(tài)&l

51、t;/p><p><b>  }</b></p><p>  else{ //當(dāng)就緒隊(duì)列為空時(shí),新進(jìn)入的進(jìn)程作為就緒隊(duì)列頭部</p><p>  temp->next=ready_queue;</p><p>  ready_queue=temp;</p><p>  ready_q

52、ueue->state = 1; //將進(jìn)程狀態(tài)設(shè)為就緒狀態(tài)</p><p><b>  }</b></p><p>  return ready_queue;</p><p><b>  }</b></p><p><b>  流程圖:</b></p>&

53、lt;p><b>  2.7進(jìn)程模擬調(diào)度</b></p><p><b>  算法思想:</b></p><p>  1.先來(lái)先服務(wù)調(diào)度算法</p><p>  先來(lái)先服務(wù)調(diào)度算法是一種最簡(jiǎn)單的調(diào)度算法,該算法既可以用于作業(yè)調(diào)度,也可用于進(jìn)程調(diào)度。當(dāng)在作業(yè)調(diào)度中采用該算法時(shí),每次調(diào)度都是從后備作業(yè)隊(duì)列中選擇一個(gè)或多個(gè)

54、最先進(jìn)入該隊(duì)列的作業(yè),將他們調(diào)入內(nèi)存,為它們分配資源、創(chuàng)建進(jìn)程,然后放入就緒隊(duì)列。在進(jìn)程調(diào)度中采用FCFS算法時(shí),則每次調(diào)度是從就緒隊(duì)列中選擇一個(gè)最先進(jìn)入該隊(duì)列的進(jìn)程,為之分配處理機(jī),使之投入運(yùn)行。該進(jìn)程一直運(yùn)行到完成或發(fā)生某事件而阻塞后才放棄處理機(jī)。FCFS算法比較有利于長(zhǎng)作業(yè)(進(jìn)程),而不利于短作業(yè)(進(jìn)程)。</p><p>  2.最高優(yōu)先數(shù)調(diào)度算法</p><p>  優(yōu)先數(shù)調(diào)度算

55、法常用于批處理系統(tǒng)中。在進(jìn)程調(diào)度中,每次調(diào)度時(shí),系統(tǒng)把處理機(jī)分配給就緒隊(duì)列中優(yōu)先數(shù)最高的進(jìn)程。它又分為兩種:非搶占式優(yōu)先數(shù)算法和搶占式優(yōu)先數(shù)算法。在非搶占式優(yōu)先數(shù)算法下,系統(tǒng)一旦把處理機(jī)分配給就緒隊(duì)列中優(yōu)先數(shù)最高的進(jìn)程后,這個(gè)進(jìn)程就會(huì)一直運(yùn)行,直到完成或發(fā)生某事件使它放棄處理機(jī),這時(shí)系統(tǒng)才能重新將處理機(jī)分配給就緒隊(duì)列中的另一個(gè)優(yōu)先數(shù)最高的進(jìn)程。在搶占式優(yōu)先數(shù)算法下,系統(tǒng)先將處理機(jī)分配給就緒隊(duì)列中優(yōu)先數(shù)最高的進(jìn)程度讓它運(yùn)行,但在運(yùn)行的過(guò)程

56、中,如果出現(xiàn)另一個(gè)優(yōu)先數(shù)比它高的進(jìn)程,它就要立即停止,并將處理機(jī)分配給新的高優(yōu)先數(shù)進(jìn)程。</p><p>  本次模擬采用搶占式最高優(yōu)先數(shù)調(diào)度算法。</p><p>  如果調(diào)用此函數(shù)時(shí)是process_simulation(process,fcfs_creatready);則此時(shí)是先來(lái)先服務(wù)算法模擬調(diào)度。</p><p>  如果調(diào)用此函數(shù)時(shí)是 process_s

57、imulation(process,hrrn_creatready);則此時(shí)是最高優(yōu)先數(shù)優(yōu)先算法模擬調(diào)度。</p><p><b>  代碼:</b></p><p>  void process_simulation(plist * process,plist *creatready(plist *,plist *))</p><p><

58、;b>  {</b></p><p>  int time; //模擬CPU時(shí)鐘</p><p>  plist *temp;</p><p>  plist *ready_queue=NULL; //定義就緒隊(duì)列,并初始化</p><p>  time = 0; //初始化CPU時(shí)序</p><

59、p>  while(process||ready_queue) //當(dāng)進(jìn)程隊(duì)列不為空,或者就緒隊(duì)列不為空</p><p><b>  {</b></p><p>  while(process && time == process->arrivetime) {//進(jìn)程到達(dá)時(shí)進(jìn)入就緒隊(duì)列</p><p>  temp

60、= process;</p><p>  process = process->next;</p><p>  ready_queue=creatready(ready_queue, temp);</p><p><b>  }</b></p><p>  if(ready_queue == NULL) {//如

61、果沒(méi)有進(jìn)程運(yùn)行,打印CPU空轉(zhuǎn)信息</p><p>  printf("The time sequence is :%d\n",time);</p><p>  printf("The ready queue is :\n");</p><p>  printf("there is no process now\n&

62、quot;);</p><p>  printf("-----------------------------\n");</p><p><b>  time++;</b></p><p>  Sleep(500);</p><p><b>  }</b></p>

63、<p>  else{//如果有進(jìn)程需要運(yùn)行,則模擬進(jìn)程運(yùn)行過(guò)程</p><p>  printf("The time sequence is :%d\n",time);</p><p>  printf("The ready queue is :\n");</p><p>  show(ready_queue-&

64、gt;next);//打印就緒隊(duì)列</p><p>  action(ready_queue); //模擬進(jìn)程運(yùn)行</p><p>  if(ready_queue ->needtime == 0) {//進(jìn)程運(yùn)行結(jié)束,此時(shí)將此進(jìn)程從就緒隊(duì)列中刪除</p><p>  ready_queue=ready_queue->next;</p>&

65、lt;p><b>  }</b></p><p><b>  time++;</b></p><p>  Sleep(1000);</p><p><b>  }</b></p><p><b>  }</b></p><p>

66、;  printf("The time sequence is :%d\n",time); //先來(lái)先服務(wù)模擬調(diào)度結(jié)束</p><p>  printf("there is no process now\n");</p><p>  printf("-----------------------------\n");</p&

67、gt;<p><b>  }</b></p><p><b>  流程圖:</b></p><p><b>  2.8主函數(shù)</b></p><p>  算法思想:先建立所有需要模擬調(diào)度的PCB鏈表,然后采用冒泡法將鏈表按進(jìn)程到達(dá)時(shí)間遞增的順序排序,然后采用switch--case 選擇

68、結(jié)構(gòu)進(jìn)行菜單選擇需要模擬的調(diào)度模擬。</p><p><b>  代碼:</b></p><p>  void main()</p><p><b>  {</b></p><p>  int n; /*the number of process*/</p><p><

69、;b>  int k;</b></p><p>  plist *process;</p><p>  printf("please input the number of process: ");</p><p>  scanf("%d",&n);</p><p>  pro

70、cess = creatpro(n);</p><p>  process = sort(process);/****** 利用冒泡法將進(jìn)程按到達(dá)時(shí)間排序 ******/</p><p>  show(process);</p><p>  printf("please choose the what you want to use:\n");

71、</p><p>  printf("\t1 先來(lái)先服務(wù)\n\t2 最高優(yōu)先數(shù)優(yōu)先\n");</p><p>  scanf("%d",&k);</p><p><b>  switch(k)</b></p><p><b>  {</b></p

72、><p><b>  case 1: </b></p><p><b>  {</b></p><p>  process_simulation(process,fcfs_creatready); /****** 先來(lái)先服務(wù) ******/ </p><p><b>  break;&l

73、t;/b></p><p><b>  }</b></p><p><b>  case 2: </b></p><p><b>  {</b></p><p>  process_simulation(process,hrrn_creatready); /******

74、 最高優(yōu)先數(shù)算法 ******/</p><p><b>  break;</b></p><p><b>  }</b></p><p>  default : </p><p><b>  {</b></p><p>  printf("請(qǐng)

75、輸入正確選項(xiàng)?。?!\n");</p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }3 程序運(yùn)行平臺(tái)</b></p><

76、p>  Windows xp </p><p>  Microsoft Visual C++ 6.0</p><p><b>  4 總體設(shè)計(jì)</b></p><p><b>  系統(tǒng)總體框架圖</b></p><p><b>  5程序結(jié)構(gòu)體的說(shuō)明</b></p&

77、gt;<p>  typedef struct pcb</p><p><b>  {</b></p><p>  int name; //進(jìn)程名</p><p>  int needtime; //進(jìn)程所需運(yùn)行時(shí)間</p><p>  int arrivetime; //進(jìn)程到達(dá)時(shí)間

78、</p><p>  int pri; //進(jìn)程優(yōu)先數(shù)</p><p>  int state; //進(jìn)程狀態(tài):0表示未到達(dá) 1表示就緒 2表示運(yùn)行 3表示等待

79、 </p><p><b>  4表示結(jié)束</b></p><p>  int cputime; //已用CPU時(shí)間</p><p>  struct pcb *next;</p><p><b>  }plist;</b></p><p><b>  

80、6 程序運(yùn)行結(jié)果</b></p><p>  先來(lái)先服務(wù)模擬調(diào)度運(yùn)行結(jié)果:</p><p>  最高優(yōu)先數(shù)優(yōu)先調(diào)度模擬運(yùn)行結(jié)果:</p><p><b>  7 結(jié)論</b></p><p>  這次課程設(shè)計(jì)的題目是模擬進(jìn)程調(diào)度,課程設(shè)計(jì)的任務(wù)書要求實(shí)現(xiàn)模擬作業(yè)調(diào)度的兩個(gè)算法:先來(lái)先服務(wù)調(diào)度算法,最高優(yōu)先數(shù)優(yōu)

81、先算法。這次的課程設(shè)計(jì)我采用的是C語(yǔ)言來(lái)編寫的,首先編寫一個(gè)結(jié)構(gòu)體用來(lái)存放進(jìn)程的相關(guān)信息,即PCB。然后將要模擬調(diào)度的進(jìn)程PCB放在隊(duì)列中。通過(guò)不斷的調(diào)試與優(yōu)化,程序很好的模擬了進(jìn)程的調(diào)度過(guò)程,先來(lái)先服務(wù),最高優(yōu)先數(shù)優(yōu)先。在編寫實(shí)現(xiàn)最高優(yōu)先數(shù)優(yōu)先算法的時(shí)候,剛開始由于沒(méi)有考慮到后到達(dá)的進(jìn)程的優(yōu)先數(shù),和當(dāng)前運(yùn)行的進(jìn)程的優(yōu)先數(shù)有高低之分,導(dǎo)致調(diào)度得不到預(yù)想的結(jié)果,經(jīng)過(guò)改正之后就得到了正確的結(jié)果。他們的調(diào)度結(jié)果都不一樣,但是對(duì)于進(jìn)程調(diào)度而言,

82、這幾個(gè)算法各有個(gè)的優(yōu)點(diǎn)和缺點(diǎn)。先來(lái)先服務(wù)算法有利于長(zhǎng)進(jìn)程而不利于短進(jìn)程;最高優(yōu)先數(shù)優(yōu)先算法既照顧了長(zhǎng)進(jìn)程,又考慮了進(jìn)程的優(yōu)先級(jí),不會(huì)使長(zhǎng)進(jìn)程長(zhǎng)期得不到服務(wù),該算法實(shí)現(xiàn)了比較好的折中。</p><p>  通過(guò)本次課程設(shè)計(jì)加深了我對(duì)進(jìn)程調(diào)度算法的理解并且還明白了調(diào)度的過(guò)程。在上操作系統(tǒng)課的時(shí)候?qū)@幾個(gè)算法并不是很理解,通過(guò)實(shí)現(xiàn)了這幾個(gè)調(diào)度算法的模擬之后我,我就明白了這幾個(gè)算法的本質(zhì),并且理解了這幾個(gè)算法。在做課程設(shè)

83、計(jì)的時(shí)候自己還是存在不足之處,在考慮算法的時(shí)候考慮的不夠周全,在編寫最高優(yōu)先數(shù)優(yōu)先的時(shí)候剛開始由于沒(méi)有考慮到后到達(dá)的進(jìn)程與之前的進(jìn)程的優(yōu)先數(shù)不一樣造成調(diào)度的結(jié)果與預(yù)想的不一樣,通過(guò)仔細(xì)的檢查與思考之后發(fā)現(xiàn)了這個(gè)問(wèn)題并且改正了之后就可以得到正確的結(jié)果了。這次課程設(shè)計(jì)還讓我明白了只有多實(shí)踐才能發(fā)現(xiàn)自己的問(wèn)題所在才能夠很好的掌握知識(shí)。</p><p><b>  8 參考文獻(xiàn)</b></p&

84、gt;<p>  張堯?qū)W等編著. 計(jì)算機(jī)操作系統(tǒng)教程.北京:清華大學(xué)出版社,2006.02</p><p>  湯子瀛等編著.計(jì)算機(jī)操作系統(tǒng).西安:西安電子科技出版社,1996.12</p><p>  陳向群 編著.操作系統(tǒng)教程.北京:北京大學(xué)出版社,2007.01</p><p>  羅宇 等編著.操作系統(tǒng)課程設(shè)計(jì).北京:機(jī)械工業(yè)出版社,2005.

85、9</p><p><b>  附 錄</b></p><p><b>  程序源代碼:</b></p><p>  #include<stdio.h></p><p>  #include<stdlib.h></p><p>  #include

86、<time.h></p><p>  #include<windows.h></p><p>  typedef struct pcb</p><p><b>  {</b></p><p>  int name; //進(jìn)程名</p><p>  int needti

87、me; //進(jìn)程所需運(yùn)行時(shí)間</p><p>  int arrivetime; //進(jìn)程到達(dá)時(shí)間</p><p>  int pri; //進(jìn)程優(yōu)先數(shù)</p><p>  int state; //進(jìn)程狀態(tài):0表示未到達(dá) 1表示就緒 2表示運(yùn)行 3表示等待 4表示結(jié)束</p><p>  int

88、cputime; //已用CPU時(shí)間</p><p>  struct pcb *next;</p><p><b>  }plist;</b></p><p>  plist *creatpro(int n) </p><p>  //建立所有將要進(jìn)行N個(gè)模擬調(diào)度的進(jìn)程</p><p>

89、;<b>  {</b></p><p><b>  int j;</b></p><p>  plist *p, *q, *head;</p><p>  p= (plist *) malloc(sizeof(plist));</p><p><b>  head = p;</b&

90、gt;</p><p>  for(j=0;j<n;j++)</p><p><b>  {</b></p><p><b>  q=p;</b></p><p>  p->name = j+1;</p><p>  p->needtime = 1+(int

91、)(10.0*rand()/(RAND_MAX+1.0));</p><p>  p->arrivetime = (int)(10.0*rand()/(RAND_MAX+1.0));</p><p>  p->pri = 1+(int)(9.0*rand()/(RAND_MAX+1.0));</p><p>  p->state = 0;</

92、p><p>  p->cputime =0;</p><p>  p->next = (plist *) malloc(sizeof(plist));</p><p>  p=p->next;</p><p><b>  }</b></p><p>  q->next = NU

93、LL;</p><p>  return head;</p><p><b>  }</b></p><p>  void action(plist * nowpro)</p><p>  //模擬CUP運(yùn)行進(jìn)程的過(guò)程</p><p><b>  {</b></p>

94、;<p>  nowpro->state = 2; //設(shè)置進(jìn)程狀態(tài)為運(yùn)行態(tài)</p><p>  printf("now is process %d ",nowpro->name);</p><p>  nowpro->needtime--; //修改進(jìn)程還需運(yùn)行時(shí)間</p><p>  nowpr

95、o->cputime++; //修改進(jìn)程已運(yùn)行時(shí)間</p><p>  nowpro->state = 1;</p><p>  if(nowpro->needtime==0)//進(jìn)程運(yùn)行結(jié)束</p><p><b>  {</b></p><p>  printf("\tthe pro

96、cess %d is end\n",nowpro->name); </p><p>  nowpro->state = 4; //進(jìn)程運(yùn)行結(jié)束,設(shè)置進(jìn)程狀態(tài)為結(jié)束態(tài)</p><p><b>  }</b></p><p><b>  else</b></p><p><b

97、>  {</b></p><p>  printf("\tprocess %d needtime is %d\n",nowpro->name,nowpro->needtime);</p><p><b>  }</b></p><p>  printf("--------------

98、---------------\n");</p><p><b>  }</b></p><p>  void show(plist * process) </p><p><b>  //顯示</b></p><p><b>  {</b></p>&

99、lt;p>  if(!process)</p><p><b>  {</b></p><p>  printf("there is no process now\n");</p><p><b>  }</b></p><p>  while(process&&a

100、mp;process->state!=4)</p><p><b>  {</b></p><p>  printf("name of process %d",process->name);</p><p>  printf("\tneedtime %d",process->needti

101、me);</p><p>  printf(" arrivetime %d",process->arrivetime);</p><p>  printf(" pri %d",process->pri);</p><p>  printf(" state %d",process-&g

102、t;state);</p><p>  printf(" cputime %d\n",process->cputime);</p><p>  process = process->next;</p><p><b>  }</b></p><p><b>  }</b

103、></p><p>  plist *sort(plist *head) </p><p>  //將進(jìn)程隊(duì)列按到達(dá)先后順序排序</p><p><b>  {</b></p><p>  plist *p,*p1,*p2,*p3,*temp;</p><p><b>  p=h

104、ead;</b></p><p>  while(p->next!=NULL) </p><p><b>  {</b></p><p>  p=p->next;</p><p><b>  }</b></p><p>  while(p!=head)

105、</p><p><b>  {</b></p><p>  p3=p1=head;</p><p>  p2=p1->next;</p><p>  while(p1!=p && p1->next!=NULL)</p><p><b>  {</b&g

106、t;</p><p>  if((p1->arrivetime)>(p2->arrivetime))</p><p><b>  {</b></p><p>  if(p1==head)</p><p><b>  {</b></p><p><b&g

107、t;  head=p2;</b></p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  p3->next=p2;</p><p><b&g

108、t;  }</b></p><p>  temp=p2->next;</p><p>  p2->next=p1;</p><p>  p1->next=temp;</p><p><b>  temp=p1;</b></p><p><b>  p1=p2

109、;</b></p><p><b>  p2=temp;</b></p><p><b>  }</b></p><p><b>  p3=p1;</b></p><p>  p1=p1->next;</p><p>  p2=p1-&

110、gt;next;</p><p><b>  }</b></p><p><b>  p=p3;</b></p><p><b>  }</b></p><p>  return head;</p><p><b>  }</b>&

111、lt;/p><p>  plist *fcfs_creatready(plist *ready_queue,plist *temp) </p><p>  //將進(jìn)程temp添加到就緒隊(duì)列ready_queue的尾部</p><p><b>  {</b></p><p><b>  plist *q;</b

112、></p><p>  q=ready_queue;</p><p>  if(ready_queue) //當(dāng)就緒隊(duì)列不為空時(shí),新進(jìn)入的進(jìn)程添加到就緒隊(duì)列末尾</p><p><b>  {</b></p><p>  while(q->next)</p><p><b>

113、  {</b></p><p>  q=q->next;</p><p>  } //使指針P指向就緒隊(duì)列中最后一個(gè)進(jìn)程</p><p>  q->next=temp;</p><p>  temp->state=1;//修改進(jìn)程狀態(tài)</p><p>  temp->next=

114、NULL;</p><p><b>  }</b></p><p>  else //當(dāng)就緒隊(duì)列為空時(shí),新進(jìn)入的進(jìn)程作為就緒隊(duì)列頭部</p><p><b>  {</b></p><p>  ready_queue=temp;</p><p>  ready_queue

115、->state = 1; //將進(jìn)程狀態(tài)設(shè)為就緒狀態(tài)</p><p>  temp->next=NULL;</p><p><b>  }</b></p><p>  return ready_queue;</p><p><b>  }</b></p><p>

116、  plist *hrrn_creatready(plist *ready_queue, plist *temp)</p><p>  //按優(yōu)先數(shù)遞減的順序?qū)⑦M(jìn)程temp添加到就緒隊(duì)列ready_queue的合適位置</p><p><b>  {</b></p><p>  plist *q, *p;</p><p>

117、;  p=q=ready_queue;</p><p>  if(ready_queue && ready_queue->pri>temp->pri) //按優(yōu)先數(shù)遞減的順序?qū)⑦M(jìn)程temp添加到就緒隊(duì)列ready_queue的合適位置</p><p><b>  {</b></p><p>  while(q

118、&&q->pri>=temp->pri)</p><p><b>  {</b></p><p><b>  p=q;</b></p><p>  q=q->next;</p><p>  } //使指針P->next指向就緒隊(duì)列中進(jìn)程temp的插

119、入位置</p><p>  p->next=temp;</p><p>  temp->next=q;</p><p>  temp->state=1;//修改進(jìn)程狀態(tài)</p><p><b>  }</b></p><p>  else //當(dāng)就緒隊(duì)列為空時(shí),新進(jìn)入的進(jìn)程作

120、為就緒隊(duì)列頭部</p><p><b>  {</b></p><p>  temp->next=ready_queue;</p><p>  ready_queue=temp;</p><p>  ready_queue->state = 1; //將進(jìn)程狀態(tài)設(shè)為就緒狀態(tài)</p>&

121、lt;p><b>  }</b></p><p>  return ready_queue;</p><p><b>  }</b></p><p>  void process_simulation(plist * process,plist *creatready(plist *,plist *))</p&

122、gt;<p><b>  {</b></p><p>  int time; //模擬CPU時(shí)鐘</p><p>  plist *temp;</p><p>  plist *ready_queue=NULL; //定義就緒隊(duì)列,并初始化</p><p>  time = 0; //初始化CPU時(shí)

123、序</p><p>  while(process||ready_queue) //當(dāng)進(jìn)程隊(duì)列不為空,或者就緒隊(duì)列不為空</p><p><b>  {</b></p><p>  while(process && time == process->arrivetime)</p><p><b

124、>  {</b></p><p>  temp = process;</p><p>  process = process->next;</p><p>  ready_queue=creatready(ready_queue, temp);//進(jìn)程到達(dá)時(shí)進(jìn)入就緒隊(duì)列</p><p><b>  }&l

125、t;/b></p><p>  if(ready_queue == NULL) //如果沒(méi)有進(jìn)程運(yùn)行,打印CPU空轉(zhuǎn)信息</p><p><b>  {</b></p><p>  printf("The time sequence is :%d\n",time);</p><p>  prin

126、tf("The ready queue is :\n");</p><p>  printf("there is no process now\n");</p><p>  printf("-----------------------------\n");</p><p><b>  time+

127、+;</b></p><p>  Sleep(500);</p><p><b>  }</b></p><p>  else//如果有進(jìn)程需要運(yùn)行,則模擬進(jìn)程運(yùn)行過(guò)程</p><p><b>  {</b></p><p>  printf("The

128、time sequence is :%d\n",time);</p><p>  printf("The ready queue is :\n");</p><p>  show(ready_queue->next);//打印就緒隊(duì)列</p><p>  action(ready_queue); //模擬進(jìn)程運(yùn)行</p>

129、;<p>  if(ready_queue->needtime == 0) //進(jìn)程運(yùn)行結(jié)束,此時(shí)將此進(jìn)程從就緒隊(duì)列中刪除</p><p><b>  {</b></p><p>  ready_queue=ready_queue->next;</p><p><b>  }</b></p&

130、gt;<p><b>  time++;</b></p><p>  Sleep(1000);</p><p><b>  }</b></p><p><b>  }</b></p><p>  printf("The time sequence is

131、:%d\n",time); //先來(lái)先服務(wù)模擬調(diào)度結(jié)束</p><p>  printf("there is no process now\n");</p><p>  printf("-----------------------------\n");</p><p><b>  }</b>&

132、lt;/p><p>  void main()</p><p><b>  {</b></p><p>  int n; /*the number of process*/</p><p><b>  int k;</b></p><p>  plist *process;&l

133、t;/p><p>  printf("please input the number of process: ");</p><p>  scanf("%d",&n);</p><p>  process = creatpro(n);</p><p>  process = sort(process

134、);/****** 利用冒泡法將進(jìn)程按到達(dá)時(shí)間排序 ******/</p><p>  show(process);</p><p>  printf("please choose the what you want to use:\n");</p><p>  printf("\t1 先來(lái)先服務(wù)\n\t2 最高優(yōu)先數(shù)優(yōu)先\n&quo

135、t;);</p><p>  scanf("%d",&k);</p><p><b>  switch(k)</b></p><p><b>  {</b></p><p><b>  case 1: </b></p><p&g

136、t;<b>  {</b></p><p>  process_simulation(process,fcfs_creatready); /****** 先來(lái)先服務(wù) ******/ </p><p><b>  break;</b></p><p><b>  }</b></p>&

137、lt;p><b>  case 2: </b></p><p><b>  {</b></p><p>  process_simulation(process,hrrn_creatready); /****** 最高優(yōu)先數(shù)算法 ******/</p><p><b>  break;</b>

138、</p><p><b>  }</b></p><p>  default : </p><p><b>  {</b></p><p>  printf("請(qǐng)輸入正確選項(xiàng)!??!\n");</p><p><b>  break;</b&

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論