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

下載本文檔

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

文檔簡(jiǎn)介

1、<p>  設(shè)計(jì)題目 操作系統(tǒng)課程設(shè)計(jì) </p><p>  學(xué)生姓名 </p><p>  學(xué) 號(hào) </p><p>  專業(yè)班級(jí) </p><p>  指導(dǎo)教師 </p><p>

2、  2012年 12 月 22 日</p><p><b>  目錄</b></p><p><b>  算法設(shè)計(jì)概述</b></p><p>  1、設(shè)計(jì)背景-------------------------------------------------------------------------1</

3、p><p>  2、運(yùn)行環(huán)境-------------------------------------------------------------------------1</p><p><b>  二、進(jìn)程調(diào)度算法</b></p><p>  1、進(jìn)程并發(fā)執(zhí)行-----------------------------------------

4、-------------------------1</p><p>  2、算法原理及設(shè)計(jì)--------------------------------------------------------------2</p><p>  3、代碼設(shè)計(jì)----------------------------------------------------------------------

5、---3</p><p><b>  三、銀行家算法</b></p><p>  1、進(jìn)程死鎖狀態(tài)-----------------------------------------------------------------13</p><p>  2、算法原理及設(shè)計(jì)-------------------------------------

6、-------------------------13</p><p>  3、代碼設(shè)計(jì)------------------------------------------------------------------------16</p><p><b>  四、頁(yè)面調(diào)度算法</b></p><p>  1、頁(yè)式虛擬存儲(chǔ)---------

7、--------------------------------------------------------20</p><p>  2、算法原理及設(shè)計(jì)--------------------------------------------------------------20</p><p>  3、代碼設(shè)計(jì)-------------------------------------

8、-----------------------------------21</p><p><b>  五、課程設(shè)計(jì)總結(jié)</b></p><p>  1、知識(shí)總結(jié)------------------------------------------------------------------------26</p><p>  2、實(shí)踐感悟-

9、-----------------------------------------------------------------------26</p><p><b>  算法設(shè)計(jì)概述</b></p><p><b>  1、設(shè)計(jì)背景</b></p><p>  操作系統(tǒng)是管理計(jì)算機(jī)硬件資源,控制其他程序運(yùn)行并為用戶提

10、供交互操作界面的系統(tǒng)軟件的集合。操作系統(tǒng)是計(jì)算機(jī)系統(tǒng)的關(guān)鍵組成部分,負(fù)責(zé)管理與配置內(nèi)存、決定系統(tǒng)資源供需的優(yōu)先次序、控制輸入與輸出設(shè)備、操作網(wǎng)絡(luò)與管理文件系統(tǒng)等基本任務(wù)。操作系統(tǒng)作為系統(tǒng)與用戶之間的接口,極大方便了用戶使用操作系統(tǒng),同時(shí)也推動(dòng)了計(jì)算機(jī)科學(xué)的發(fā)展。</p><p>  《操作系統(tǒng)原理》課程設(shè)計(jì)是信息計(jì)算科學(xué)專業(yè)實(shí)踐性環(huán)節(jié)之一,是對(duì)學(xué)習(xí)完《操 作系統(tǒng)原理》 課程后進(jìn)行的一次較全面的

11、綜合訓(xùn)練。 其目的在于加深對(duì)操作系統(tǒng) 的理論、 方法和基礎(chǔ)知識(shí)的理解, 掌握操作系統(tǒng)結(jié)構(gòu)、 實(shí)現(xiàn)機(jī)理和各種典型算法, 系統(tǒng)地了解操作系統(tǒng)的設(shè)計(jì)和實(shí)現(xiàn)思路,培養(yǎng)學(xué)系統(tǒng)設(shè)計(jì)能力, 并了解操作 系統(tǒng)的發(fā)展動(dòng)向和趨勢(shì)。對(duì)以后工作或者進(jìn)一步研究都有促進(jìn)作用。</p><p><b>  2、設(shè)計(jì)環(huán)境</b></p&g

12、t;<p>  開發(fā)環(huán)境:Visual C++ 6.0</p><p>  運(yùn)行環(huán)境:Windows 7 / XP</p><p><b>  進(jìn)程調(diào)度算法</b></p><p><b>  1、進(jìn)程的并發(fā)執(zhí)行</b></p><p>  并發(fā)性是操作系統(tǒng)的重要特征</p>

13、;<p>  在多道程序環(huán)境下,并發(fā)性是指在一段時(shí)間內(nèi)宏觀上有多個(gè)程序在同時(shí)運(yùn)行,但在單處理機(jī)系統(tǒng)中,每一時(shí)刻卻只能有一道程序執(zhí)行,故在微觀上這些程序只能是分時(shí)地交替運(yùn)行。倘若在計(jì)算機(jī)系統(tǒng)有多個(gè)處理機(jī),則這些可以并發(fā)執(zhí)行的程序便可以被分配到多個(gè)處理機(jī)上,實(shí)現(xiàn)執(zhí)行,即利用每個(gè)處理機(jī)來處理一個(gè)可以并發(fā)執(zhí)行的程序,這樣,多個(gè)程序便可同時(shí)執(zhí)行。</p><p>  程序是靜態(tài)實(shí)體,進(jìn)程是動(dòng)態(tài)的,通過對(duì)進(jìn)程調(diào)

