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

下載本文檔

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

文檔簡介

1、<p><b>  課程設(shè)計報告</b></p><p>  設(shè)計題目:內(nèi)存的連續(xù)分配算法</p><p><b>  班級 : </b></p><p><b>  學(xué)號: </b></p><p><b>  姓名:</b&g

2、t;</p><p><b>  指導(dǎo)老師:</b></p><p>  設(shè)計時間:2012年8月</p><p><b>  摘要</b></p><p><b>  主要算法包括:</b></p><p>  固定分區(qū)分配、動態(tài)分區(qū)分配、伙

3、伴算法、可重定位分區(qū)分配。</p><p><b>  2、內(nèi)容要求:</b></p><p>  1)定義與算法相關(guān)的數(shù)據(jù)結(jié)構(gòu),如PCB,空閑分區(qū)表;</p><p>  2)至少實現(xiàn)兩種以上分配算法,且用戶可以選擇在某次執(zhí)行過程中使用何種算法;</p><p>  3)在使用動態(tài)分區(qū)分配或可重定位分區(qū)分配算法時必須實

4、現(xiàn)緊湊和對換功能;</p><p>  4)動態(tài)分區(qū)分配和可重定位分區(qū)分配必選一個實現(xiàn)。</p><p>  本系統(tǒng)模擬了操作系統(tǒng)內(nèi)存分配算法的實現(xiàn),實現(xiàn)了固定分區(qū)分配和動態(tài)分區(qū)分配,以及可重定位分區(qū)分配算法,采用PCB定義結(jié)構(gòu)體來表示一個進程,定義了進程的名稱和大小,進程內(nèi)存起始地址和進程狀態(tài)。內(nèi)存分區(qū)表采用單鏈表來模擬實現(xiàn)。</p><p>  關(guān)鍵詞:固定分區(qū)

5、分配、動態(tài)分區(qū)分配、可重定位分區(qū)分配。</p><p><b>  目錄</b></p><p>  1. 概述 ……………………….4</p><p>  2. 課程設(shè)計任務(wù)及要求</p><p>  2.1 設(shè)計任務(wù) ………………………..4</p><p>

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

7、gt;  3.2.2 數(shù)據(jù)結(jié)構(gòu)(存儲結(jié)構(gòu))……………………….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ù)結(jié)構(gòu)………………………6</p>

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

9、<p>  5. 結(jié)論……………………..10</p><p>  6. 參考文獻?!?.10</p><p>  7. 收獲、體會和建議?!?.10</p><p><b>  一:概述</b></p><p>  本系統(tǒng)模擬了操作

10、系統(tǒng)內(nèi)存分配算法的實現(xiàn),實現(xiàn)了固定分區(qū)分配和動態(tài)分區(qū)分配,以及可重定位分區(qū)分配算法,采用PCB定義結(jié)構(gòu)體來表示一個進程,定義了進程的名稱和大小,進程內(nèi)存起始地址和進程狀態(tài)。內(nèi)存分區(qū)表采用單鏈表來模擬實現(xiàn)。</p><p>  固定分區(qū)實現(xiàn)就是將單鏈表的每個節(jié)點的大小設(shè)為固定大小,系統(tǒng)默認(rèn)如果按固定分區(qū)分配的話,只能分成20個相等大小的分區(qū),因此系統(tǒng)只能最多運行20個進程。</p><p>

11、  動態(tài)分區(qū)的實現(xiàn)是根據(jù)進程所申請的內(nèi)存大小來決定動態(tài)的有系統(tǒng)進行分配內(nèi)存空間大小,因此分區(qū)表里的空閑分區(qū)個數(shù)是不定的,根據(jù)進程數(shù)和進程大小決定的。</p><p>  可重定位分區(qū)算法比動態(tài)分區(qū)算法增加了緊湊和進程對換的功能。</p><p>  二:課程設(shè)計任務(wù)及要求</p><p><b>  設(shè)計任務(wù):</b></p>&

