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

下載本文檔

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

文檔簡介

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

17、t;/b></p><p>  plist *creatpro(int n) //建立所有將要進行N個模擬調(diào)度的進程</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運行進程</p&

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

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

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

25、lt;p>  printf("\tthe process %d is end\n",nowpro->name); </p><p>  nowpro->state = 4; //進程運行結(jié)束,設(shè)置進程狀態(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、想:先判斷鏈表借點是否為空,然后利用循環(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),比較相鄰兩個元素的大小,第一遍將最大的數(shù)排到最末,第二遍將次大的數(shù)排到最末的數(shù)的前面,經(jīng)N-1遍后將滿足排序的要求。</p><p><

34、b>  代碼:</b></p><p>  plist *sort(plist *head) </p><p>  //將進程隊列按到達先后順序排序</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建立先來先服務(wù)調(diào)度算法的就緒隊列</p><p>  算法思想:先來先服務(wù)調(diào)度算法中的就緒隊列是按到達時間的先后排序的,當就緒隊列為空時,直接將作為將要添加的進程PCB temp作為隊頭,如果就緒隊列不為空,則將temp添加到隊列末尾。</p><p>  添加到就緒隊列后再修改進程狀態(tài)為就緒態(tài)。</p><p><b>  代碼:<

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

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

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

45、{ //當就緒隊列為空時,新進入的進程作為就緒隊列頭部</p><p>  ready_queue=temp;</p><p>  ready_queue->state = 1; //將進程狀態(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)度算法的就緒隊列</p><p>  算法思想:最高優(yōu)先數(shù)優(yōu)先調(diào)度算法中的就緒隊列是按進

47、程優(yōu)先數(shù)遞減排序的,當就緒隊列為空時,直接將作為將要添加的進程PCB temp作為隊頭,如果就緒隊列不為空,則將temp添加到隊列合適位置。然后再修改進程狀態(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程temp添加到就緒隊列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程temp添加到就緒隊列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指向就緒隊列中進程temp的插入位置</p><p>  p->next=temp;</p><p>  temp->next=q;</p><p>  temp->state=1;//修改進程狀態(tài)&l

51、t;/p><p><b>  }</b></p><p>  else{ //當就緒隊列為空時,新進入的進程作為就緒隊列頭部</p><p>  temp->next=ready_queue;</p><p>  ready_queue=temp;</p><p>  ready_q

52、ueue->state = 1; //將進程狀態(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進程模擬調(diào)度</b></p><p><b>  算法思想:</b></p><p>  1.先來先服務(wù)調(diào)度算法</p><p>  先來先服務(wù)調(diào)度算法是一種最簡單的調(diào)度算法,該算法既可以用于作業(yè)調(diào)度,也可用于進程調(diào)度。當在作業(yè)調(diào)度中采用該算法時,每次調(diào)度都是從后備作業(yè)隊列中選擇一個或多個

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

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

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

57、imulation(process,hrrn_creatready);則此時是最高優(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時鐘</p><p>  plist *temp;</p><p>  plist *ready_queue=NULL; //定義就緒隊列,并初始化</p><p>  time = 0; //初始化CPU時序</p><

59、p>  while(process||ready_queue) //當進程隊列不為空,或者就緒隊列不為空</p><p><b>  {</b></p><p>  while(process && time == process->arrivetime) {//進程到達時進入就緒隊列</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、果沒有進程運行,打印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{//如果有進程需要運行,則模擬進程運行過程</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);//打印就緒隊列</p><p>  action(ready_queue); //模擬進程運行</p><p>  if(ready_queue ->needtime == 0) {//進程運行結(jié)束,此時將此進程從就緒隊列中刪除</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); //先來先服務(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鏈表,然后采用冒泡法將鏈表按進程到達時間遞增的順序排序,然后采用switch--case 選擇

68、結(jié)構(gòu)進行菜單選擇需要模擬的調(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);/****** 利用冒泡法將進程按到達時間排序 ******/</p><p>  show(process);</p><p>  printf("please choose the what you want to use:\n");

71、</p><p>  printf("\t1 先來先服務(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); /****** 先來先服務(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("請

75、輸入正確選項!?。n");</p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }3 程序運行平臺</b></p><

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

77、gt;<p>  typedef struct pcb</p><p><b>  {</b></p><p>  int name; //進程名</p><p>  int needtime; //進程所需運行時間</p><p>  int arrivetime; //進程到達時間

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

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

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

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

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

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

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

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

88、cputime; //已用CPU時間</p><p>  struct pcb *next;</p><p><b>  }plist;</b></p><p>  plist *creatpro(int n) </p><p>  //建立所有將要進行N個模擬調(diào)度的進程</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運行進程的過程</p><p><b>  {</b></p>

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

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

96、cess %d is end\n",nowpro->name); </p><p>  nowpro->state = 4; //進程運行結(jié)束,設(shè)置進程狀態(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>  //將進程隊列按到達先后順序排序</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>  //將進程temp添加到就緒隊列ready_queue的尾部</p><p><b>  {</b></p><p><b>  plist *q;</b

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

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

114、NULL;</p><p><b>  }</b></p><p>  else //當就緒隊列為空時,新進入的進程作為就緒隊列頭部</p><p><b>  {</b></p><p>  ready_queue=temp;</p><p>  ready_queue

115、->state = 1; //將進程狀態(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程temp添加到就緒隊列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程temp添加到就緒隊列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指向就緒隊列中進程temp的插

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

120、為就緒隊列頭部</p><p><b>  {</b></p><p>  temp->next=ready_queue;</p><p>  ready_queue=temp;</p><p>  ready_queue->state = 1; //將進程狀態(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時鐘</p><p>  plist *temp;</p><p>  plist *ready_queue=NULL; //定義就緒隊列,并初始化</p><p>  time = 0; //初始化CPU時

123、序</p><p>  while(process||ready_queue) //當進程隊列不為空,或者就緒隊列不為空</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);//進程到達時進入就緒隊列</p><p><b>  }&l

125、t;/b></p><p>  if(ready_queue == NULL) //如果沒有進程運行,打印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//如果有進程需要運行,則模擬進程運行過程</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);//打印就緒隊列</p><p>  action(ready_queue); //模擬進程運行</p>

129、;<p>  if(ready_queue->needtime == 0) //進程運行結(jié)束,此時將此進程從就緒隊列中刪除</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); //先來先服務(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、);/****** 利用冒泡法將進程按到達時間排序 ******/</p><p>  show(process);</p><p>  printf("please choose the what you want to use:\n");</p><p>  printf("\t1 先來先服務(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); /****** 先來先服務(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("請輸入正確選項?。。n");</p><p><b>  break;</b&

溫馨提示

  • 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

提交評論