14、度實(shí)現(xiàn),實(shí)現(xiàn)程序運(yùn)行。調(diào)度的實(shí)質(zhì)是系統(tǒng)按照某種特定的分配策略來分配資源。進(jìn)程調(diào)度的目的是分配CPU資源。由于進(jìn)程調(diào)度程序執(zhí)行的頻率很高,因此調(diào)度算法的好壞將直接影響到操作系統(tǒng)的性能。本實(shí)驗(yàn)的目的是模擬實(shí)現(xiàn)幾種常見的進(jìn)程調(diào)度算法,通過對(duì)幾組進(jìn)程分別使用不同的調(diào)度算法,計(jì)算進(jìn)程的平均周轉(zhuǎn)時(shí)間和平均帶權(quán)周轉(zhuǎn)時(shí)間,比較各種算法的性能優(yōu)劣。</p><p><b>  2、算法原理及設(shè)計(jì)</b><

15、;/p><p><b> ?。?)進(jìn)程調(diào)度算法</b></p><p>  進(jìn)程調(diào)度算法包括先來先服務(wù)調(diào)度算法、優(yōu)先數(shù)調(diào)度算法、時(shí)間片論轉(zhuǎn)算法和分級(jí)調(diào)度算法等4種。本實(shí)驗(yàn)包括3種算法,有興趣的讀者可以在完成這些算法的基礎(chǔ)上實(shí)現(xiàn)第四種算法。下面對(duì)前3種算法作一一簡(jiǎn)單介紹。</p><p>  <1> 先來先服務(wù)(FCFS)調(diào)度算法<

16、/p><p>  本算法在進(jìn)行調(diào)度時(shí),總是選擇一個(gè)最先進(jìn)入進(jìn)程就緒隊(duì)列的進(jìn)程,把處理器分配給它,使之開始運(yùn)行。該進(jìn)程一直運(yùn)行到完成或發(fā)生阻塞事件時(shí),才放棄處理器。</p><p>  <2> 優(yōu)先數(shù)調(diào)度算法</p><p>  對(duì)每個(gè)進(jìn)程確定一個(gè)優(yōu)先數(shù),進(jìn)程調(diào)度總是讓具有最高優(yōu)先數(shù)的進(jìn)程先使用處理器。如果就緒隊(duì)列中出現(xiàn)優(yōu)先數(shù)相同的進(jìn)程,則對(duì)這些有相同優(yōu)先數(shù)的

17、進(jìn)程采用先來先服務(wù)算法進(jìn)行調(diào)度。</p><p>  對(duì)于占用處理器的進(jìn)程,系統(tǒng)可以使用“搶占式”或“非搶占式”的策略?!胺菗屨际健敝高M(jìn)程一旦占用處理器,除非自己愿意,否則操作系統(tǒng)不能將處理器強(qiáng)行奪走,即使該進(jìn)程的優(yōu)先數(shù)已經(jīng)小于就緒隊(duì)列中的某個(gè)進(jìn)程?!皳屨际健眲t相反,一旦就緒隊(duì)列中的某個(gè)進(jìn)程優(yōu)先數(shù)大于正在執(zhí)行的進(jìn)程,立刻進(jìn)行進(jìn)程切換。</p><p>  進(jìn)程的優(yōu)先數(shù)可以發(fā)生變化。本實(shí)驗(yàn)的

18、基本要求是實(shí)現(xiàn)固定優(yōu)先數(shù)的調(diào)度算法,讀者可以在這個(gè)基礎(chǔ)上添加動(dòng)態(tài)優(yōu)先數(shù)功能。</p><p>  <3> 時(shí)間片輪轉(zhuǎn)調(diào)度算法</p><p>  在需要保證響應(yīng)時(shí)間的場(chǎng)合通常采用時(shí)間片輪轉(zhuǎn)算法來分配處理器。本算法將所有的就緒進(jìn)程按先來先服務(wù)的原則排成一個(gè)隊(duì)列,每次調(diào)度時(shí)把CPU分配給隊(duì)首進(jìn)程,令其執(zhí)行一個(gè)時(shí)間片。時(shí)間片用完,調(diào)度程序自動(dòng)停止該進(jìn)程的執(zhí)行,將它放到進(jìn)程就緒隊(duì)列的末

19、尾,等待下一次執(zhí)行,然后將CPU分配給就緒隊(duì)列中新的隊(duì)首進(jìn)程,也讓它執(zhí)行一個(gè)時(shí)間片。重復(fù)這個(gè)過程,直到所有的進(jìn)程執(zhí)行完畢。</p><p>  (2)衡量算法性能的參數(shù)</p><p>  下面引入兩個(gè)衡量調(diào)度算法性能的參數(shù)。</p><p><b>  平均周轉(zhuǎn)時(shí)間:</b></p><p><b>  平均

20、帶權(quán)周轉(zhuǎn)時(shí)間:</b></p><p><b>  其中:n為進(jìn)程數(shù)目</b></p><p>  Ti為第i個(gè)進(jìn)程的周轉(zhuǎn)時(shí)間,即進(jìn)程從開始運(yùn)行到結(jié)束的時(shí)間</p><p>  Tsi為第i個(gè)進(jìn)程要求執(zhí)行的時(shí)間,即需要在CPU上的執(zhí)行時(shí)間。</p><p><b>  3、代碼設(shè)計(jì)</b>