12、lt;p>  使用C++ MFC實現(xiàn)模擬操作系統(tǒng)內(nèi)存分配算法的實現(xiàn),定義結(jié)構(gòu)體數(shù)據(jù)結(jié)構(gòu)表示進程,定義單鏈表表示內(nèi)存分區(qū)表。</p><p><b>  設(shè)計要求:</b></p><p>  定義與算法相關(guān)的數(shù)據(jù)結(jié)構(gòu),如PCB,空閑分區(qū)表;</p><p>  至少實現(xiàn)兩種以上分配算法,且用戶可以選擇在某次執(zhí)行過程中使用何種算法;<

13、/p><p>  在使用動態(tài)分區(qū)分配或可重定位分區(qū)分配算法時必須實現(xiàn)緊湊和對換功能;</p><p>  動態(tài)分區(qū)分配和可重定位分區(qū)分配必選一個實現(xiàn)。</p><p><b>  三:算法及數(shù)據(jù)結(jié)構(gòu)</b></p><p>  #define free 0//表示進程狀態(tài)空閑</p><p> 

14、 #define busy 1//表示進程狀態(tài)忙</p><p>  typedef int Status;//表示進程狀態(tài)</p><p>  struct PCB//表示進程PCB結(jié)構(gòu)體</p><p><b>  {</b></p><p>  CString name;//進程name&l

15、t;/p><p>  Status status;//進程狀態(tài)busy or free</p><p>  int lStartAddres;//進程起始地址</p><p>  int Size;//進程大小</p><p><b>  };</b></p><p>  st

16、ruct Node//表示組成鏈表的結(jié)點結(jié)構(gòu)體</p><p><b>  {</b></p><p><b>  PCB data;</b></p><p>  Node *next;</p><p><b>  };</b></p><p>

17、;  class Queue//表示分區(qū)表的單鏈表類</p><p><b>  {</b></p><p><b>  public:</b></p><p><b>  Queue();</b></p><p>  ~Queue(){}</p>&

18、lt;p>  //void Show();//內(nèi)存區(qū)分配情況顯示</p><p>  int GetLength();</p><p>  int GetAllFree();//獲得所有空閑分區(qū)總大小</p><p>  void InitialMemory(int );//初始化內(nèi)存區(qū)域大小</p>&

19、lt;p>  void FixedPartitonAlloc();//固定分區(qū)分配初始化空閑內(nèi)存鏈表</p><p>  bool AllocProFixed(CString ,int );//為進程分配內(nèi)存(執(zhí)行固定分區(qū)分配算法)</p><p>  bool AllocProDynamic(CString ,int );//為進程分配內(nèi)存(動態(tài)分區(qū)分配)<

20、;/p><p>  boolFreeMemory(CString );//釋放進程內(nèi)存</p><p>  bool AllMerge(int );//內(nèi)存緊湊分區(qū)算法</p><p>  bool Swaping(int ,PCB&);//進程對換算法</p><p>  Node *GetFirst

21、();//返回頭結(jié)點</p><p>  void Clear();//鏈表節(jié)點清除</p><p><b>  private:</b></p><p>  Node *first;</p><p><b>  };</b></p><p&g

22、t;  #include "StdAfx.h"</p><p>  #include "Queue.h"</p><p>  Queue::Queue()</p><p><b>  {</b></p><p><b>  //默認(rèn)頭結(jié)點數(shù)據(jù)</b></

23、p><p>  first = new Node;</p><p>  first->data.lStartAddres=0;</p><p>  first->data.name="";</p><p>  first->data.Size=0;</p><p>  first-&g

24、t;data.status=busy;</p><p>  first->next=NULL;</p><p><b>  }</b></p><p>  int Queue::GetLength()</p><p><b>  {</b></p><p><b&

25、gt;  int n=0;</b></p><p>  Node *p=first;</p><p>  while(p->next)</p><p><b>  {</b></p><p>  p=p->next;</p><p><b>  n++;</

26、b></p><p><b>  }</b></p><p><b>  return n;</b></p><p><b>  }</b></p><p>  Node *Queue::GetFirst()</p><p><b>  

