2023年全國(guó)碩士研究生考試考研英語(yǔ)一試題真題(含答案詳解+作文范文)_第1頁(yè)
已閱讀1頁(yè),還剩25頁(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>  一.課程概述</b></p><p><b>  1.1.設(shè)計(jì)構(gòu)想</b></p><p>  程序能夠完成以下操作:創(chuàng)建進(jìn)程:先輸入進(jìn)程的數(shù)目,再一次輸入每個(gè)進(jìn)程的進(jìn)程名、運(yùn)行總時(shí)間和優(yōu)先級(jí),先到達(dá)的先輸入;進(jìn)程調(diào)度:進(jìn)程創(chuàng)建完成后就選擇進(jìn)程調(diào)度算法,并單步執(zhí)行,每次執(zhí)行的結(jié)果都從屏幕上輸出來(lái)。</p>

2、<p><b>  1.2.需求分析</b></p><p>  在多道程序環(huán)境下,主存中有著多個(gè)進(jìn)程,其數(shù)目往往多于處理機(jī)數(shù)目,要使這多個(gè)進(jìn)程能夠并發(fā)地執(zhí)行,這就要求系統(tǒng)能按某種算法,動(dòng)態(tài)地把處理機(jī)分配給就緒隊(duì)列中的一個(gè)進(jìn)程,使之執(zhí)行。分配處理機(jī)的任務(wù)是由處理機(jī)調(diào)度程序完成的。由于處理機(jī)是最重要的計(jì)算機(jī)資源,提高處理機(jī)的利用率及改善系統(tǒng)必(吞吐量、響應(yīng)時(shí)間),在很大程度上取決

3、于處理機(jī)調(diào)度性能的好壞,因而,處理機(jī)調(diào)度便成為操作系統(tǒng)設(shè)計(jì)的中心問(wèn)題之一。本次實(shí)驗(yàn)在VC++6.0環(huán)境下實(shí)現(xiàn)先來(lái)先服務(wù)調(diào)度算法,短作業(yè)優(yōu)先調(diào)度算法,高優(yōu)先權(quán)調(diào)度算法,時(shí)間片輪轉(zhuǎn)調(diào)度算法和多級(jí)反饋隊(duì)列調(diào)度算法。</p><p><b>  1.3.理論依據(jù)</b></p><p>  為了描述和管制進(jìn)程的運(yùn)行,系統(tǒng)為每個(gè)進(jìn)程定義了一個(gè)數(shù)據(jù)結(jié)構(gòu)——進(jìn)程控制塊PCB(Pro

4、cess Control Block),PCB中記錄了操作系統(tǒng)所需的、用于描述進(jìn)程的當(dāng)前情況以及控制進(jìn)程運(yùn)行的全部信息,系統(tǒng)總是通過(guò)PCB對(duì)進(jìn)程進(jìn)行控制,亦即,系統(tǒng)是根據(jù)進(jìn)程的PCB而不是任何別的什么而感知進(jìn)程的存在的,PCB是進(jìn)程存在的惟一標(biāo)志。本次課程設(shè)計(jì)用結(jié)構(gòu)體Process代替PCB的功能。</p><p><b>  1.4.課程任務(wù)</b></p><p>

5、;  用C語(yǔ)言(或C++)編程實(shí)現(xiàn)操作模擬操作系統(tǒng)進(jìn)程調(diào)度子系統(tǒng)的基本功能;運(yùn)用多種算法實(shí)現(xiàn)對(duì)進(jìn)程的模擬調(diào)度。</p><p>  通過(guò)編寫(xiě)程序?qū)崿F(xiàn)進(jìn)程或作業(yè)先來(lái)先服務(wù)、高優(yōu)先權(quán)、按時(shí)間片輪轉(zhuǎn)、短作業(yè)優(yōu)先、多級(jí)反饋隊(duì)列調(diào)度算法,使學(xué)生進(jìn)一步掌握進(jìn)程調(diào)度的概念和算法,加深對(duì)處理機(jī)分配的理解。</p><p><b>  實(shí)現(xiàn)用戶界面的開(kāi)發(fā)</b></p>

6、<p>  1.5.功能模塊分析:</p><p>  進(jìn)程概念:進(jìn)程是被獨(dú)立分配資源的最小單位。進(jìn)程是動(dòng)態(tài)概念,必須程序運(yùn)行才有 </p><p><b>  進(jìn)程的產(chǎn)生。</b></p><p>  2、進(jìn)程的狀態(tài)模型: </p><p> ?。?)運(yùn)行:進(jìn)程已獲得處理機(jī),當(dāng)前處于運(yùn)行狀態(tài)。<

7、/p><p>  (2)就緒:進(jìn)程已經(jīng)準(zhǔn)備好,一旦有處理器就可運(yùn)行。</p><p>  3、處理機(jī)調(diào)度:在多道程序設(shè)計(jì)系統(tǒng)中,內(nèi)存中有多道程序運(yùn)行,他們相互爭(zhēng)奪處理機(jī) </p><p>  這一重要的資源。處理機(jī)調(diào)度就是從就緒隊(duì)列中,按照一定的算法選擇一個(gè)進(jìn)程并將</p><p>  處理機(jī)分配給它運(yùn)行,以實(shí)現(xiàn)進(jìn)程并發(fā)地執(zhí)行。</p&

8、gt;<p>  4、進(jìn)程調(diào)度算法的功能:</p><p>  記錄系統(tǒng)中所有進(jìn)程的執(zhí)行情況</p><p>  選擇占有處理機(jī)的進(jìn)程</p><p>  進(jìn)行進(jìn)程的上下文切換</p><p>  5、進(jìn)程調(diào)度的算法:</p><p> ?。?)先來(lái)先服務(wù)算法:如果早就緒的進(jìn)程排在就緒隊(duì)列的前面,遲就緒的