21、;</p><p>  (1)建立進(jìn)程控制塊</p><p>  進(jìn)程控制塊至少應(yīng)該包括:</p><p><b>  進(jìn)程名稱</b></p><p><b>  進(jìn)程需要執(zhí)行時(shí)間</b></p><p><b>  進(jìn)入就緒隊(duì)列時(shí)間</b></

22、p><p><b>  進(jìn)程執(zhí)行結(jié)束時(shí)間</b></p><p>  (2)就緒進(jìn)程序列如上右表所示</p><p><b>  3、代碼設(shè)計(jì)</b></p><p>  #include<stdio.h> </p><p>  #include<string.

23、h> </p><p>  #include<iostream.h> </p><p>  const int timeslice=5; //定義時(shí)間片的長(zhǎng)度 </p><p>  const int MAXPCB=100; //定義最大進(jìn)程數(shù) </p><p>  //定義進(jìn)程結(jié)構(gòu)體 </p

24、><p>  typedef struct node{ </p><p>  char sNum[4]; //進(jìn)程編號(hào)</p><p>  int ArriveTime; //進(jìn)程到達(dá)時(shí)間</p><p>  int RunTime; //進(jìn)程要求執(zhí)行的時(shí)間</p><p>

25、;  int Privilege; //進(jìn)程的優(yōu)先數(shù)</p><p>  int Finished; //標(biāo)志進(jìn)程是否執(zhí)行完成</p><p>  int Time; //求進(jìn)程的等待時(shí)間的借助變量</p><p>  int WaitTime; //進(jìn)程的等待時(shí)間</p>

26、;<p>  int TurnoverTime; //進(jìn)程的周轉(zhuǎn)時(shí)間</p><p>  float WeighTurnTime; //進(jìn)程的帶權(quán)周轉(zhuǎn)時(shí)間</p><p><b>  }pcb; </b></p><p>  pcb pcbs[MAXPCB]; </p><p>  in

27、t PCBNum; //進(jìn)程數(shù)</p><p>  //PCB初始化函數(shù) </p><p>  void initPCB() </p><p><b>  { </b></p><p><b>  int i; </b></p><

28、;p>  for(i=0;i<MAXPCB;i++)</p><p><b>  { </b></p><p>  strcpy(pcbs[i].sNum,""); </p><p>  pcbs[i].ArriveTime=0; </p><p>  pcbs[i].RunTime=0;

29、 </p><p>  pcbs[i].Privilege=0; </p><p>  pcbs[i].Finished=0;</p><p>  pcbs[i].Time=0; </p><p>  pcbs[i].WaitTime=0;</p><p>  pcbs[i].TurnoverTime=0; &l

30、t;/p><p>  pcbs[i].WeighTurnTime=0;</p><p>  } //for(i=0;i<MAXPCB;i++)</p><p>  PCBNum=0; </p><p>  } //void initPCB()</p><p>  //讀進(jìn)程流文件數(shù)據(jù)函數(shù)</p><

31、;p>  int readData() </p><p><b>  { </b></p><p>  FILE *fp; </p><p>  char sFile[20]; </p><p><b>  int i; </b></p><p>

32、  cout<<"請(qǐng)輸入進(jìn)程流文件名(注意:包括后綴名): "; </p><p>  cin>>sFile; </p><p>  if((fp=fopen(sFile,"r"))==NULL)</p><p><b>  { </b></p><p>

33、;  cout<<"錯(cuò)誤,文件打不開,請(qǐng)檢查文件名"<<endl; </p><p><b>  } </b></p><p><b>  else{ </b></p><p>  while(!feof(fp))</p><p><b>  

34、{ </b></p><p>  fscanf(fp,"%s %d %d %d",pcbs[PCBNum].sNum,&pcbs[PCBNum].ArriveTime,&pcbs[PCBNum].RunTime,&pcbs[PCBNum].Privilege); </p><p>  PCBNum++; </p><

35、;p>  }//while(!feof(fp))</p><p>  //輸出所讀入的數(shù)據(jù) </p><p>  cout<<endl<<"輸出所讀入的數(shù)據(jù):"<<endl<<endl; </p><p>  cout<<"進(jìn)程編號(hào) 進(jìn)程到達(dá)時(shí)間 要求執(zhí)行時(shí)間

36、 優(yōu)先數(shù)"<<endl; </p><p>  for(i=0;i<PCBNum-1;i++)</p><p><b>  { </b></p><p>  cout<<" "<<pcbs[i].sNum<<" "&l

37、t;<pcbs[i].ArriveTime<<" "<<pcbs[i].RunTime<<" "<<pcbs[i].Privilege<<endl; </p><p><b>  } </b></p><p>  retu

38、rn(1); </p><p>  }//if((fp=fopen(sFile,"r"))==NULL)</p><p>  return(0); </p><p>  }// int readData()</p><p>  //重置PCB數(shù)據(jù),以供另一個(gè)算法使用</p><p>  void

39、reInitPCB() </p><p><b>  { </b></p><p><b>  int i; </b></p><p>  for(i=0;i<MAXPCB;i++)</p><p><b>  { </b></p><p> 

40、 pcbs[i].Finished=0; </p><p>  pcbs[i].Time=0;</p><p>  pcbs[i].WaitTime=0;</p><p>  pcbs[i].TurnoverTime=0;</p><p>  pcbs[i].WeighTurnTime=0;</p><p><b

41、>  } </b></p><p>  } //void reInitPCB()</p><p>  //先來先服務(wù)調(diào)度算法</p><p>  void FCFS() </p><p><b>  { </b></p><p><b>  int i; </b&

42、gt;</p><p>  int Total1; </p><p>  float Total2;</p><p>  reInitPCB();//重置PCB數(shù)據(jù),以供另一個(gè)算法使用</p><p>  //輸出先來先服務(wù)調(diào)度算法執(zhí)行流 </p><p>  cout<<endl<<&quo

43、t;---------------------------------------------------------------"<<endl; </p><p>  cout<<"先來先服務(wù)調(diào)度算法執(zhí)行流:"<<endl; </p><p>  cout<<"進(jìn)程編號(hào) 到達(dá)時(shí)間 等待時(shí)間

44、運(yùn)行時(shí)間 周轉(zhuǎn)時(shí)間 帶權(quán)周轉(zhuǎn)時(shí)間"<<endl; </p><p>  pcbs[0].TurnoverTime=pcbs[0].RunTime+pcbs[0].ArriveTime;</p><p>  pcbs[0].WeighTurnTime=(float)pcbs[0].TurnoverTime/pcbs[0].RunTime;</p>&l

45、t;p>  for(i=0;i<PCBNum-1;i++)</p><p><b>  { </b></p><p>  cout<<" "<<pcbs[i].sNum<<" "<<pcbs[i].ArriveTime<<"

46、 "<<pcbs[i].WaitTime <<" "<<pcbs[i].RunTime<<" "<<pcbs[i].TurnoverTime<<" "<<pcbs[i].WeighTurnTime<<endl; <

47、;/p><p>  pcbs[i+1].Time=pcbs[i].Time+pcbs[i].RunTime;</p><p>  pcbs[i+1].WaitTime=pcbs[i+1].Time-pcbs[i+1].ArriveTime;</p><p>  pcbs[i+1].TurnoverTime=pcbs[i+1].WaitTime+pcbs[i+1].Run

48、Time;</p><p>  pcbs[i+1].WeighTurnTime=(float) pcbs[i+1].TurnoverTime/pcbs[i+1].RunTime; </p><p><b>  } </b></p><p>  Total1 = 0;</p><p>  Total2 = 0.0;<

49、;/p><p>  for(i=0;i<PCBNum-1;i++)</p><p><b>  {</b></p><p>  Total1+=pcbs[i].TurnoverTime; </p><p>  Total2+=(float) pcbs[i].TurnoverTime/pcbs[i].RunTime;&l

50、t;/p><p><b>  } </b></p><p>  cout<<" 總周轉(zhuǎn)時(shí)間:"<<Total1<<" 平均周轉(zhuǎn)時(shí)間:"<<Total1/PCBNum<<endl<<" 總帶權(quán)周轉(zhuǎn)時(shí)間:"

51、;<<Total2<<" 平均帶權(quán)周轉(zhuǎn)時(shí)間:"<<Total2/(PCBNum-1)<<endl; </p><p>  cout<<endl<<"---------------------------------------------------------------"<<endl

52、; </p><p>  } //void FCFS()</p><p>  //優(yōu)先數(shù)調(diào)度算法 </p><p>  void privilege()</p><p><b>  { </b></p><p>  int i,j,CurMin; </p><p>  i

