os課程設計---模擬處理機調度算法mfc實現(xiàn)_第1頁
已閱讀1頁,還剩21頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、<p><b>  課程設計報告</b></p><p>  設計題目:處理機調度算法模擬實現(xiàn)</p><p>  班級 : </p><p><b>  學號: </b></p><p><b>  姓名:</b></p>&

2、lt;p><b>  指導老師:</b></p><p>  設計時間:2012年八月</p><p><b>  摘要</b></p><p><b>  1、主要算法包括:</b></p><p>  先來先服務、短作業(yè)優(yōu)先、高優(yōu)先權優(yōu)先、基于時間片的輪轉、

3、多級反饋隊列調度算法。</p><p><b>  2、內容要求:</b></p><p>  1)定義與算法相關的數(shù)據(jù)結構,如進程控制塊(PCB),相關隊列(隊列要考慮實際應用,應采用類似于類的私有成員定義所用到的隊列,并使用公有函數(shù)提供對類的操作);</p><p>  2)所設計的系統(tǒng)中至少需要實現(xiàn)三種以上調度算法,且必須包含多級反饋隊列

4、調度算法;</p><p>  3)提供用戶選擇功能,用戶可以根據(jù)需要選擇采用何種調度算法;</p><p>  4)算法執(zhí)行結構之后,應該給出周轉時間和平均周轉時間。</p><p>  本系統(tǒng)模擬操作系統(tǒng)處理機調度算法的實現(xiàn),實現(xiàn)了先來先服務、短作業(yè)優(yōu)先、</p><p>  基于時間片的輪轉、多級反饋隊列調度算法四種調度算法的模擬實現(xiàn),

5、可以根據(jù)需要自行選擇合適的調度算法,進程用PCB來控制,隊列由PCB相鏈接而成,分為就緒隊列,阻塞隊列,完成隊列。進程在在運行時可以隨時掛起暫停進程執(zhí)行,待條件滿足后,繼續(xù)恢復運行,進程在運行的時候優(yōu)先權是不斷的變化的,</p><p>  運行的時間越長,優(yōu)先級會相應減小。</p><p>  關鍵詞:先來先服務,短作業(yè)優(yōu)先,高優(yōu)先權優(yōu)先,基于時間片的輪轉,</p><

6、;p>  多級反饋隊列調度算法。</p><p><b>  目錄</b></p><p>  1. 概述 ……………………….4</p><p>  2. 課程設計任務及要求</p><p>  2.1 設計任務 ………………………..4</p><p>

7、;  2.2 設計要求 ………………………..4</p><p>  3. 算法及數(shù)據(jù)結構</p><p>  3.1算法的總體思想(流程)………………………5</p><p>  3.2 PCB模塊</p><p>  3.2.1 功能(運算)……………………….5</p><p&

8、gt;  3.2.2 數(shù)據(jù)結構(存儲結構)……………………….5</p><p>  3.2.3 算法(實現(xiàn))……………………….5</p><p>  3.3 進程隊列模塊</p><p>  3.3.1功能………………………6</p><p>  3.3.2 數(shù)據(jù)結構………………………6</p>

9、;<p>  3.3.3算法………………………6</p><p>  4. 程序設計與實現(xiàn)</p><p>  4.1 程序流程圖……………………..7</p><p>  4.2 程序說明(代碼)</p><p>  4.3 實驗結果……………………..10</p>

10、;<p>  5. 結論……………………..11</p><p>  6. 參考文獻?!?.11</p><p>  7. 收獲、體會和建議。……………………..11</p><p><b>  一:概述</b></p><p>  定義與算法相關

11、的數(shù)據(jù)結構,模擬操作系統(tǒng)處理機調度算法的實現(xiàn),至少實現(xiàn)3種以上算法,且必須包含多級反饋隊列調度算法;提供用戶選擇功能,用戶可以根據(jù)需要選擇采用何種調度算法;算法執(zhí)行結構之后,應該給出周轉時間和平均周轉時間。</p><p>  二:課程設計任務及要求</p><p><b>  設計任務:</b></p><p>  使用Visual C++