9、進(jìn)程排在 </p><p>  就緒隊(duì)列的后面,那么先來(lái)先服務(wù)總是把當(dāng)前處于就緒隊(duì)列之首的那個(gè)進(jìn)程調(diào)</p><p><b>  度到運(yùn)行狀態(tài)。</b></p><p> ?。?)優(yōu)先數(shù)算法:即進(jìn)程的執(zhí)行順序由高優(yōu)先級(jí)到低優(yōu)先級(jí)。系統(tǒng)或用戶按某種原則為進(jìn)程指定一個(gè)優(yōu)先級(jí)來(lái)表示該進(jìn)程所享有的確調(diào)度優(yōu)先權(quán)。該算法核心是確定進(jìn)程的優(yōu)先級(jí)。</

10、p><p> ?。?)時(shí)間片輪轉(zhuǎn)算法:固定時(shí)間片,每個(gè)進(jìn)程在執(zhí)行一個(gè)時(shí)間片后,輪到下一進(jìn)程執(zhí)行,知道所有的進(jìn)程執(zhí)行完畢。處理器同一個(gè)時(shí)間只能處理一個(gè)任務(wù)。處理器在處理多任務(wù)的時(shí)候,就要看請(qǐng)求的時(shí)間順序,如果時(shí)間一致,就要進(jìn)行預(yù)測(cè)。挑到一個(gè)任務(wù)后,需要若干步驟才能做完,這些步驟中有些需要處理器參與,有些不需要(如磁盤控制器的存儲(chǔ)過(guò)程)。不需要處理器處理的時(shí)候,這部分時(shí)間就要分配給其他的進(jìn)程。原來(lái)的進(jìn)程就要處于等待的時(shí)間

11、段上。經(jīng)過(guò)周密分配時(shí)間,宏觀上就象是多個(gè)任務(wù)一起運(yùn)行一樣,但微觀上是有先后的,就是時(shí)間片輪換。</p><p>  (4) 多級(jí)反饋隊(duì)列法:又稱反饋循環(huán)隊(duì)列或多隊(duì)列策略, 主要思想是將就緒進(jìn)程分為兩級(jí)或多級(jí),系統(tǒng)相應(yīng)建立兩個(gè)或多個(gè)就緒進(jìn)程隊(duì)列, 較高優(yōu)先級(jí)的隊(duì)列一般分配給較短的時(shí)間片。 處理器調(diào)度先從高級(jí)就緒進(jìn)程隊(duì)列中選取可占有處理器的進(jìn)程, 只有在選不到時(shí), 才從較低 級(jí)的就緒進(jìn)程隊(duì)列中選取。</p>

12、;<p>  (5)短作業(yè)優(yōu)先法:對(duì)短進(jìn)程優(yōu)先調(diào)度的算法,它是從后備隊(duì)列中選擇一個(gè)或者若干個(gè)進(jìn)程,將處理機(jī)分配給它,使它立即執(zhí)行并一直執(zhí)行到完成, 或發(fā)生某事件而被阻塞放棄處理機(jī)時(shí)再重新調(diào)度。</p><p><b>  二.設(shè)計(jì)方案</b></p><p>  2.1.先來(lái)先服務(wù)調(diào)度</p><p>  2.1.1.算法思想&l

13、t;/p><p>  先來(lái)先服務(wù)調(diào)度算法的思想是按照進(jìn)程進(jìn)入就緒隊(duì)列的先后順序調(diào)度并分配處理機(jī)執(zhí)行。先來(lái)先服務(wù)調(diào)度算法是一種不可搶占的算法,先進(jìn)入就緒隊(duì)列的進(jìn)程,先被處理機(jī)運(yùn)行。一旦一個(gè)進(jìn)程占有了處理機(jī),它就一直運(yùn)行下去,直到該進(jìn)程完成工作或者因?yàn)榈却呈录荒芾^續(xù)運(yùn)行時(shí)才釋放處理機(jī)。</p><p>  2.1.2.算法流程圖</p><p>  圖1.先來(lái)先服務(wù)算

14、法流程圖</p><p>  2.1.3.程序代碼</p><p>  #include <stdio.h></p><p>  #include <stdlib.h></p><p>  #include <string.h></p><p>  typedef struct no

15、de</p><p><b>  { </b></p><p>  char name[10]; /*進(jìn)程名*/</p><p>  int cputime; /*占用cpu時(shí)間*/</p><p>  char starttime[5]; //進(jìn)程開(kāi)始時(shí)間</p><p>  i

16、nt needtime; /*要求運(yùn)行時(shí)間*/</p><p>  char state; /*狀態(tài)*/</p><p>  struct node *next; /*指針*/</p><p><b>  }PCB;</b></p><p>  PCB *ready, *run, *finish

17、; //就緒、執(zhí)行、結(jié)束指針</p><p>  int N; //進(jìn)程數(shù)量</p><p>  void print() //輸出函數(shù)</p><p><b>  {</b></p><p><b>  PCB *p;</b></p><p>  printf(&quo

18、t; NAME CPUTIME STARTTIME NEEDTIME STATUS\n");</p><p>  if(run != NULL)</p><p>  printf(" %-10s%-10d%-10s%-10d %c\n",</p><p>  run->name,</p><

19、p>  run->cputime,</p><p>  run->starttime,</p><p>  run->needtime,</p><p>  run->state); /*輸出執(zhí)行的進(jìn)程的信息*/</p><p><b>  p=ready;</b></p>