27、{</b></p><p>  return first;</p><p><b>  }</b></p><p>  int Queue::GetAllFree()</p><p><b>  {</b></p><p><b>  int n=0;&

28、lt;/b></p><p>  Node *p=first;</p><p>  while(p->next)</p><p><b>  {</b></p><p>  p=p->next;</p><p>  if (p->data.status==free)<

29、/p><p><b>  {</b></p><p>  n+=p->data.Size;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  return n;</b>&l

30、t;/p><p><b>  }</b></p><p>  //void Queue::Show()</p><p><b>  //{</b></p><p>  //Node *p=first;</p><p>  //while(p->next)</p&g

31、t;<p><b>  //{</b></p><p>  //p=p->next;</p><p>  //cout<<"分區(qū)號:"<<p->data.name<<endl;</p><p>  //cout<<"分區(qū)狀態(tài):&

32、quot;<<(p->data.status==busy ?"busy":"free")<<endl;</p><p>  //cout<<"分區(qū)起始地址:"<<p->data.lStartAddres<<endl;</p><p>  //cout&

33、lt;<"分區(qū)大小:"<<p->data.Size<<endl;</p><p>  //cout<<"--------------------------------\n";</p><p><b>  //}</b></p><p><b&g

34、t;  //}</b></p><p>  void Queue::InitialMemory(int i)</p><p><b>  {</b></p><p><b>  PCB tmp;</b></p><p>  tmp.name="";</p>

35、<p>  tmp.status=free;</p><p>  tmp.lStartAddres=0;</p><p>  tmp.Size=i;</p><p>  Node *s=new Node;</p><p>  s->data=tmp;</p><p>  first->next

36、=s;</p><p>  s->next=NULL;</p><p><b>  }</b></p><p>  void Queue::Clear()</p><p><b>  {</b></p><p><b>  Node *q;</b>

37、</p><p>  Node *p=first->next;</p><p>  while(p->next)</p><p><b>  {</b></p><p><b>  q=p;</b></p><p>  p=p->next;</p>

38、;<p><b>  delete q;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  void Queue::FixedPartitonAlloc()</p><p><b>  {<

39、/b></p><p><b>  PCB tmp;</b></p><p>  int AllSize=first->next->data.Size;</p><p>  int perSize=AllSize/20;</p><p>  first->next->data.Size=pe

40、rSize;</p><p>  Node *p= first;</p><p>  for (int i=1;i<20;i++)</p><p><b>  {</b></p><p>  while(p->next)</p><p><b>  {</b>&l

41、t;/p><p>  p=p->next;</p><p><b>  }</b></p><p>  tmp.name="";</p><p>  tmp.status=free;</p><p>  tmp.lStartAddres=i*perSize+1;</p&

42、gt;<p>  tmp.Size=perSize;</p><p>  Node *s= new Node;</p><p>  s->data=tmp;</p><p>  p->next=s;</p><p>  s->next=NULL;</p><p><b>  }

43、</b></p><p><b>  }</b></p><p>  bool Queue::AllocProFixed(CString _name,int _size)</p><p><b>  {</b></p><p><b>  PCB tmp;</b>&

44、lt;/p><p>  Node *p= first;</p><p>  while(p->next)</p><p><b>  {</b></p><p>  p=p->next;</p><p>  if (p->data.Size>=_size&&p-

45、>data.status==free)</p><p><b>  {</b></p><p>  p->data.name=_name;</p><p>  p->data.status=busy;</p><p>  return true;</p><p><b>

46、;  }</b></p><p><b>  }</b></p><p>  return false;</p><p><b>  }</b></p><p>  void Queue::SortList()</p><p><b>  {</b

47、></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=q->next)</p><p>

48、;<b>  {</b></p><p>  if (p->data.Size>q->data.Size)</p><p><b>  {</b></p><p><b>  PCB tmp;</b></p><p>  tmp=p->data;<

49、/p><p>  p->data=q->data;</p><p>  q->data=tmp;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p>

50、<p>  //動態(tài)分區(qū)分配算法(最佳適應(yīng)算法)</p><p>  bool Queue::AllocProDynamic(CString _name,int _size)</p><p><b>  {</b></p><p>  Node *p=first;</p><p>  Node *q=NUL

51、L;//用來記錄最佳插入點位置</p><p>  int ch=0;//用來記錄最小碎片值</p><p>  while(p->next)</p><p><b>  {</b></p><p>  p=p->next;</p><p>  //分區(qū)大小正好和進程

52、大小相等</p><p>  if (p->data.status==free&&p->data.Size==_size)</p><p><b>  {</b></p><p>  p->data.name=_name;</p><p>  p->data.status=busy

53、;</p><p>  return true;</p><p><b>  }</b></p><p>  if (p->data.status==free&&p->data.Size>_size)</p><p><b>  {</b></p>&

54、lt;p>  ch=p->data.Size-_size;</p><p><b>  q=p;</b></p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  /*</b><

55、/p><p>  //分區(qū)大小大于進程大小,分割分區(qū),并按大小分區(qū)排序</p><p>  if (p->data.Size>_size&&p->data.status==free)</p><p><b>  {</b></p><p>  Node *s=new Node;</p&

56、gt;<p>  int tmp=p->data.Size-_size;</p><p>  if (tmp>_size)</p><p><b>  {</b></p><p>  s->data.lStartAddres=p->data.lStartAddres;</p><p>

57、;  s->data.Size=_size;</p><p>  s->data.name=_name;</p><p>  s->data.status=busy;</p><p>  p->data.lStartAddres+=_size;</p><p>  p->data.Size=tmp;</p&

58、gt;<p>  s->next=q->next;</p><p>  q->next=s;</p><p>  SortList();//對分區(qū)鏈表進行按大小有小到大排序</p><p>  return true;</p><p><b>  }</b></p>&

59、lt;p><b>  else</b></p><p><b>  {</b></p><p>  s->data.lStartAddres=p->data.lStartAddres+tmp;</p><p>  s->data.name=_name;</p><p>  s

60、->data.Size=_size;</p><p>  s->data.status=busy;</p><p>  p->data.Size=tmp;</p><p>  s->next=p->next;</p><p>  p->next=s;</p><p>  SortLi

61、st();//對分區(qū)鏈表進行按大小有小到大排序</p><p>  return true;</p><p><b>  }</b></p><p><b>  */</b></p><p><b>  }</b></p><p><b&g

62、t;  while(p)</b></p><p><b>  {</b></p><p>  if (p->data.status==free&&p->data.Size>=_size)</p><p><b>  {</b></p><p>  if

63、(p->data.Size-_size<ch)</p><p><b>  {</b></p><p>  ch=p->data.Size-_size;</p><p><b>  q=p;</b></p><p><b>  }</b></p>

64、<p><b>  }</b></p><p>  p=p->next;</p><p><b>  }</b></p><p>  if(q==NULL)</p><p><b>  {</b></p><p>  return fa

65、lse;</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  Node *s=new Node;</p><p>  s->data.lStartAddr

66、es=q->data.lStartAddres+ch;</p><p>  s->data.name=_name;</p><p>  s->data.Size=_size;</p><p>  s->data.status=busy;</p><p>  q->data.Size=ch;</p>

67、<p>  s->next=q->next;</p><p>  q->next=s;</p><p>  return true;</p><p><b>  }</b></p><p><b>  }</b></p><p>  bool Qu

68、eue::FreeMemory(CString _name)</p><p><b>  {</b></p><p>  Node *p=first;</p><p><b>  Node *q;</b></p><p>  while(p->next)</p><p>

69、;<b>  {</b></p><p><b>  q=p;</b></p><p>  p=p->next;</p><p>  if (p->data.name==_name)</p><p><b>  {</b></p><p> 

70、 p->data.name="";</p><p>  p->data.status=free;</p><p>  //進行相鄰分區(qū)合并</p><p>  if (q->data.status==free)</p><p><b>  {</b></p><p

71、>  q->data.Size+=p->data.Size;</p><p>  q->next=p->next;</p><p><b>  }</b></p><p>  //判斷是否為鏈表尾</p><p>  if (p->next!=NULL)</p><

72、p><b>  {</b></p><p>  if (p->next->data.status==free)</p><p><b>  {</b></p><p>  p->data.Size+=p->next->data.Size;</p><p>  p-

73、>next=p->next->next;</p><p><b>  }</b></p><p><b>  }</b></p><p>  return true;</p><p><b>  }</b></p><p><b&

74、gt;  }</b></p><p>  return false;</p><p><b>  }</b></p><p>  bool Queue::AllMerge(int _size)</p><p><b>  {</b></p><p>  Node

75、*p=first;</p><p><b>  Node *q;</b></p><p>  int sum=0;</p><p>  bool flag=true;//標(biāo)志是否為第一次找到free分區(qū)</p><p>  while(p->next)</p><p><b&g

76、t;  {</b></p><p>  while(p->next)</p><p><b>  {</b></p><p><b>  q=p;</b></p><p>  p=p->next;</p><p>  if (p->data.st

77、atus==free&&flag)</p><p><b>  {</b></p><p>  sum=p->data.Size;</p><p>  q->next=p->next;</p><p>  flag=false;</p><p><b>

78、  break;</b></p><p><b>  }</b></p><p>  if (!flag&&p->data.status==busy)</p><p><b>  {</b></p><p>  //對數(shù)據(jù)進行重定位</p><p

79、>  p->data.lStartAddres-=sum;</p><p><b>  }</b></p><p>  if (p->data.status==free&&!flag)</p><p><b>  {</b></p><p>  p->data

80、.Size+=sum;</p><p>  //對數(shù)據(jù)進行重定位</p><p>  p->data.lStartAddres-=sum;</p><p>  if (p->data.Size>=_size)</p><p><b>  {</b></p><p>  retur

81、n true;</p><p><b>  }</b></p><p>  q->next=p->next;</p><p>  sum=p->data.Size;</p><p><b>  break;</b></p><p><b>  }&

82、lt;/b></p><p><b>  }</b></p><p><b>  while(p)</b></p><p><b>  {</b></p><p><b>  q=p;</b></p><p>  p=p-&g

83、t;next;</p><p>  if (p->data.status==free)</p><p><b>  {</b></p><p>  p->data.Size+=sum;</p><p>  //對數(shù)據(jù)進行重定位</p><p>  p->data.lStartAd

84、dres-=sum;</p><p>  if (p->data.Size>_size)</p><p><b>  {</b></p><p>  return true;</p><p><b>  }</b></p><p>  q->next=p-&

85、gt;next;</p><p>  sum=p->data.Size;</p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  else</b></p><p><b>  

86、{</b></p><p>  //對數(shù)據(jù)進行重定位</p><p>  p->data.lStartAddres-=sum;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</

87、b></p><p>  return false;</p><p><b>  }</b></p><p>  bool Queue::Swaping(int needSize ,PCB &pro)</p><p><b>  {</b></p><p>  

88、Node *p=first;</p><p>  //Node *q;</p><p>  while(p->next)</p><p><b>  {</b></p><p>  p=p->next;</p><p>  if (p->data.Size>=needSiz

89、e)</p><p><b>  {</b></p><p>  pro=p->data;</p><p>  p->data.name="";</p><p>  p->data.status=free;</p><p>  return true;<

90、/p><p><b>  }</b></p><p><b>  }</b></p><p>  return false;</p><p><b>  }</b></p><p>  四:程序設(shè)計與實現(xiàn)。</p><p><b

91、>  流程圖</b></p><p>  固定分區(qū)分配流程圖:</p><p>  默認(rèn)1000KB內(nèi)存大小</p><p>  總共分為20個相等大小分區(qū)</p><p><b>  動態(tài)分區(qū)分配算法:</b></p><p>  可重定位分區(qū)分配算法:</p&

92、gt;<p><b>  實驗結(jié)果:</b></p><p>  五:收獲,體會和建議</p><p>  此次課程設(shè)計讓我進一步加深了對操作系統(tǒng)內(nèi)存分配算法的的理解,此次試驗自己花了不少時間研究課本和課外資料,在寫可重定位分區(qū)分配算法遇到了內(nèi)存緊湊算法方面的難題,如何對內(nèi)存剩余空間大小進行緊湊利用,花了好些時間不斷的實驗,不斷的調(diào)試代碼,最后終于寫好了

93、,并加以測試代碼的健壯性,完成并測試了本次操作系統(tǒng)課程設(shè)計。期間雖然遇到了很多困難,但自己最后因為這些困難而收獲到了不少知識,加強了自己動手寫代碼的能力,對代碼調(diào)式技術(shù)進一步掌握,對操作系統(tǒng)也產(chǎn)生了更濃厚的興趣,自己一定還要多花時間研究操作系統(tǒng),爭取進一步理解操作系統(tǒng)并能夠?qū)?yōu)秀算法加以運用到自己以后的代碼中。</p><p>  六:參考資料和書籍。</p><p>  《Visual

溫馨提示

  • 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)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論