12、模擬實現(xiàn)處理機調度算法,實現(xiàn)先來先服務、短作業(yè)優(yōu)先、基于時間片的輪轉、多級反饋隊列調度算法。</p><p><b>  設計要求:</b></p><p>  所設計的系統(tǒng)中至少需要實現(xiàn)三種以上調度算法,且必須包含多級反饋隊列調度算法;提供用戶選擇功能,用戶可以根據(jù)需要選擇采用何種調度算法;</p><p>  算法執(zhí)行結構之后,應該給出周轉

13、時間和平均周轉時間。</p><p><b>  三:算法及數(shù)據(jù)結構</b></p><p>  進程控制塊數(shù)據(jù)結構和相應的操作。</p><p><b>  class PCB</b></p><p><b>  {</b></p><p><b

14、>  public:</b></p><p>  PCB(void);</p><p>  PCB(PCB &);</p><p>  void Creat(CString ,int );</p><p>  ~PCB(void);</p><p>  void Update();

15、//剩余時間與運行時間更新</p><p>  CString ShowPro();//返回進程信息</p><p>  bool IsEnd();//判斷進行是否執(zhí)行完成</p><p>  void Dispose();//鎖定進程</p><p>  bool IsLocked();

16、//判斷進程是否鎖住</p><p>  void Terminal();//強制終止進程函數(shù)</p><p>  int GetServiceT();//獲得需要服務時間</p><p>  float GetPrio();//返回進程優(yōu)先級</p><p>  CString GetCurTi

17、me();//返回當前系統(tǒng)時間</p><p>  CString GetName();//獲取進程名稱</p><p>  void UpdateGoneTime();//更新進程周轉時間</p><p>  int GetGoneTime();//返回進程周轉時間</p><p>  int GetRun

18、ingTime();//返回進程運行時間</p><p><b>  private:</b></p><p>  CString Name;//進程名稱</p><p>  CString Start;//創(chuàng)建時間</p><p>  int ServiceT;//需要

19、服務時間</p><p>  int RunningT;//已運行時間</p><p>  int RemainT;//剩余時間</p><p>  int GoneTime;//消逝時間 || 周轉時間</p><p>  int ID;//進程標識符</p>

20、<p>  CString ReadyTime;//進程成為就緒進程的時間</p><p>  float prio;//進程優(yōu)先權</p><p>  int Locked;//進程鎖</p><p>  static int count ; //計數(shù)<

21、/p><p><b>  };</b></p><p>  #include "StdAfx.h"</p><p>  #include "PCB.h"</p><p>  int PCB::count =0;</p><p>  PCB::PCB(void)&