53、nt Time=0; </p><p>  int Total1;</p><p>  float Total2;</p><p>  int Queue[MAXPCB]; </p><p>  int CurPriority=1000; </p><p>  reInitPCB();//重置PCB數(shù)據(jù),以供另一個(gè)

54、算法使用</p><p>  for(i=0;i<PCBNum-1;i++) //按優(yōu)先數(shù)遞增排序PCB</p><p><b>  { </b></p><p>  CurPriority=1000; </p><p>  for(j=0;j<PCBNum-1;j++)</p><p&

55、gt;<b>  {</b></p><p>  if((pcbs[j].Finished==0)&&(pcbs[j].Privilege<CurPriority))</p><p><b>  { </b></p><p>  CurMin=j; </p><p>  Cur

56、Priority=pcbs[j].Privilege; </p><p><b>  } </b></p><p>  } //for(j=0;j<PCBNum;j++)</p><p>  Queue[i]=CurMin; </p><p>  pcbs[CurMin].Finished=1; </p>

57、;<p>  pcbs[CurMin].TurnoverTime=pcbs[CurMin].RunTime+Time;</p><p>  pcbs[CurMin].WeighTurnTime=(float)pcbs[CurMin].TurnoverTime/pcbs[CurMin].RunTime;</p><p>  Time+=pcbs[CurMin].RunTime;

58、 </p><p>  }//for(i=0;i<PCBNum;i++) </p><p>  //輸出優(yōu)先數(shù)調(diào)度執(zhí)行流 </p><p>  cout<<endl<<"---------------------------------------------------------------"<<e