20、<p>  while(p != NULL)</p><p><b>  {</b></p><p>  printf(" %-10s%-10d%-10s%-10d %c\n",</p><p><b>  p->name,</b></p><p>  p-&

21、gt;cputime,</p><p>  p->starttime,</p><p>  p->needtime,</p><p>  p->state); /*輸出就緒進(jìn)程的信息*/</p><p>  p=p->next; </p><p><b>  }</b

22、></p><p><b>  p=finish;</b></p><p>  while(p != NULL)</p><p><b>  {</b></p><p>  printf(" %-10s%-10d%-10s%-10d %c\n",</p>&

23、lt;p><b>  p->name,</b></p><p>  p->cputime,</p><p>  p->starttime,</p><p>  p->needtime,</p><p>  p->state); /*輸出結(jié)束隊(duì)列的信息*/</p>

24、<p>  p=p->next; </p><p><b>  }</b></p><p>  getchar(); /*使用getchar()函數(shù)可以讓輸出時(shí)停留畫(huà)面,</p><p>  等待人按回車?yán)^續(xù)*/</p><p><b>  } </b></p>&l

25、t;p>  void insert(PCB *q) /*插入新進(jìn)程,把進(jìn)程按進(jìn)程到來(lái)時(shí)間大小排序*/</p><p><b>  { </b></p><p>  PCB *p1,*s,*r;</p><p><b>  int b;</b></p><p>  s=q; /

26、*指針s指向新要插入的進(jìn)程*/</p><p>  p1=ready; /*指針p1指向原來(lái)的進(jìn)程隊(duì)列的隊(duì)首*/</p><p>  r=p1; /*使用指針r是指向p1前面的進(jìn)程*/</p><p><b>  b=1;</b></p><p>  while((p1!=NULL)&&b

27、)</p><p>  if(strcmp(p1->starttime,s->starttime)<0) </p><p><b>  {</b></p><p>  r=p1; p1=p1->next; </p><p>  } /*新進(jìn)程的開(kāi)始時(shí)間大,則p1 指向下一個(gè)進(jìn)程繼續(xù)比*/ &l

28、t;/p><p><b>  else </b></p><p>  b=0; </p><p>  if(r!=p1) </p><p><b>  {</b></p><p>  r->next=s; s-&

29、gt;next=p1; </p><p>  } /*新進(jìn)程找到位置,插在r和p1之間*/</p><p><b>  else</b></p><p><b>  {</b></p><p>  s->next=p1; ready=s; </p><p>  } /

30、*新進(jìn)程的開(kāi)始時(shí)間按最小,插在隊(duì)首,并修改就緒隊(duì)首ready指針*/</p><p><b>  } </b></p><p>  void create() </p><p><b>  { </b></p><p>

31、<b>  PCB *p;</b></p><p><b>  int i;</b></p><p>  ready=NULL; </p><p>  run=NULL; </p><p>  finish=NULL;</p><p>  printf("Plea

32、se enter the name and time and starttime of PCB:\n"); </p><p>  /*輸入進(jìn)程名、運(yùn)行時(shí)間和開(kāi)始時(shí)間*/</p><p>  for(i=0;i<N;i++) </p><p><b>  { </b&

33、gt;</p><p>  p=(PCB *)malloc(sizeof(PCB)); /*為新進(jìn)程開(kāi)辟空間*/</p><p>  scanf("%s",p->name); /*輸入進(jìn)程名*/</p><p>  scanf("%d",&p->needtime); /*輸入進(jìn)程要求運(yùn)行時(shí)間

34、*/</p><p>  scanf("%s",p->starttime); //輸入進(jìn)程開(kāi)始時(shí)間</p><p>  p->cputime=0; </p><p>  p->state='W'; /*表示就緒隊(duì)列中未在隊(duì)首先執(zhí)行,但也是就緒狀態(tài)*/</p><p>  

35、if (ready!=NULL) </p><p>  insert(p); /*就緒隊(duì)首不為NULL,插入新進(jìn)程*/</p><p><b>  else </b></p><p>  { /*否則先插在NULL前*/</p><p>  p->next=ready;</p><p&g

36、t;<b>  ready=p; </b></p><p><b>  } </b></p><p><b>  } </b></p><p>  printf(" Display is going to start: \n");&l

37、t;/p><p>  printf("***********************************************\n");</p><p>  print(); </p><p>  getchar();</p><p>  run=ready; /*隊(duì)列排好,run指向就緒隊(duì)列隊(duì)首*/</p

38、><p>  ready=ready->next; /*ready指向下一個(gè)進(jìn)程*/</p><p>  run->state='R'; /*隊(duì)首進(jìn)程的狀態(tài)為就緒*/</p><p><b>  }</b></p><p>  void FCFS()</p><p