22、lt;/p><p><b>  {</b></p><p>  RemainT=0;//標志對象初始化時沒有值,相當于為空!</p><p><b>  Locked=1;</b></p><p>  GoneTime=0;</p><p><b>  }<

23、/b></p><p>  PCB::PCB(PCB &data)</p><p><b>  {</b></p><p>  Name=data.Name;</p><p>  Start=data.Start;</p><p>  ServiceT=data.ServiceT;&

24、lt;/p><p>  RunningT=data.RunningT;</p><p>  RemainT=data.RemainT;</p><p>  ID=data.ID;</p><p>  ReadyTime=data.ReadyTime;</p><p>  prio=data.prio;</p>

25、<p>  GoneTime=data.GoneTime;</p><p>  Locked=0;//解鎖</p><p><b>  }</b></p><p>  PCB::~PCB(void)</p><p><b>  {</b></p><p>&l

26、t;b>  }</b></p><p>  CString PCB::GetName()</p><p><b>  {</b></p><p>  return Name;</p><p><b>  }</b></p><p>  CString PCB

27、::GetCurTime()</p><p><b>  {</b></p><p>  if (Locked==1)</p><p><b>  {</b></p><p>  return "";</p><p><b>  }</b&

28、gt;</p><p>  //(CTime::GetCurrentTime()).Format("%H:%M:%S")</p><p>  SYSTEMTIME TM;</p><p>  ::GetSystemTime(&TM);</p><p>  CString tmp;</p><p&

29、gt;  tmp.Format(" %d:%d:%d"</p><p>  ,(8+TM.wHour)%24,TM.wMinute,TM.wSecond);</p><p>  return tmp;</p><p><b>  }</b></p><p>  int PCB::GetServiceT

30、()</p><p><b>  {</b></p><p>  return ServiceT;</p><p><b>  }</b></p><p>  float PCB::GetPrio()</p><p><b>  {</b></p&

31、gt;<p>  return prio;</p><p><b>  }</b></p><p>  void PCB::Creat(CString name , int needtime)</p><p><b>  {</b></p><p>  Locked=0;/

32、/默認為鎖定Locked==1,創(chuàng)建需解鎖!</p><p>  Name = name;</p><p>  Start = GetCurTime();</p><p>  ServiceT = needtime;</p><p>  RunningT=0;</p><p>  RemainT=needtime;&l

33、t;/p><p><b>  ID=count;</b></p><p><b>  count++;</b></p><p>  if (count>100)</p><p><b>  {</b></p><p><b>  count=

34、0;</b></p><p><b>  }</b></p><p>  ReadyTime=GetCurTime();</p><p>  GoneTime=0;</p><p>  prio =(float)RemainT/ ServiceT;</p><p><b> 

35、 }</b></p><p>  void PCB::UpdateGoneTime()</p><p><b>  {</b></p><p>  if (Locked==1)</p><p><b>  {</b></p><p><b>  retu

36、rn ;</b></p><p><b>  }</b></p><p>  GoneTime++;</p><p><b>  }</b></p><p>  void PCB::Update()</p><p><b>  {</b>&l

37、t;/p><p>  if (Locked==1)</p><p><b>  {</b></p><p><b>  return ;</b></p><p><b>  }</b></p><p>  RunningT++;</p><

38、;p>  if (RemainT>0)</p><p><b>  {</b></p><p>  RemainT--;</p><p><b>  }</b></p><p>  prio =(float) RemainT/ ServiceT;</p><p>

39、<b>  }</b></p><p>  void PCB::Dispose()</p><p><b>  {</b></p><p><b>  Locked=1;</b></p><p><b>  }</b></p><p&g

40、t;  CString PCB::ShowPro()</p><p><b>  {</b></p><p>  if (Locked==1)</p><p><b>  {</b></p><p>  return "";</p><p><b&g

41、t;  }</b></p><p>  CString tmp ;</p><p>  tmp.Format("進程名:%s,進程ID:%d,創(chuàng)建時間:%s,需要時間:%d,已運行時間:%d,剩余時間:%d,優(yōu)先權:%f",Name,ID,ReadyTime,ServiceT,RunningT,RemainT,prio);</p><p&

42、gt;  return tmp;</p><p><b>  }</b></p><p>  bool PCB::IsEnd()</p><p><b>  {</b></p><p>  if (RemainT<=0)</p><p><b>  {<

43、/b></p><p>  return true;</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  return false;</p>

44、<p><b>  }</b></p><p><b>  }</b></p><p>  bool PCB::IsLocked()</p><p><b>  {</b></p><p>  if (Locked==1)</p><p> 

45、 return true;</p><p><b>  else</b></p><p>  return false;</p><p><b>  }</b></p><p>  void PCB::Terminal()</p><p><b>  {</b

46、></p><p>  RemainT=0;</p><p><b>  }</b></p><p>  int PCB::GetGoneTime()</p><p><b>  {</b></p><p>  return GoneTime;</p>&

47、lt;p><b>  }</b></p><p>  int PCB::GetRuningTime()</p><p><b>  {</b></p><p>  return RunningT;</p><p><b>  }</b></p><p&

48、gt;<b>  進程隊列的數(shù)據(jù)結構</b></p><p>  struct Node</p><p><b>  {</b></p><p><b>  PCB Data;</b></p><p>  Node *next;</p><p><

49、;b>  };</b></p><p>  class Queue</p><p><b>  {</b></p><p><b>  public:</b></p><p><b>  Queue();</b></p><p><

50、;b>  ~Queue();</b></p><p>  bool IsEmpty();//判斷隊列是否為空</p><p>  void Enqueue(PCB );//進程入隊</p><p>  void Dequeue();//進程出隊</p><p>  int GetLe

51、ngth();//獲取隊列進程數(shù)</p><p>  CString Print();//遍歷進程信息</p><p>  void Update();//進程時間更新</p><p>  void UpdateGoneTime();//更新隊列中進程周轉時間</p><p>  PCB

52、 GetFirst();//獲取隊列中第一個進程</p><p>  void LeastFirst();//按進程服務時間排序隊列void Clear();//隊列刪除</p><p>  CString GetGoneTime();//返回進程周轉時間</p><p>  Node *GetFirstPt

53、r();//獲取隊列頭指針</p><p><b>  private:</b></p><p>  Node *first;</p><p><b>  };</b></p><p>  #include "StdAfx.h"</p><p>

54、;  #include "Queue.h"</p><p>  Queue::Queue()</p><p><b>  {</b></p><p>  first = new Node;</p><p>  first->next =NULL;</p><p><

55、b>  }</b></p><p>  Queue::~Queue()</p><p><b>  {</b></p><p><b>  }</b></p><p>  //template <typename T></p><p>  boo

56、l Queue::IsEmpty()</p><p><b>  {</b></p><p>  if (first->next == NULL)</p><p>  return true;</p><p><b>  else</b></p><p>  retur

57、n false;</p><p><b>  }</b></p><p>  //template <typename T></p><p>  void Queue::Enqueue(PCB data)</p><p><b>  {</b></p><p> 

58、 Node *s = new Node;</p><p>  s->Data =data;</p><p>  Node *p; //work Ptr</p><p>  p = first;</p><p>  while(p->next)</p><p><b>  {</b>

59、</p><p>  p=p->next;</p><p><b>  }</b></p><p>  p->next =s;</p><p>  s->next =NULL;</p><p><b>  }</b></p><p>