59、ndl; </p><p>  cout<<"優(yōu)先數(shù)調(diào)度執(zhí)行流:"<<endl; </p><p>  cout<<"進(jìn)程編號(hào) 優(yōu)先數(shù) 運(yùn)行時(shí)間 周轉(zhuǎn)時(shí)間 帶權(quán)周轉(zhuǎn)時(shí)間"<<endl; </p><p>  for(i=0;i<PCBNum-1;i++)<

60、/p><p><b>  { </b></p><p>  cout<<" "<<pcbs[Queue[i]].sNum<<" "<<pcbs[Queue[i]].Privilege<<" "<<pcbs[Que

61、ue[i]].RunTime<<" "<<pcbs[Queue[i]].TurnoverTime<<" "<<pcbs[Queue[i]].WeighTurnTime<<endl; </p><p><b>  } </b></p><p>

62、  Total1=0; </p><p>  Total2=0.0; </p><p>  for(i=0;i<PCBNum-1;i++)</p><p><b>  {</b></p><p>  Total1+=pcbs[i].TurnoverTime; </p><p>  Total

63、2+=(float) pcbs[i].TurnoverTime/pcbs[i].RunTime;</p><p><b>  } </b></p><p>  cout<<"總周轉(zhuǎn)時(shí)間:"<<Total1<<" 平均周轉(zhuǎn)時(shí)間:"<<Total1/PCBNum&l

64、t;<endl<<" 總帶權(quán)周轉(zhuǎn)時(shí)間:"<<Total2<<" 平均帶權(quán)周轉(zhuǎn)時(shí)間:"<<Total2/(PCBNum-1)<<endl; </p><p>  cout<<endl<<"-----------------------------------

65、----------------------------"<<endl; </p><p>  } //void privilege()</p><p>  //時(shí)間片輪轉(zhuǎn)調(diào)度算法</p><p>  void timer() </p><p><b>  { </b></p

66、><p>  int i,Num,Flag=1; </p><p>  int Round=0; //輪轉(zhuǎn)周期數(shù)</p><p>  int Total=0; //總時(shí)間片數(shù)</p><p>  reInitPCB(); //重置PCB數(shù)據(jù),以供另一個(gè)算法使用</p><p>  cout&

67、lt;<endl<<"---------------------------------------------------------------"<<endl; </p><p>  cout<<"時(shí)間片輪轉(zhuǎn)調(diào)度執(zhí)行流(時(shí)間片的長(zhǎng)度為5秒):"<<endl; </p><p>  while

68、(Flag==1)</p><p><b>  {</b></p><p><b>  Flag=0; </b></p><p><b>  Num=0; </b></p><p>  for(i=0;i<PCBNum-1;i++)//統(tǒng)計(jì)末執(zhí)行完的進(jìn)程數(shù)Num<

69、/p><p><b>  {</b></p><p>  if(pcbs[i].Finished==0)</p><p><b>  { </b></p><p><b>  Num++;</b></p><p>  } //if(pcbs[i].Finis

70、hed==0)</p><p>  } //for(i=0;i<PCBNum;i++)</p><p><b>  if(Num>0)</b></p><p><b>  {</b></p><p><b>  Round++;</b></p><

71、;p>  cout<<endl<<""<<Round<<"輪:";</p><p>  for(i=0;i<PCBNum-1;i++)</p><p><b>  { </b></p><p>  if(pcbs[i].Finished==0)

72、</p><p><b>  { </b></p><p><b>  Flag=1;</b></p><p>  cout<<pcbs[i].sNum<<" ";</p><p><b>  Total++; </b></p&

73、gt;<p>  if(pcbs[i].RunTime<=timeslice*(Round))</p><p><b>  { </b></p><p>  pcbs[i].Finished=1; </p><p>  } //if(pcbs[i].RunTime<=block_time*(Round+1))</

74、p><p>  }//if(pcbs[i].Finished==0) </p><p>  } //for(i=0;i<PCBNum;i++)</p><p>  } //if(Num>0)</p><p>  } //while(Flag==1)</p><p>  cout<<endl<

75、;<"輪轉(zhuǎn)周期數(shù):"<<Round<<"總時(shí)間片數(shù):"<<Total<<endl;</p><p>  cout<<endl<<"---------------------------------------------------------------"<<

76、endl; </p><p>  }//void timer() </p><p>  void SPF() //短進(jìn)程優(yōu)先調(diào)度算法</p><p><b>  { </b></p><p>  reInitPCB();</p><p>  cout<<endl

77、<<"---------------------------------------------------------------"<<endl; </p><p>  cout<<"短進(jìn)程優(yōu)先調(diào)度算法執(zhí)行流:"<<endl; </p><p>  cout<<"進(jìn)程編號(hào)

78、到達(dá)時(shí)間 等待時(shí)間 運(yùn)行時(shí)間 周轉(zhuǎn)時(shí)間 帶權(quán)周轉(zhuǎn)時(shí)間"<<endl; </p><p><b>  int i,j;</b></p><p>  for(i=1;i<PCBNum-1;i++)</p><p><b>  {</b></p><p>  for(j