39、><b>  {</b></p><p>  while(run != NULL)</p><p><b>  {</b></p><p>  run->cputime=run->cputime+run->needtime;</p><p>  run->needtim

40、e=0;</p><p>  run->next=finish;</p><p>  finish = run;</p><p>  run->state='E';</p><p>  run = NULL;</p><p>  if(ready != NULL)</p>&l

41、t;p><b>  {</b></p><p>  run = ready;</p><p>  run->state='R';</p><p>  ready=ready->next;</p><p><b>  }</b></p><p>

42、;<b>  print();</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  void main()</p><p><b>  { </b></p><p>  pri

43、ntf("Please enter the total number of PCB:\n");</p><p>  scanf("%d",&N);</p><p>  create(); /*模擬創(chuàng)建進(jìn)程,并輸入相關(guān)信息*/</p><p>  FCFS(); /*先來(lái)先服務(wù)調(diào)度算法*/</p>

44、<p><b>  }</b></p><p>  2.1.4.測(cè)試結(jié)果及說(shuō)明</p><p>  首先輸入進(jìn)程個(gè)數(shù)(為5個(gè)),這里命名為A,B,C,D,E,然后分別輸入運(yùn)行時(shí)間和開(kāi)始時(shí)間</p><p>  所有進(jìn)程都在隊(duì)列中,并都處于等待狀態(tài)</p><p>  其中一個(gè)進(jìn)程執(zhí)行完畢</p>

45、<p><b>  所有進(jìn)程都執(zhí)行完畢</b></p><p><b>  2.2.優(yōu)先級(jí)調(diào)度</b></p><p>  2.2.1.算法思想</p><p>  進(jìn)程的執(zhí)行順序由高優(yōu)先級(jí)到低優(yōu)先級(jí),系統(tǒng)或用戶按某種原則為進(jìn)程指定一個(gè)優(yōu)先級(jí)來(lái)表示該進(jìn)程所享有的確調(diào)度優(yōu)先權(quán)。該算法核心是確定進(jìn)程的優(yōu)先級(jí)。<

46、;/p><p>  2.2.2.算法流程圖</p><p>  圖2.優(yōu)先級(jí)調(diào)度流程圖</p><p>  2.2.3.程序代碼</p><p>  #include <stdio.h></p><p>  #include <stdlib.h></p><p>  #inc

47、lude <string.h></p><p>  typedef struct node</p><p>  { char name[10]; /*進(jìn)程名*/</p><p>  int prio; /*優(yōu)先數(shù)*/</p><p>  int cputime; /*占用cpu時(shí)間*/</p

48、><p>  int needtime; /*要求運(yùn)行時(shí)間*/</p><p>  char state; /*狀態(tài)*/</p><p>  struct node *next; /*指針*/</p><p><b>  }PCB;</b></p><p>  PCB *re

49、ady,*run,*finish; /*就緒 執(zhí)行 結(jié)束指針*/</p><p><b>  int N;</b></p><p>  void prt() /*輸出函數(shù),可以方便看到進(jìn)程執(zhí)行的演示*/</p><p><b>  {</b></p><p><b>  PCB *p

50、;</b></p><p>  printf(" NAME CPUTIME NEEDTIME PRIORITY STATUS\n");</p><p>  if(run!=NULL) </p><p>  printf(" %-10s%-10d%-10d%-10d %c\n",run->

51、;name,run->cputime,run->needtime,run->prio,run->state); </p><p>  /*輸出執(zhí)行的進(jìn)程的信息*/</p><p>  p=ready; </p><p>  while(p!=NULL) </p><p>  {printf("

52、 %-10s%-10d%-10d%-10d %c\n",p->name,p->cputime,p->needtime,p->prio,p->state); /*輸出就緒進(jìn)程的信息*/</p><p>  p=p->next; }</p><p>  p=finish; </p><p>  while(

53、p!=NULL)</p><p>  { printf(" %-10s%-10d%-10d%-10d %c\n",p->name,p->cputime,p->needtime,p->prio,p->state); /*輸出結(jié)束隊(duì)列的信息*/</p><p>  p=p->next; }</p><p&

54、gt;  getchar(); } /*使用getchar()函數(shù)可以讓輸出時(shí)停留畫(huà)面,等待人按回車?yán)^續(xù)*/</p><p>  void insert(PCB *q) /*插入新進(jìn)程,把進(jìn)程按優(yōu)先數(shù)大小排序*/</p><p>  { PCB *p1,*s,*r;</p><p><b>  int b;</b></p>

55、<p>  s=q; /*指針s指向新要插入的進(jìn)程*/</p><p>  p1=ready; /*指針p1指向原來(lái)的進(jìn)程隊(duì)列的隊(duì)首*/</p><p>  r=p1; /*使用指針r是指向p1前面的進(jìn)程*/</p><p><b>  b=1;</b></p><p>  wh

56、ile((p1!=NULL)&&b)</p><p>  if(p1->prio>=s->prio) { r=p1; p1=p1->next; } /*新進(jìn)程的優(yōu)先數(shù)小,則p1 指向下一個(gè)進(jìn)程繼續(xù)比*/ </p><p>  else b=0; </p><p>

57、;  if(r!=p1) { r->next=s; s->next=p1; } /*新進(jìn)程找到位置,插在r和p1之間*/</p><p>  else { s->next=p1; ready=s; } } /*新進(jìn)程的優(yōu)先數(shù)最大,插在隊(duì)首,并</p><p>  修改就緒隊(duì)首ready指針*/</p><p>  void crea

58、te() </p><p>  { PCB *p;</p><p><b>  int i;</b></p><p>  ready=NULL; run=NULL; finish=NULL;</p><p>  printf("Pl

59、ease enter the name and time and priority of PCB:\n"); </p><p>  /*輸入進(jìn)程名、運(yùn)行時(shí)間和優(yōu)先級(jí)*/</p><p>  for(i=0;i<N;i++) </p><p>  { p=(PCB *)malloc(

60、sizeof(PCB)); /*為新進(jìn)程開(kāi)辟空間*/</p><p>  scanf("%s",p->name); /*輸入進(jìn)程名*/</p><p>  scanf("%d",&p->needtime); /*輸入進(jìn)程要求運(yùn)行時(shí)間*/</p><p>  scanf("%d&qu

61、ot;,&p->prio); /*輸入進(jìn)程優(yōu)先數(shù)*/</p><p>  p->cputime=0; </p><p>  p->state='W'; /*表示就緒隊(duì)列中未在隊(duì)首先執(zhí)行,但也是就緒狀態(tài)*/</p><p>  if (ready!=NULL) insert(p); /*就緒隊(duì)首不為N

62、ULL,插入新進(jìn)程*/</p><p>  else { p->next=ready; ready=p; } } /*否則先插在NULL前*/ </p><p>  printf(" Display is going to start: \n");</p><p>  printf(&quo

63、t;***********************************************\n");</p><p><b>  prt(); </b></p><p>  run=ready; /*隊(duì)列排好,run指向就緒隊(duì)列隊(duì)首*/</p><p>  ready=ready->next; /*re

64、ady指向下一個(gè)進(jìn)程,這樣當(dāng)進(jìn)程執(zhí)行時(shí)如果優(yōu)先數(shù)小于其他的進(jìn)程,應(yīng)該先進(jìn)行優(yōu)先數(shù)最大的進(jìn)程*/</p><p>  run->state='R'; } /*隊(duì)首進(jìn)程的狀態(tài)為就緒*/</p><p>  void prio()</p><p>  { while(run!=NULL)</p><p>  { ru

65、n->cputime=run->cputime+1; /*運(yùn)行一次cpu占用時(shí)間加一*/</p><p>  run->needtime=run->needtime-1; /*運(yùn)行一次要求運(yùn)行時(shí)間減一*/</p><p>  run->prio=run->prio-1; /*運(yùn)行一次優(yōu)先數(shù)減一*/</p><p>  i

66、f(run->needtime==0) /*若要求運(yùn)行時(shí)間為0時(shí)*/</p><p>  { run->next=finish; /*退出隊(duì)列*/</p><p>  finish=run; /*finish為結(jié)束進(jìn)程的隊(duì)列 */</p><p>  run->state='E';

67、 /*修改狀態(tài)為結(jié)束*/</p><p>  run=NULL; /*釋放run指針*/</p><p>  if (ready!=NULL) /*創(chuàng)建新就緒隊(duì)列的頭指針*/</p><p>  { run=ready; run->state='R'; ready=ready-&g

68、t;next; } }</p><p><b>  else</b></p><p>  if((ready!=NULL)&&(run->prio<ready->prio))</p><p>  /*隊(duì)首進(jìn)程的優(yōu)先數(shù)比它下一個(gè)小,且下一個(gè)進(jìn)程不為NULL時(shí)執(zhí)行*/</p><p>  {

69、 run->state='W'; </p><p>  run->next=NULL; /*隊(duì)首進(jìn)程退出進(jìn)程隊(duì)列*/</p><p>  insert(run); /*在進(jìn)程隊(duì)列中重新插入原來(lái)的隊(duì)首進(jìn)程*/</p><p>  run=ready; /*重新置就緒隊(duì)列的頭指針*/</p><p

70、>  run->state='R';</p><p>  ready=ready->next; }</p><p>  prt(); } }</p><p>  void main()</p><p>  { printf("Please enter the total number of PC

71、B:\n");</p><p>  scanf("%d",&N);</p><p>  create(); /*模擬創(chuàng)建進(jìn)程,并輸入相關(guān)信息*/</p><p>  prio(); } /*優(yōu)先數(shù)調(diào)度算法*/</p><p>  2.2.4.測(cè)試結(jié)果及說(shuō)明</p><p>

72、;  優(yōu)先級(jí)調(diào)度算法運(yùn)行情況如圖1,圖2,圖3,圖4所示</p><p>  圖1.輸入進(jìn)程塊的數(shù)量</p><p>  圖2.輸入每個(gè)進(jìn)程的名稱、時(shí)間、優(yōu)先級(jí)</p><p>  圖3.輸入所有的進(jìn)程的相關(guān)信息</p><p>  圖4.所有進(jìn)程調(diào)度算法完成</p><p>  2.3.時(shí)間片輪轉(zhuǎn)調(diào)度</p&g

73、t;<p>  2.3.1.算法思想</p><p>  所有就緒進(jìn)程按先來(lái)先服務(wù)的原則排成一個(gè)隊(duì)列,將新來(lái)的進(jìn)程加到就緒對(duì)列的末尾,每當(dāng)執(zhí)行進(jìn)程調(diào)度時(shí),總是把處理機(jī)分配給隊(duì)首的進(jìn)程,各進(jìn)程占用CPU的時(shí)間片相同。也就是說(shuō)CPU的處理時(shí)間劃分成一個(gè)個(gè)相同的時(shí)間片,就緒隊(duì)列的所有進(jìn)程輪流運(yùn)行一個(gè)時(shí)間片。當(dāng)一個(gè)時(shí)間片結(jié)束時(shí),如果運(yùn)行進(jìn)程用完它的時(shí)間片后還未完成,就強(qiáng)迫運(yùn)行進(jìn)程讓出CPU,就把它送回到就緒

74、隊(duì)列的末尾,等待下一次調(diào)度。同時(shí),進(jìn)程調(diào)度又去選擇就緒隊(duì)列中的隊(duì)首進(jìn)程,分配給它一時(shí)間片,以投入運(yùn)行。直至所有的進(jìn)程運(yùn)行完畢。</p><p>  2.3.2.算法流程圖</p><p>  2.3.3.程序代碼</p><p>  #include <stdio.h></p><p>  #include <stdlib.

75、h></p><p>  #include <string.h></p><p>  typedef struct node</p><p><b>  { </b></p><p>  char name[10]; /*進(jìn)程名*/</p><p>  int count;

76、 /*計(jì)數(shù)器,判斷是否=時(shí)間片的大小*/</p><p>  int cputime; /*占用cpu時(shí)間*/</p><p>  int needtime; /*要求運(yùn)行時(shí)間*/</p><p>  char state; /*狀態(tài)*/</p><p>  struct node *next;

77、 /*指針*/</p><p><b>  }PCB;</b></p><p>  PCB *ready,*run,*finish,*tail; /*就緒 執(zhí)行 結(jié)束 尾指針*/</p><p>  int N,round;</p><p>  void prt() /*輸出函數(shù),可以方便看到進(jìn)程執(zhí)行的演示*/

78、</p><p><b>  {</b></p><p><b>  PCB *p;</b></p><p>  printf(" NAME CPUTIME NEEDTIME STATUS\n");</p><p>  if(run!=NULL) </p&g

79、t;<p>  printf(" %-10s%-10d%-10d %c\n",run->name,run->cputime,run->needtime,run->state); /*輸出執(zhí)行的進(jìn)程的信息*/</p><p>  p=ready; </p><p>  while(p!=NULL) </p>

80、;<p><b>  { </b></p><p>  printf(" %-10s%-10d%-10d %c\n",p->name,p->cputime,p->needtime,p->state); /*輸出就緒進(jìn)程的信息*/</p><p>  p=p->next; </p>

81、;<p><b>  }</b></p><p>  p=finish; </p><p>  while(p!=NULL)</p><p><b>  { </b></p><p>  printf(" %-10s%-10d%-10d %c\n",p->

82、;name,p->cputime,p->needtime,p->state); /*輸出結(jié)束隊(duì)列的信息*/</p><p>  p=p->next; </p><p><b>  }</b></p><p>  getchar(); </p><p><b>  }</b

83、></p><p>  void insert(PCB *q) /*在隊(duì)尾插入新的進(jìn)程*/</p><p><b>  { </b></p><p><b>  PCB *p;</b></p><p><b>  p=ready;</b></p>&l

84、t;p>  while(p->next!=NULL)</p><p><b>  {</b></p><p>  p=ready->next;</p><p><b>  }</b></p><p><b>  tail=p;</b></p>&

85、lt;p>  tail->next=q;</p><p>  q->next=NULL; </p><p><b>  }</b></p><p>  void create() </p><p><b>  { <

86、/b></p><p><b>  PCB *p;</b></p><p><b>  int i;</b></p><p>  ready=NULL; run=NULL; finish=NULL;</p><p>  printf("Please enter the nam

87、e and time of PCB:\n"); /*輸入進(jìn)程名、和*/</p><p>  for(i=0;i<N;i++) </p><p><b>  { </b></p><p>  p=(PCB *)malloc(sizeof(PCB)); /*為新

88、進(jìn)程開(kāi)辟空間*/</p><p>  scanf("%s",p->name); /*輸入進(jìn)程名*/</p><p>  scanf("%d",&p->needtime); /*輸入進(jìn)程要求運(yùn)行時(shí)間*/</p><p>  p->cputime=0; </p><

89、;p>  p->state='W'; /*表示就緒隊(duì)列中未在隊(duì)首先執(zhí)行,但也是就緒狀態(tài)*/</p><p>  if (ready!=NULL) insert(p); /*就緒隊(duì)首不為NULL,插入新進(jìn)程*/</p><p><b>  else </b></p><p><b>  {<

90、/b></p><p>  p->next=ready; ready=p; tail=p; </p><p><b>  } </b></p><p><b>  } </b></p><p>  printf(" Display is going

91、 to start: \n");</p><p>  printf("***********************************************\n");</p><p><b>  prt(); </b></p><p>  getchar();</p>&

92、lt;p>  run=ready; /*隊(duì)列排好,run指向就緒隊(duì)列隊(duì)首*/</p><p>  ready=ready->next; /*ready指向下一個(gè)進(jìn)程*/</p><p>  run->state='R'; </p><p>  } /*隊(duì)首進(jìn)程的狀態(tài)為就緒*/</p><p>

93、;  void count()</p><p><b>  { </b></p><p>  while(run!=NULL)</p><p><b>  { </b></p><p>  run->cputime=run->cputime+1; /*運(yùn)行一次cpu占用時(shí)間加一*/

94、</p><p>  run->needtime=run->needtime-1; /*運(yùn)行一次要求運(yùn)行時(shí)間減一*/</p><p>  run->count=run->count+1; /*運(yùn)行一次計(jì)數(shù)器加一*/</p><p>  if(run->needtime==0) /*若要求運(yùn)行時(shí)間為0時(shí)*/</p&g

95、t;<p><b>  { </b></p><p>  run->next=finish; /*退出隊(duì)列*/</p><p>  finish=run; /*finish為結(jié)束進(jìn)程的隊(duì)列 */</p><p>  run->state='E';

96、 /*修改狀態(tài)為結(jié)束*/</p><p>  run=NULL; /*釋放run指針*/</p><p>  if (ready!=NULL) /*創(chuàng)建新就緒隊(duì)列的頭指針*/</p><p><b>  {</b></p><p>  run=ready; run->s

97、tate='R'; ready=ready->next; </p><p><b>  } </b></p><p><b>  }</b></p><p><b>  else</b></p><p>  if(run->count==round

98、) /*如果時(shí)間片到*/</p><p><b>  { </b></p><p>  run->count=0; /*計(jì)數(shù)器置0*/</p><p>  if(ready!=NULL) /*如就緒隊(duì)列不空*/</p><p><b>  {</b></p>&l

99、t;p>  run->state='W'; </p><p>  insert(run); /*在進(jìn)程隊(duì)列中重新插入原來(lái)進(jìn)程,插入隊(duì)尾*/</p><p>  run=ready; /*重新置就緒隊(duì)列的頭指針*/</p><p>  run->state='R';</p><p

100、>  ready=ready->next; </p><p><b>  }</b></p><p><b>  }</b></p><p><b>  prt(); </b></p><p><b>  }</b></p>&

101、lt;p><b>  }</b></p><p>  void main()</p><p><b>  { </b></p><p>  printf("Please enter the total number of PCB:\n");</p><p>  scanf(

102、"%d",&N);</p><p>  create(); /*模擬創(chuàng)建進(jìn)程,并輸入相關(guān)信息*/</p><p>  count(); /*優(yōu)先數(shù)調(diào)度算法*/</p><p><b>  }</b></p><p>  2.3.4.測(cè)試結(jié)果及說(shuō)明</p><p>

103、  時(shí)間片輪轉(zhuǎn)調(diào)度算法運(yùn)行情況如圖1,圖2,圖3所示</p><p>  圖1 所有的進(jìn)程都在隊(duì)列中</p><p>  圖2 其中一個(gè)進(jìn)程執(zhí)行完畢 </p><p>  圖4 所有的進(jìn)程都執(zhí)行完畢</p><p>  2.4.多級(jí)反饋隊(duì)列調(diào)度</p><p><b>  2.4.1算法思想</b>

104、;</p><p>  允許進(jìn)程在隊(duì)列之間移動(dòng)。在系統(tǒng)中設(shè)置多個(gè)就緒隊(duì)列,每個(gè)隊(duì)列對(duì)應(yīng)一個(gè)優(yōu)先級(jí),第一個(gè)隊(duì)列的優(yōu)先級(jí)最高,第二隊(duì)列次之。以下各隊(duì)列的優(yōu)先級(jí)逐步低。各就緒隊(duì)列中的進(jìn)程的運(yùn)行時(shí)間片不同,高優(yōu)先級(jí)隊(duì)列的時(shí)間片小,低優(yōu)先級(jí)隊(duì)列的時(shí)間片大。進(jìn)程并非總是固定在某一隊(duì)列中,新進(jìn)程進(jìn)入系統(tǒng)后,被存放在第一個(gè)隊(duì)列的末尾。如果某個(gè)進(jìn)程在規(guī)定的時(shí)間片內(nèi)沒(méi)有完成工作,則把它轉(zhuǎn)入到下一個(gè)隊(duì)列的末尾,直至進(jìn)入最后一個(gè)隊(duì)列。系

105、統(tǒng)先運(yùn)行第一個(gè)隊(duì)列中的進(jìn)程。當(dāng)?shù)谝魂?duì)列為空時(shí),才運(yùn)行第二個(gè)隊(duì)列中的進(jìn)程。依此類推,僅當(dāng)前面所有的隊(duì)列都為空時(shí),才運(yùn)行最后一個(gè)隊(duì)列中的進(jìn)程。當(dāng)處理器正在第i個(gè)隊(duì)列中為某個(gè)進(jìn)程服務(wù)時(shí),又有新進(jìn)程進(jìn)入優(yōu)先級(jí)最高的隊(duì)列(第1—(i-1)中的任何一個(gè)對(duì)列),則此新進(jìn)程要搶占正在運(yùn)行進(jìn)程的處理器,即由調(diào)度程序把正在運(yùn)行的進(jìn)程放回第i隊(duì)列的末尾,把處理器分配給新到的高優(yōu)先級(jí)進(jìn)程。除最低優(yōu)先權(quán)隊(duì)列外的所有其他隊(duì)列,均采用相同的進(jìn)程調(diào)度算法,即按時(shí)間片輪

106、轉(zhuǎn)的FIFO(先進(jìn)先出)算法。最后一個(gè)隊(duì)列中的進(jìn)程按按時(shí)間片輪轉(zhuǎn)或FCFS策略進(jìn)行調(diào)度。它是綜合了FIFO、RR和剝奪式HPF的一種進(jìn)程調(diào)度算法。</p><p>  2.4.2算法流程圖</p><p><b>  2.4.3程序代碼</b></p><p>  #include<stdio.h></p><p

107、>  #include <stdlib.h></p><p>  #include <string.h></p><p>  #define NULL 0</p><p>  typedef struct node</p><p><b>  {</b></p><p&g

108、t;  char name[10]; /*進(jìn)程名*/</p><p>  int num;/*進(jìn)程所在隊(duì)列數(shù),也是該隊(duì)列的時(shí)間片*/</p><p>  int cputime; /*占用cpu時(shí)間*/</p><p>  int needtime; /*要求運(yùn)行時(shí)間*/</p><p>  struct node

109、 *next; /*指針*/</p><p><b>  }PCB;</b></p><p>  PCB *qf1,*ql1;</p><p>  PCB *qf2,*ql2;</p><p>  PCB *qf3,*ql3;//定義三個(gè)隊(duì)列的頭指針和尾指針</p><p>  int blo

110、g1,blog2,blog3;/*分別記錄隊(duì)列1,、隊(duì)列2、隊(duì)列3中進(jìn)程數(shù)*/</p><p>  void insert(PCB *q,PCB *qf,PCB *ql) </p><p><b>  {</b></p><p><b>  q->num++;</b></p><p>  i

111、f(qf==NULL&&ql==NULL)</p><p><b>  { //隊(duì)列為空</b></p><p>  qf=ql=q; </p><p><b>  }</b></p><p><b>  else</b></p><p&g

112、t;<b>  {//隊(duì)列不為空</b></p><p>  ql->next=q;</p><p><b>  ql=q;</b></p><p><b>  }</b></p><p>  ql->next=NULL;</p><p>&

113、lt;b>  }</b></p><p>  void create(int n)</p><p>  {//創(chuàng)建進(jìn)程,剛來(lái)的進(jìn)程都進(jìn)入隊(duì)列1</p><p><b>  PCB *p;</b></p><p>  p=(PCB *)malloc(sizeof(PCB));</p><

114、;p><b>  int i;</b></p><p>  blog1=blog2=blog3=0;//各隊(duì)列中進(jìn)程數(shù)均為0</p><p>  printf("Please enter the name and needtime of PCB:\n"); </p><p>  /*輸入進(jìn)程名和所需時(shí)間*/</

115、p><p>  for(i=0;i<n;i++) </p><p><b>  { </b></p><p>  //p=(PCB *)malloc(sizeof(PCB)); /*為新進(jìn)程開(kāi)辟空間*/</p><p>  scanf("%s

116、",p->name); /*輸入進(jìn)程名*/</p><p>  scanf("%d",&(p->needtime)); /*輸入進(jìn)程要求運(yùn)行時(shí)間*/</p><p>  p->cputime=0;</p><p><b>  p->num=0;</b></p>

117、<p>  insert(p,qf1,ql1);</p><p>  blog1++;//隊(duì)列中進(jìn)程數(shù)加1</p><p><b>  }</b></p><p><b>  }</b></p><p>  int run(PCB *q,PCB *qf,PCB *ql)</p&

118、gt;<p><b>  {</b></p><p>  PCB *p,*f,*l;</p><p>  /*p=(PCB *)malloc(sizeof(PCB));</p><p>  f=(PCB *)malloc(sizeof(PCB));</p><p>  l=(PCB *)malloc(siz

119、eof(PCB));*/</p><p><b>  p=q;</b></p><p><b>  f=qf;</b></p><p><b>  l=ql;</b></p><p>  if(q->needtime<=q->num) /*在時(shí)間片內(nèi)完成*/&

120、lt;/p><p><b>  {</b></p><p>  //q->cputime+=q->needtime;</p><p>  q->needtime=0;</p><p><b>  free(q);</b></p><p><b>  r

121、eturn 0;</b></p><p><b>  }</b></p><p>  else/*不能在時(shí)間片內(nèi)完成*/</p><p><b>  {</b></p><p>  //q->cputime+=q->num;</p><p>  q-

122、>needtime-=q->num;</p><p>  if(q->num<3)</p><p><b>  q->num++;</b></p><p>  insert(p,f,l);//進(jìn)入下一個(gè)隊(duì)列</p><p><b>  return 1;</b><

123、;/p><p><b>  }</b></p><p><b>  }</b></p><p>  void prt() /*輸出函數(shù),可以方便看到進(jìn)程執(zhí)行的演示*/</p><p><b>  {</b></p><p><b>  PCB *

124、p;</b></p><p>  //p=(PCB *)malloc(sizeof(PCB));</p><p><b>  int a;</b></p><p>  printf(" NAME CPUTIME NEEDTIME STATUS\n");</p><p>  w

125、hile(blog1>0||blog2>0||blog3>0)</p><p><b>  {</b></p><p>  if(blog1>0)/*第一個(gè)隊(duì)列不為空*/</p><p><b>  {</b></p><p><b>  p=qf1;</

126、b></p><p>  qf1=qf1->next;</p><p>  p->next=NULL;</p><p><b>  blog1--;</b></p><p>  printf(" %-10s%-10d%\n",p->name,p->needtime);

127、</p><p>  a=run(p,qf2,ql2);</p><p><b>  if(a==1)</b></p><p><b>  blog2++;</b></p><p><b>  }</b></p><p>  else if(blog2&

128、gt;0)/*第二個(gè)隊(duì)列不為空*/</p><p><b>  {</b></p><p><b>  p=qf2;</b></p><p>  qf2=qf2->next;p->next=NULL;</p><p><b>  blog2--;</b></

129、p><p>  printf(" %-10s%-10d%\n",p->name,p->needtime); </p><p>  a=run(p,qf3,ql3);</p><p><b>  if(a==1)</b></p><p><b>  blog3++;</b>

130、;</p><p><b>  }</b></p><p>  else if(blog3>0)/*第三個(gè)隊(duì)列不為空*/</p><p><b>  {</b></p><p><b>  p=qf3;</b></p><p>  qf3=qf3

131、->next;p->next=NULL;</p><p><b>  blog3--;</b></p><p>  printf(" %-10s%-10d%\n",p->name,p->needtime); </p><p>  a=run(p,qf3,ql3);</p><p&

132、gt;<b>  if(a==1)</b></p><p><b>  blog3++;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  } /*使用getchar()函數(shù)可以讓輸出時(shí)停留畫(huà)面,

133、等待人按回車?yán)^續(xù)*/</p><p>  void main()</p><p><b>  {</b></p><p>  qf1=ql1=(PCB *)malloc(sizeof(PCB));</p><p>  qf2=ql2=(PCB *)malloc(sizeof(PCB));</p><p

134、>  qf2=ql2=(PCB *)malloc(sizeof(PCB));</p><p><b>  int n;</b></p><p>  blog1=blog2=blog3=0;</p><p>  printf("請(qǐng)輸入進(jìn)程的個(gè)數(shù): ");</p><p>  scanf("

135、;%d",&n);</p><p>  create(n);</p><p><b>  prt();</b></p><p><b>  }</b></p><p>  2.4.4測(cè)試結(jié)果及說(shuō)明</p><p><b>  2.5.短作業(yè)調(diào)度&l

136、t;/b></p><p>  2.5.1.算法思想</p><p>  短作業(yè)優(yōu)先調(diào)度算法是指對(duì)短作業(yè)進(jìn)行調(diào)度的算法。它從后備隊(duì)列總選擇一個(gè)或若干個(gè)運(yùn)行時(shí)間最短的作業(yè),將他們調(diào)入內(nèi)存運(yùn)行。</p><p>  2.5.2.算法流程圖:</p><p><b>  Y</b></p><p>

137、;<b>  N</b></p><p>  短作業(yè)優(yōu)先算法流程圖</p><p>  2.5.3.程序代碼</p><p>  #include <stdio.h></p><p>  #include <stdlib.h></p><p>  #include <

溫馨提示

  • 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)論