60、  //template <typename T></p><p>  void Queue::Dequeue()</p><p><b>  {</b></p><p>  first->next = first->next->next;</p><p><b>  }</

61、b></p><p>  int Queue::GetLength()</p><p><b>  {</b></p><p>  int count =0;</p><p>  Node *p =first->next;</p><p><b>  while(p)<

62、/b></p><p><b>  {</b></p><p><b>  count++;</b></p><p>  p=p->next;</p><p><b>  }</b></p><p>  return count;</p

63、><p><b>  }</b></p><p>  CString Queue::Print()</p><p><b>  {</b></p><p>  Node *p=first;</p><p>  int n =GetLength();</p><

64、p>  CString tmp ="";</p><p>  for (int i=0;i<n;i++)</p><p><b>  {</b></p><p>  tmp+=p->next->Data.ShowPro();</p><p>  tmp+="\r\n&

65、quot;;</p><p>  p=p->next;</p><p><b>  }</b></p><p>  return tmp;</p><p><b>  }</b></p><p>  PCB Queue::GetFirst()</p>&l

66、t;p><b>  {</b></p><p>  PCB tmp = first->next->Data;</p><p>  Dequeue();</p><p>  return tmp;</p><p><b>  }</b></p><p>  v

67、oid Queue::Update()</p><p><b>  {</b></p><p>  Node *p =first->next;</p><p><b>  while(p)</b></p><p><b>  {</b></p><p&

68、gt;  p->Data.Update();</p><p>  p=p->next;</p><p><b>  }</b></p><p><b>  }</b></p><p>  void Queue::UpdateGoneTime()</p><p>&