79、=0;j<PCBNum-i-1;j++)</p><p><b>  {</b></p><p>  if(pcbs[j].RunTime>pcbs[j+1].RunTime)</p><p><b>  {</b></p><p><b>  pcb temp;</b&

80、gt;</p><p>  strcpy(temp.sNum,pcbs[j+1].sNum);</p><p>  temp.ArriveTime=pcbs[j+1].ArriveTime; </p><p>  temp.RunTime=pcbs[j+1].RunTime;</p><p>  temp.Privilege=pcbs[j+1

81、].Privilege;</p><p>  strcpy(pcbs[j+1].sNum,pcbs[j].sNum); </p><p>  pcbs[j+1].ArriveTime=pcbs[j].ArriveTime;</p><p>  pcbs[j+1].RunTime=pcbs[j].RunTime;</p><p>  pcbs[

82、j+1].Privilege=pcbs[j].Privilege;</p><p>  strcpy(pcbs[j+1].sNum,temp.sNum);</p><p>  pcbs[j].ArriveTime=temp.ArriveTime;</p><p>  pcbs[j].RunTime=temp.RunTime;</p><p>

83、  pcbs[j].Privilege=temp.Privilege;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  pcbs[0].Finished=1;</p>&l

84、t;p>  pcbs[0].WaitTime=0;</p><p>  pcbs[0].TurnoverTime=pcbs[0].RunTime+pcbs[0].ArriveTime;</p><p>  pcbs[0].WeighTurnTime=(float)((pcbs[0].TurnoverTime)/(pcbs[0].RunTime));</p><p&

85、gt;  int Total1= pcbs[0].WaitTime;</p><p>  float Total2= 0.0;</p><p>  cout<<" "<<pcbs[0].sNum<<" "<<pcbs[0].ArriveTime<<"

86、 "<<pcbs[0].WaitTime <<" "<<pcbs[0].RunTime<<" "<<pcbs[i].TurnoverTime<<" "<<pcbs[i].WeighTurnTime<<endl;<

87、;/p><p>  for(i=1;i<PCBNum-1;i++)</p><p><b>  {</b></p><p>  pcbs[i].Time+=pcbs[i-1].Time+pcbs[i-1].RunTime;</p><p>  pcbs[i].WaitTime=pcbs[i].Time-pcbs[i].

88、ArriveTime;</p><p>  pcbs[i].TurnoverTime=pcbs[i].WaitTime+pcbs[i].RunTime;</p><p>  Total1+=pcbs[i].TurnoverTime;</p><p>  Total2+=pcbs[i].TurnoverTime/pcbs[i].RunTime;</p>

89、<p>  pcbs[i].Finished=1;</p><p>  cout<<" "<<pcbs[i].sNum<<" "<<pcbs[i].ArriveTime<<" "<<pcbs[i].WaitTime <&l

90、t;" "<<pcbs[i].RunTime<<" "<<pcbs[i].TurnoverTime<<" "<<pcbs[i].WeighTurnTime<<endl;</p><p><b>  }</b><

91、;/p><p>  cout<<"總周轉(zhuǎn)時(shí)間:"<<Total1<<" 平均周轉(zhuǎn)時(shí)間:"<<Total1/(PCBNum-1)<<"總帶權(quán)周轉(zhuǎn)時(shí)間:"<<Total2<<" 平均帶權(quán)周轉(zhuǎn)時(shí)間:"<<Total2/(PCBNum-1)<

92、<endl; </p><p>  cout<<endl<<"---------------------------------------------------------------"<<endl;</p><p>  } //void SPF() </p><p>  void interface

93、()//顯示界面信息</p><p><b>  { </b></p><p>  cout<<endl<<endl; </p><p>  cout<<"▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ "<<endl;</p><p&

94、gt;  cout<<"▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ "<<endl; </p><p>  cout<<"▓▓ ▓▓ "<<endl;</p><p>

95、  cout<<"▓▓ ▓▓ "<<endl;</p><p>  cout<<"▓▓ ★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆ ▓▓ "<<endl;</p><p&g

96、t;  cout<<"▓▓    ☆ ★ ▓▓ "<<endl; </p><p>  cout<<"▓▓ ★  歡迎進(jìn)入進(jìn)程調(diào)度模擬系統(tǒng)  ☆ ▓▓ "<<endl;</p>&l

97、t;p>  cout<<"▓▓ ☆   ★ ▓▓ "<<endl;</p><p>  cout<<"▓▓ ★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆ ▓▓ "<<endl;</p><

98、;p>  cout<<"▓▓ ▓▓ "<<endl;</p><p>  cout<<"▓▓ ▓▓ "<

99、<endl;</p><p>  cout<<"▓▓ ┏━━━━━━━━━━━━━━━━━━┓ ▓▓ "<<endl; </p><p>  cout<<"▓▓ ┃   實(shí)驗(yàn)一:進(jìn)程調(diào)度算法    ┃ ▓▓ "<<endl;

100、</p><p>  cout<<"▓▓ ▓▓ "<<endl;</p><p>  cout<<"▓▓

101、 ▓▓ "<<endl;</p><p>  cout<<"▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ "<<endl;</p><p>  cout<<"▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ "<<endl;</p&g

102、t;<p>  cout<<endl<<endl; </p><p>  } //void interface()</p><p><b>  //主函數(shù) </b></p><p>  void main() </p><p><b>  { </b></