69、lt;b>  {</b></p><p>  Node *p =first->next;</p><p><b>  while(p)</b></p><p><b>  {</b></p><p>  p->Data.UpdateGoneTime();</p&g

70、t;<p>  p=p->next;</p><p><b>  }</b></p><p><b>  }</b></p><p>  void Queue::LeastFirst()</p><p><b>  {</b></p><

71、p>  Node *p=NULL;</p><p>  Node *q=NULL;</p><p>  if(first->next==NULL)</p><p><b>  {</b></p><p><b>  return;</b></p><p><

72、b>  }</b></p><p>  for(p=first->next;p->next;p=p->next)</p><p>  for (q=p->next;q;q=q->next)</p><p><b>  {</b></p><p>  if (p->Da

73、ta.GetServiceT()>q->Data.GetServiceT())</p><p><b>  {</b></p><p><b>  PCB tmp;</b></p><p>  tmp=p->Data;</p><p>  p->Data=q->Data

74、;</p><p>  q->Data=tmp;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  void Queue::HighPrio()</p&

75、gt;<p><b>  {</b></p><p>  Node *p=NULL;</p><p>  Node *q=NULL;</p><p>  for(p=first->next;p->next;p=p->next)</p><p>  for (q=p->next;q;q

76、=q->next)</p><p><b>  {</b></p><p>  if (p->Data.GetPrio()>q->Data.GetPrio())</p><p><b>  {</b></p><p><b>  PCB tmp;</b>

77、</p><p>  tmp=p->Data;</p><p>  p->Data=q->Data;</p><p>  q->Data=tmp;</p><p><b>  }</b></p><p><b>  }</b></p>&

78、lt;p><b>  }</b></p><p>  void Queue::Clear()</p><p><b>  {</b></p><p>  while(first->next!=NULL)</p><p><b>  {</b></p>

79、<p>  Node *tmp=first->next;</p><p>  first->next=tmp->next;</p><p>  delete tmp;</p><p><b>  }</b></p><p><b>  }</b></p>&

80、lt;p>  CString Queue::GetGoneTime()</p><p><b>  {</b></p><p>  CString tmp;</p><p>  CString Ret;</p><p>  Node *p =first->next;</p><p> 

81、 int time=0;</p><p><b>  while(p)</b></p><p><b>  {</b></p><p>  tmp.Format("進程名:%s,周轉時間:%d\r\n",p->Data.GetName(),p->Data.GetGoneTime());<

82、;/p><p>  time+=p->Data.GetGoneTime();</p><p><b>  Ret+=tmp;</b></p><p>  p=p->next;</p><p><b>  }</b></p><p>  tmp.Format("

83、;平均周轉時間:%.2f",(float)(time/GetLength()));</p><p><b>  Ret+=tmp;</b></p><p>  return Ret;</p><p><b>  }</b></p><p>  Node* Queue::GetFirstPt

84、r()</p><p><b>  {</b></p><p>  return first;</p><p><b>  }</b></p><p>  四:程序設計與實現(xiàn)。</p><p><b>  流程圖</b></p><p

85、><b>  實驗結果:</b></p><p>  五:收獲,體會和建議</p><p>  本次課程設計讓我更加深刻的理解了操作系統(tǒng)的處理機調度算法,對進程間的調度有了較為深刻的看法,加強了對教材的理解,并且?guī)椭约簭土暳薓FC的有關知識,對C++也能更加熟練的使用。本次實驗讓我自己再次認識到動手實驗的重要性,理論研究的再透徹,也必須通過實踐來引導,只有不斷

86、動手做實驗,才能加強對程序設計的理解,多動手才能積累經(jīng)驗,平時遇到的錯誤耐心查找資料一個個解決,下一次再遇到時能夠輕松解決,在以后的學習過程中,一定要加強自己的動手能力,充分利用自己手頭的資源,養(yǎng)成多動手寫代碼的好習慣。</p><p>  六:參考資料和書籍。</p><p>  《MFC程序設計》 -----Jeff Prosise</p><p>  《操

溫馨提示

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

評論

0/150

提交評論