103、p><p>  int Input; </p><p>  bool bGoOn;</p><p>  char sGoOn[1]; </p><p>  interface(); //顯示界面信息</p><p>  initPCB(); //PCB初始化函數(shù)</p><p>  

104、bGoOn= true;</p><p>  strcpy(sGoOn," ");</p><p>  if(readData()==1) //標(biāo)志 讀進(jìn)程流文件數(shù)據(jù)函數(shù) 執(zhí)行是否正確</p><p><b>  {</b></p><p>  while (bGoOn)</p>&

105、lt;p><b>  {</b></p><p>  cout<<endl<<"請(qǐng)選擇進(jìn)程調(diào)度功能,輸入(1 or 2 or 3 or 4)"<<endl<<endl;</p><p>  cout<<"1 先來先服務(wù)(FCFS)算法"<<en

106、dl<<"2 優(yōu)先數(shù)(privilege)調(diào)度算法"<<endl<<"3 時(shí)間片輪轉(zhuǎn)(HRN)調(diào)度算法"<<endl<<"4 短進(jìn)程優(yōu)先(SPF)調(diào)度算法"<<endl;</p><p>  cin>>Input;</p><p>

107、  switch(Input)</p><p><b>  {</b></p><p><b>  case 1:</b></p><p>  FCFS(); //先來先服務(wù)算法</p><p><b>  break;</b></p><p>&

108、lt;b>  case 2:</b></p><p>  privilege();//優(yōu)先數(shù)調(diào)度算法</p><p><b>  break;</b></p><p><b>  case 3:</b></p><p>  timer();//時(shí)間片輪轉(zhuǎn)調(diào)度算法</p&

109、gt;<p><b>  break;</b></p><p><b>  case 4:</b></p><p>  SPF(); //短進(jìn)程優(yōu)先調(diào)度算法</p><p><b>  break;</b></p><p><b>  defa

110、ult:</b></p><p>  printf("\n輸入的算法編號(hào)錯(cuò)誤!!\n");</p><p><b>  break;</b></p><p>  }//switch(Input)</p><p>  bGoOn= false;</p><p>

111、  strcpy(sGoOn," ");</p><p>  cout<<endl;</p><p>  cout<<"要繼續(xù)進(jìn)行進(jìn)程調(diào)度算法模擬嗎?(Y/N)";</p><p>  cin>>sGoOn;</p><p>  bGoOn=(sGoOn[0]

112、=='y'||sGoOn[0]=='Y');</p><p>  }//while bGoOn</p><p>  } //if(readData()==1)</p><p>  }//void main()</p><p><b>  e、運(yùn)行截圖</b></p><

113、p><b>  銀行家算法</b></p><p><b>  1、進(jìn)程死鎖狀態(tài)</b></p><p>  在多道程序系統(tǒng)中,雖然可借助于多個(gè)進(jìn)程的并發(fā)執(zhí)行來改善系統(tǒng)的資源利用率,提高系統(tǒng)的吞吐量,但可能發(fā)生一種危險(xiǎn)——死鎖。所謂死鎖(Deadlock),是指多個(gè)進(jìn)程在運(yùn)行過程中因爭(zhēng)奪資源而造成的一種僵局(DeadlyEmbrace),當(dāng)

114、進(jìn)程處于這種僵持狀態(tài)時(shí),若無外力作用,他們都將無法向前推進(jìn)。</p><p>  具有代表性的避免死鎖的算法,是Djikstra的銀行家算法,這是由于該算法能用于系統(tǒng)現(xiàn)金貸款的發(fā)放而得名的。</p><p><b>  2、算法原理及設(shè)計(jì)</b></p><p> ?。?)銀行家算法思想:對(duì)用戶提出的請(qǐng)求進(jìn)行合法性檢查,即檢查請(qǐng)求的是不大于需要

115、的,是否不大于可利用的。若請(qǐng)求合法,則進(jìn)行試分配。最后對(duì)試分配后的狀態(tài)調(diào)用安全性檢查算法進(jìn)行安全性檢查。若安全,則分配,否則,不分配,恢復(fù)原來狀態(tài),拒絕申請(qǐng)。</p><p> ?。?)銀行家算法數(shù)據(jù)結(jié)構(gòu):</p><p><b> ?。?)銀行家算法</b></p><p>  進(jìn)程i發(fā)出請(qǐng)求申請(qǐng)k個(gè)j資源,Request i[j]=k &l

116、t;/p><p>  a、檢查申請(qǐng)量是否不大于需求量:Request i[j]<=need[i,j],若條件不符重新輸入,不允許申請(qǐng)大于需求量。</p><p>  b、檢查申請(qǐng)量是否小于系統(tǒng)中的可利用資源數(shù)量:Request i[j]<=available[i,j],若條件不符就申請(qǐng)失敗,阻塞該進(jìn)程,用goto語(yǔ)句跳轉(zhuǎn)到重新申請(qǐng)資源。</p><p>  

117、c、若以上兩個(gè)條件都滿足,則系統(tǒng)試探著將資源分配給申請(qǐng)的進(jìn)程,并修改下面數(shù)據(jù)結(jié)構(gòu)中的數(shù)值:</p><p>  Available[i,j]= Available[i,j]- Request i[j];</p><p>  Allocation[i][j]= Allocation[i][j]+ Request i[j];</p><p>  need[i][j]=

118、need[i][j]- Request i[j];</p><p>  d、試分配后,執(zhí)行安全性檢查,調(diào)用safe()函數(shù)檢查此次資源分配后系統(tǒng)是否處于安全狀態(tài)。若安全,才正式將資源分配給進(jìn)程;否則本次試探分配作廢,恢復(fù)原來的資源分配狀態(tài),讓該進(jìn)程等待。</p><p>  e、用do{…}while 循環(huán)語(yǔ)句實(shí)現(xiàn)輸入字符y/n判斷是否繼續(xù)進(jìn)行資源申請(qǐng)。</p><p&

119、gt; ?。?)安全性檢查算法</p><p><b>  a、設(shè)置兩個(gè)向量:</b></p><p>  工作向量Work,它表示系統(tǒng)可提供給進(jìn)程繼續(xù)運(yùn)行所需的各類資源數(shù)目,在執(zhí)行安全性算法開始時(shí),Work= Available。</p><p>  Finish,它表示系統(tǒng)是否有足夠的資源分配給進(jìn)程,使之運(yùn)行完成。開始時(shí)先做Finish[i

120、]=0;當(dāng)有足夠的資源分配給進(jìn)程時(shí),再令Finish[i]=1。</p><p>  b、在進(jìn)程中查找符合以下條件的進(jìn)程:</p><p>  條件1:Finish[i]=0;</p><p>  條件2:need[i][j]<=Work[j]</p><p>  若找到,則執(zhí)行步驟(3)否則,執(zhí)行步驟(4)</p>&l

121、t;p>  c、當(dāng)進(jìn)程獲得資源后,可順利執(zhí)行,直至完成,并釋放出分配給它的資源,故應(yīng)執(zhí)行:</p><p>  Work[j]= Work[j]+ Allocation[i][j];</p><p>  Finish[i]=1;</p><p>  goto step 2;</p><p>  d、如果所有的Finish[i]=1都滿足

122、,則表示系統(tǒng)處于安全狀態(tài),否則,處于不安全狀態(tài)。</p><p>  (5)操作系統(tǒng)銀行家算法流程圖:</p><p><b>  3、代碼設(shè)計(jì)</b></p><p>  #include <iostream.h></p><p>  #include <vector> </p>

123、<p>  #include <iomanip></p><p>  #include <stdlib.h></p><p>  using namespace std; </p><p>  #define TRUE 1 //定義 TRUE =1</p><p>  #define FALS

124、E 0 //定義 FLASE=0</p><p>  void bank(vector<int>,vector<vector<int> >,vector<vector<int> >,int ,int ); //聲明bank(應(yīng)行家算法)</p><p>  in

125、t safe(vector<int> Available,vector<vector<int> > Need,vector<vector<int> > Allocation,int n,int m);//聲明safe()安全性算法</p><p>  void init();</p><p>  /***************

126、**********************主函數(shù)main()**************************************************************/</p><p>  void main()</p><p><b>  {</b></p><p><b>  init();</b>

127、</p><p>  int safe(vector<int> Available,vector<vector<int> > Need,vector<vector<int> > Allocation,int n,int m);</p><p><b>  }</b></p><p> 

128、 /**************************************初始化函數(shù)init()*********************************************************/</p><p>  void init()</p><p><b>  {</b></p><p>  int m; //m

129、資源類數(shù)</p><p>  int n; //進(jìn)程數(shù)</p><p>  system("color 0B");</p><p>  cout<<endl<<endl; </p><p>  cout<<"▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓

130、"<<endl;</p><p>  cout<<"▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ "<<endl; </p><p>  cout<<"▓▓ ▓▓ &qu

131、ot;<<endl;</p><p>  cout<<"▓▓ ▓▓ "<<endl;</p><p>  cout<<"▓▓ ★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆ ▓▓ &

132、quot;<<endl;</p><p>  cout<<"▓▓    ☆ ★ ▓▓ "<<endl; </p><p>  cout<<"▓▓ ★  歡迎進(jìn)入銀行家算法調(diào)度系統(tǒng)  ☆

133、▓▓ "<<endl;</p><p>  cout<<"▓▓ ☆   ★ ▓▓ "<<endl;</p><p>  cout<<"▓▓ ★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆ ▓

134、▓ "<<endl;</p><p>  cout<<"▓▓ ▓▓ "<<endl;</p><p>  cout<<"▓▓

135、 ▓▓ "<<endl;</p><p>  cout<<"▓▓ ┏━━━━━━━━━━━━━━━━━━┓ ▓▓ "<<endl; </p><p>  cout<<"▓▓ ┃     實(shí)驗(yàn)二:銀行家算法

136、   ┃ ▓▓ "<<endl; </p><p>  cout<<"▓▓ ┃     作者:學(xué)習(xí) ┃ ▓▓ "<<endl; </p><p>  cout<<"▓▓ ┃     2012.12.16

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論