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

下載本文檔

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

文檔簡介

1、<p><b>  課 程 設(shè) 計(jì)</b></p><p><b>  目錄</b></p><p>  蚌埠學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)系課程設(shè)計(jì)任務(wù)書1</p><p>  計(jì)算機(jī)科學(xué)與技術(shù)系課程設(shè)計(jì)成績評(píng)定標(biāo)準(zhǔn)及成績評(píng)定表2</p><p><b>  一、引言3</b

2、></p><p>  1.1 課程設(shè)計(jì)的目的3</p><p><b>  1.2實(shí)驗(yàn)要求3</b></p><p><b>  1.3預(yù)備知識(shí)3</b></p><p>  1.4課程設(shè)計(jì)內(nèi)容4</p><p><b>  二、需求分析

3、4</b></p><p>  2.1 整體思路4</p><p>  2.2設(shè)計(jì)所才用的算法4</p><p>  2.3內(nèi)存分配與回收所使用的結(jié)構(gòu)體5</p><p>  2.4關(guān)于分配留下的內(nèi)存小碎片問題5</p><p>  2.5內(nèi)存的回收5</p><p>&l

4、t;b>  三、總體設(shè)計(jì)6</b></p><p>  3.1 數(shù)據(jù)結(jié)構(gòu)描述6</p><p>  3.1.1、全局變量6</p><p>  3.1.2、空閑分區(qū)表定義6</p><p>  3.1.3、已分配表定義6</p><p>  3.1.4、函數(shù)聲明6</p>&

5、lt;p>  3.2 流程圖7</p><p>  3.2.1、系統(tǒng)總體流程圖(如圖3-1所示)7</p><p>  3.2.2作業(yè)分配流程圖8</p><p>  3.2.3內(nèi)存回收流程圖9</p><p><b>  四、詳細(xì)設(shè)計(jì)10</b></p><p>  4.1首

6、次適應(yīng)算法10</p><p>  4.2最佳適應(yīng)算法11</p><p>  4.3最差適應(yīng)算法13</p><p>  4.4內(nèi)存回收15</p><p><b>  五、測試運(yùn)行17</b></p><p>  5.1、后臺(tái)代碼的截圖17</p><p>

7、  5.1.1 初始化程序,使用首次適應(yīng)、最優(yōu)動(dòng)態(tài)、最壞適應(yīng)等算法進(jìn)行內(nèi)存分配17</p><p>  5.1.2查看內(nèi)存分配狀態(tài)18</p><p>  5.1.3上下無空閑鄰接回收18</p><p>  5.1.4上鄰接空閑區(qū)回收19</p><p>  5.1.5上下鄰接區(qū)19</p><p><

8、;b>  六、心得體會(huì)20</b></p><p><b>  七、參考教材21</b></p><p><b>  附錄:源代碼21</b></p><p>  計(jì)算機(jī)科學(xué)與技術(shù)系課程設(shè)計(jì)任務(wù)書</p><p>  可變分區(qū)存儲(chǔ)管理方式的內(nèi)存分配回收</p>

9、<p><b>  一、引言</b></p><p>  1.1 課程設(shè)計(jì)的目的 </p><p>  本課題采用可變分區(qū)存儲(chǔ)管理方式的模擬實(shí)現(xiàn)內(nèi)存分配與回收??勺兎謪^(qū)分配是一種重要的存儲(chǔ)管理思想,目前流行的操作系統(tǒng)采用的分段存儲(chǔ)管理的基本思想就源自該方法。本課程設(shè)計(jì)通過編程模擬可變分區(qū)分配存儲(chǔ)管理,經(jīng)過學(xué)生親自動(dòng)手編寫管理程序,可以進(jìn)一

10、步加深操作系統(tǒng)中對可變分區(qū)分配存儲(chǔ)管理方案設(shè)計(jì)思想的理解。</p><p><b>  1.2實(shí)驗(yàn)要求</b></p><p>  (1) 內(nèi)存分配采用首次適應(yīng)算法、最佳適應(yīng)算法與最差分配算法分別完成。 </p><p>  (2) 動(dòng)態(tài)輸入構(gòu)造空閑區(qū)表,并顯示構(gòu)造好的空閑區(qū)表。(提示:在兩種不同的內(nèi)存分配算法中,空閑區(qū)在空閑區(qū)表中的

11、登記順序是不一樣的)</p><p>  (3) 鍵盤接收作業(yè)申請的內(nèi)存尺寸大小。</p><p>  (4) 根據(jù)申請,實(shí)施內(nèi)存分配,并返回分配所得內(nèi)存首址。</p><p>  (5) 分配完后,調(diào)整空閑區(qū)表(即扣除分配部分),并顯示調(diào)整后的空閑區(qū)表。</p><p>  (6) 若分配失敗,返回分配失敗信息。</p>&l

12、t;p>  (7) 內(nèi)存回收根據(jù)空閑區(qū)表,按內(nèi)存回收的四種情況從鍵盤接收回收區(qū)域的內(nèi)存首址與大小;回收區(qū)域,調(diào)整空閑區(qū)表(與前面空閑區(qū)相連,與后面空閑區(qū)相連,與前后空閑區(qū)相連則合并,與前后空閑區(qū)都不相連則插入該項(xiàng)),并顯示調(diào)整后的空閑區(qū)表。</p><p><b>  1.3預(yù)備知識(shí)</b></p><p>  存儲(chǔ)管理中可變分區(qū)的管理方式,理解掌握作業(yè)申請內(nèi)存

13、時(shí)的方法,編程實(shí)現(xiàn)分區(qū)回收算法,對實(shí)驗(yàn)列出的幾種分區(qū)回收情況都應(yīng)該能處理。熟練運(yùn)用c++編程,采用結(jié)構(gòu)體定義數(shù)組。</p><p><b>  1.4課程設(shè)計(jì)內(nèi)容</b></p><p>  編寫程序完成可變分區(qū)存儲(chǔ)管理方式的內(nèi)存分配與回收。</p><p>  具體包括:確定內(nèi)存空間分配表;采用相關(guān)算法完成內(nèi)存空間的分配和回收;撰寫課程設(shè)計(jì)報(bào)

14、告。</p><p><b>  二、需求分析</b></p><p><b>  2.1 整體思路</b></p><p>  可變分區(qū)管理方式將內(nèi)存除操作系統(tǒng)占用區(qū)域外的空間看做一個(gè)大的空閑區(qū)。當(dāng)作業(yè)要求裝入內(nèi)存時(shí),根據(jù)作業(yè)需要內(nèi)存空間的大小 查詢內(nèi)存中的各個(gè)空閑區(qū),當(dāng)從內(nèi)存空間中找到一個(gè)大于或等于該作業(yè)大小的內(nèi)存空閑

15、區(qū)時(shí),選擇其中一個(gè)空閑區(qū),按作業(yè)需求量劃出一個(gè)分區(qū)裝人該作業(yè),作業(yè)執(zhí)行完后,其所占的內(nèi)存分區(qū)被收回,成為一個(gè)空閑區(qū)。如果該空閑區(qū)的相鄰分區(qū)也是空閑區(qū),則需要將相鄰空閑區(qū)合并成一個(gè)空閑區(qū)。</p><p>  2.2設(shè)計(jì)所才用的算法</p><p> ?。?)首次適應(yīng)算法,每次為作業(yè)分配內(nèi)存時(shí),總是按當(dāng)前位置下一個(gè)位置搜索,查找滿足作業(yè)大小的內(nèi)存給予分配。(2)最優(yōu)適應(yīng)算法,每次為作業(yè)分配內(nèi)

16、存時(shí),總是把既能滿足要求、又是最小的空閑分區(qū)分配給作業(yè)。(3)最差分配算法,每次為作業(yè)分配內(nèi)存時(shí),總是把既能滿足要求、又是最大的空閑分區(qū)分配給作業(yè)。 但最優(yōu)適應(yīng)算法容易出現(xiàn)找到的一個(gè)分區(qū)可能只比作業(yè)所需求的長度略大一點(diǎn)的情行,這時(shí),空閑區(qū)分割后剩下的空閑區(qū)就很小以致很難再使用,降低了內(nèi)存的使用率。為解決此問題,設(shè)定一個(gè)限值minsize,如果空閑區(qū)的大小減去作業(yè)需求長度得到的值小于等于minsize,不再將空閑區(qū)分成己分分區(qū)和空閑區(qū)兩部

17、分,而是將整個(gè)空閑區(qū)都分配給作業(yè)。</p><p>  2.3內(nèi)存分配與回收所使用的結(jié)構(gòu)體</p><p>  為便于對內(nèi)存的分配和回收,建立兩張表記錄內(nèi)存的使用情況。一張為記錄作業(yè)占用分區(qū)的“內(nèi)存分配表”,內(nèi)容包括分區(qū)起始地址、長度、作業(yè)名/標(biāo)志(為0時(shí)作為標(biāo)志位表示空欄目);一張為記錄空閑區(qū)的“空閑分區(qū)表”,內(nèi)容包括分區(qū)起始地址、長度、標(biāo)志(0表空欄目,1表未分配)。兩張表都采用順序表

18、形式。</p><p>  2.4關(guān)于分配留下的內(nèi)存小碎片問題</p><p>  當(dāng)要裝入一個(gè)作業(yè)時(shí),從“空閑分區(qū)表”中查找標(biāo)志為“1”(未分配)且滿足作業(yè)所需內(nèi)存大小的最小空閑區(qū),若空閑區(qū)的大小與作業(yè)所需大小的差值小于或等于minsize,把該分區(qū)全部分配給作業(yè),并把該空閑區(qū)的標(biāo)志改為“0”(空欄目)。同時(shí),在已分配區(qū)表中找到一個(gè)標(biāo)志為“0”的欄目登記新裝人作業(yè)所占用分區(qū)的起始地址,長

19、度和作業(yè)名。若空閑區(qū)的大小與作業(yè)所需大小的差值大于minsize。則把空閑區(qū)分成兩部分,一部分用來裝入作業(yè),另外一部分仍為空閑區(qū)。這時(shí)只要修改原空閑區(qū)的長度,且把新裝人的作業(yè)登記到已分配區(qū)表中。</p><p><b>  2.5內(nèi)存的回收</b></p><p>  在可變分區(qū)方式下回收內(nèi)存空間時(shí),先檢查是否有與歸還區(qū)相鄰的空閑區(qū)(上鄰空閑區(qū),下鄰空閑區(qū))。若有,則

20、將它們合件成一個(gè)空閑區(qū)。程序?qū)崿F(xiàn)時(shí),首先將要釋放的作業(yè)在“內(nèi)存分配表”中的記錄項(xiàng)的標(biāo)志改為“0”(空欄目),然后檢查“空閑區(qū)表”中標(biāo)志為‘1’(未分配)的欄目,查找是否有相鄰的空閑區(qū),若有,將之合并,并修改空閑區(qū)的起始地址和長度。</p><p><b>  三、總體設(shè)計(jì)</b></p><p>  3.1 數(shù)據(jù)結(jié)構(gòu)描述</p><p>  3

21、.1.1 全局變量</p><p>  float minsize=5;</p><p>  int count1=0;</p><p>  int count2=0;</p><p>  #define m 10 //假定系統(tǒng)允許的空閑區(qū)表最大為m</p><p>  #define n 10 //假定系統(tǒng)允許的最大

22、作業(yè)數(shù)量為m</p><p>  3.1.2 空閑分區(qū)表定義</p><p><b>  struct</b></p><p>  {float address;//空閑區(qū)起始地址</p><p>  float length;//空閑區(qū)長度,單位為字節(jié)</p><p>  int fla

23、g; //空閑區(qū)表登記欄標(biāo)志,用"0"表示空欄目,用"1"表示未分配</p><p>  }free_table[m]; //空閑區(qū)表 </p><p>  3.1.3 已分配表定義</p><p><b>  struct</b></p><p>  {float

24、 address; //已分分區(qū)起始地址</p><p>  float length; //已分分區(qū)長度,單位為字節(jié)</p><p>  int flag; //已分配區(qū)表登記欄標(biāo)志,"0"表示空欄目,實(shí)驗(yàn)中只支持一個(gè)字符的作業(yè)名</p><p>  }used_table[n]; //已分配區(qū)表</p><p&g

25、t;  3.1.4 函數(shù)聲明</p><p>  void initialize(void);</p><p>  int distribute(int,float); //最優(yōu)動(dòng)態(tài)分配算法</p><p>  int shouci(int,float); //首次適應(yīng)算法</p><p>  int zuicha(int,flo

26、at); //最差適應(yīng)算法</p><p>  int recycle(int); //內(nèi)存回收</p><p>  void show(); //顯示狀態(tài)</p><p>  void fenpei(); //分配函數(shù)</p><p><b>  3.2 流程圖</b>&l

27、t;/p><p>  3.2.1 系統(tǒng)總體流程圖(如圖3-1所示,以下添加)</p><p>  描述:程序的總體結(jié)構(gòu)方框圖,如下圖3-1所示</p><p>  圖3-1 系統(tǒng)總體流程圖</p><p>  3.2.2 作業(yè)分配流程圖</p><p>  描述:作業(yè)的分配流程圖如圖3-2所示</p>&l

28、t;p>  圖3-2 作業(yè)分配流程圖</p><p>  3.2.3內(nèi)存回收流程圖</p><p>  描述:作業(yè)回收的過程如圖3-3所示</p><p>  圖3-3內(nèi)存回收流程圖</p><p><b>  四、詳細(xì)設(shè)計(jì)</b></p><p><b>  4.1首次適應(yīng)算法&

29、lt;/b></p><p>  int shouci(int name,float memory){</p><p>  int i,k=-1;</p><p>  float ads, len;</p><p>  int count=0;</p><p><b>  i=0;</b>

30、</p><p>  while(i<=m-1) //循環(huán)找到最佳的空閑分區(qū)</p><p><b>  {</b></p><p>  if(memory <=free_table[i].length)</p><p><b>  {</b></p><

31、p><b>  k=i;</b></p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  i=i+1;</b></p><p><b>  }</b></p&

32、gt;<p><b>  if(k!=-1)</b></p><p><b>  {</b></p><p>  if((free_table[k].length-memory)<=minsize) //整個(gè)分配</p><p><b>  {</b></p>&

33、lt;p>  free_table[k].flag=0;</p><p>  ads=free_table[k].address;</p><p>  len=free_table[k].length;</p><p><b>  }</b></p><p><b>  else</b><

34、;/p><p><b>  {//切割空閑區(qū)</b></p><p>  ads=free_table[k].address;</p><p>  len=memory;</p><p>  free_table[k].address+=memory;</p><p>  free_table[k]

35、.length-=memory;</p><p><b>  }</b></p><p><b>  i=0;</b></p><p>  //循環(huán)尋找內(nèi)存分配表中標(biāo)志為空欄目的項(xiàng)</p><p>  while(used_table[i].flag!=0) </p><p&

36、gt;  {i=i+1;}</p><p>  if(i<=n-1) //找到,在已分配區(qū)表中登記一個(gè)表項(xiàng)</p><p><b>  {</b></p><p>  used_table[i].address=ads;</p><p>  used_table[i].length=len;<

37、/p><p>  used_table[i].flag=name;</p><p><b>  count1++;</b></p><p><b>  }</b></p><p>  else //已分配區(qū)表長度不足</p><p><b>  {</

38、b></p><p>  if(free_table[k].flag == 0) //將已做的整個(gè)分配撤銷</p><p><b>  {</b></p><p>  free_table[k].flag=1;</p><p>  free_table[k].address=ads;</p>&l

39、t;p>  free_table[k].length=len;</p><p><b>  }</b></p><p>  else //將已做的切割分配撤銷</p><p><b>  {</b></p><p>  free_tabl

40、e[k].address=ads; </p><p>  free_table[k].length+=len;</p><p><b>  }</b></p><p>  cout<<"內(nèi)存分配區(qū)已滿,分配失??!\n"; </p><p><b>  

41、return 0;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  cou

42、t <<"無法為該作業(yè)找到合適分區(qū)!\n";</p><p><b>  return 0;</b></p><p><b>  }</b></p><p>  return name;</p><p><b>  }</b></p>

43、<p><b>  4.2最佳適應(yīng)算法</b></p><p>  //最優(yōu)分配算法實(shí)現(xiàn)的動(dòng)態(tài)分區(qū)</p><p>  int distribute(int process_name, float need_length)</p><p><b>  {</b></p><p>  i

44、nt i, k=-1;//k用于定位在空閑表中選擇的未分配欄</p><p>  float ads, len;</p><p>  int count=0;</p><p><b>  i=0;</b></p><p>  while(i<=m-1) //循環(huán)找到最佳的空閑分區(qū)</p&g

45、t;<p><b>  {</b></p><p>  if(free_table[i].flag==1 && need_length <=free_table[i].length)</p><p><b>  {</b></p><p><b>  count++;</

46、b></p><p>  if(count==1||free_table[i].length < free_table[k].length)</p><p><b>  k=i;</b></p><p><b>  }</b></p><p><b>  i=i+1;<

47、/b></p><p><b>  }</b></p><p><b>  if(k!=-1)</b></p><p><b>  {</b></p><p>  if((free_table[k].length-need_length)<=minsize) //

48、整個(gè)分配</p><p><b>  {</b></p><p>  free_table[k].flag=0;</p><p>  ads=free_table[k].address;</p><p>  len=free_table[k].length;</p><p><b> 

49、 }</b></p><p><b>  else</b></p><p><b>  {//切割空閑區(qū)</b></p><p>  ads=free_table[k].address;</p><p>  len=need_length;</p><p>  

50、free_table[k].address+=need_length;</p><p>  free_table[k].length-=need_length;</p><p><b>  }</b></p><p><b>  i=0;</b></p><p>  //循環(huán)尋找內(nèi)存分配表中標(biāo)志為

51、空欄目的項(xiàng)</p><p>  while(used_table[i].flag!=0) </p><p><b>  {i=i+1;}</b></p><p>  if(i<=n-1) //找到,在已分配區(qū)表中登記一個(gè)表項(xiàng)</p><p><b>  {</b></p>

52、;<p>  used_table[i].address=ads;</p><p>  used_table[i].length=len;</p><p>  used_table[i].flag=process_name;</p><p><b>  count1++;</b></p><p><b

53、>  }</b></p><p>  else //已分配區(qū)表長度不足</p><p><b>  {</b></p><p>  if(free_table[k].flag == 0) //將已做的整個(gè)分配撤銷</p><p><b>  {</b></p&

54、gt;<p>  free_table[k].flag=1;</p><p>  free_table[k].address=ads;</p><p>  free_table[k].length=len;</p><p><b>  }</b></p><p>  else

55、 //將已做的切割分配撤銷</p><p><b>  {</b></p><p>  free_table[k].address=ads; </p><p>  free_table[k].length+=len;</p><p><b>  }</b></p&g

56、t;<p>  cout<<"內(nèi)存分配區(qū)已滿,分配失敗!\n"; </p><p><b>  return 0;</b></p><p><b>  }</b></p><p><b>  }</b></p><p&

57、gt;<b>  else</b></p><p><b>  {</b></p><p>  cout <<"無法為該作業(yè)找到合適分區(qū)!\n";</p><p><b>  return 0;</b></p><p><b>  }&

58、lt;/b></p><p>  return process_name;</p><p><b>  }</b></p><p><b>  4.3最差適應(yīng)算法</b></p><p><b>  //最差算法實(shí)現(xiàn)</b></p><p>  i

59、nt zuicha(int name,float memory){</p><p>  int i, k=-1;//k用于定位在空閑表中選擇的未分配欄</p><p>  float ads, len;</p><p>  int count=0;</p><p><b>  i=0;</b></p>

60、<p>  while(i<=m-1) //循環(huán)找到最佳的空閑分區(qū)</p><p><b>  {</b></p><p>  if(free_table[i].flag==1 && memory<=free_table[i].length)</p><p><b>  {<

61、/b></p><p><b>  count++;</b></p><p>  if(count==1||free_table[i].length > free_table[k].length)</p><p><b>  k=i;</b></p><p><b>  }&l

62、t;/b></p><p><b>  i=i+1;</b></p><p><b>  }</b></p><p><b>  if(k!=-1)</b></p><p><b>  {</b></p><p>  if

63、((free_table[k].length-memory)<=minsize) //整個(gè)分配</p><p><b>  {</b></p><p>  free_table[k].flag=0;</p><p>  ads=free_table[k].address;</p><p>  len=free_t

64、able[k].length;</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {//切割空閑區(qū)</b></p><p>  ads=free_table[k].address;</p><

65、p>  len=memory;</p><p>  free_table[k].address+=memory;</p><p>  free_table[k].length-=memory;</p><p><b>  }</b></p><p><b>  i=0;</b></p&

66、gt;<p>  //循環(huán)尋找內(nèi)存分配表中標(biāo)志為空欄目的項(xiàng)</p><p>  while(used_table[i].flag!=0) </p><p>  {i=i+1;}</p><p>  if(i<=n-1) //找到,在已分配區(qū)表中登記一個(gè)表項(xiàng)</p><p><b>  {</

67、b></p><p>  used_table[i].address=ads;</p><p>  used_table[i].length=len;</p><p>  used_table[i].flag=name;</p><p><b>  count1++;</b></p><p>

68、;<b>  }</b></p><p>  else //已分配區(qū)表長度不足</p><p><b>  {</b></p><p>  if(free_table[k].flag == 0) //將已做的整個(gè)分配撤銷</p><p><b>  {</b>&

69、lt;/p><p>  free_table[k].flag=1;</p><p>  free_table[k].address=ads;</p><p>  free_table[k].length=len;</p><p><b>  }</b></p><p>  else

70、 //將已做的切割分配撤銷</p><p><b>  {</b></p><p>  free_table[k].address=ads; </p><p>  free_table[k].length+=len;</p><p><b>  }</b>&l

71、t;/p><p>  cout<<"內(nèi)存分配區(qū)已滿,分配失??!\n"; </p><p><b>  return 0;</b></p><p><b>  }</b></p><p><b>  }</b></p>

72、<p><b>  else</b></p><p><b>  {</b></p><p>  cout <<"無法為該作業(yè)找到合適分區(qū)!\n";</p><p><b>  return 0;</b></p><p><b&g

73、t;  }</b></p><p>  return name;</p><p><b>  }</b></p><p><b>  4.4內(nèi)存回收</b></p><p><b>  //內(nèi)存回收</b></p><p>  int rec

74、ycle(int process_name) </p><p><b>  {</b></p><p><b>  int y=0;</b></p><p>  float recycle_address, recycle_length;</p><p>  int i, j, k;

75、//j欄是下鄰空閑區(qū),k欄是上欄空閑區(qū)</p><p><b>  int x;</b></p><p>  //在內(nèi)存分配表中找到要回收的作業(yè)</p><p>  while(y<=n-1&&used_table[y].flag!=process_name)</p><p><b>  

76、{y=y+1;}</b></p><p>  if(y<=n-1) //找到作業(yè)后,將該欄的標(biāo)志置為'0'</p><p><b>  { </b></p><p>  recycle_address=used_table[y].address;</p><p>  

77、recycle_length=used_table[y].length;</p><p>  used_table[y].flag=0;</p><p><b>  count2++;</b></p><p><b>  }</b></p><p>  else //未能找到

78、作業(yè),回收失敗</p><p><b>  {</b></p><p>  cout<<"該作業(yè)不存在!\n";</p><p><b>  return 0;</b></p><p><b>  }</b></p><p&g

79、t;<b>  j=k=-1;</b></p><p><b>  i=0;</b></p><p>  while(!(i>=m||(k!=-1&&j!=-1))) //修改空閑分區(qū)表</p><p><b>  {</b></p><p>

80、  if(free_table[i].flag==1)</p><p>  {if((free_table[i].address+free_table[i].length)==recycle_address)</p><p>  k=i;//判斷是否有上鄰接</p><p>  if((recycle_address+recycle_length)==fre

81、e_table[i].address)</p><p>  j=i;//判斷是否有下鄰接</p><p><b>  }</b></p><p><b>  i=i+1;</b></p><p><b>  }</b></p><p><b&

82、gt;  //合并空閑區(qū)</b></p><p>  if(k!=-1) //回收區(qū)有上鄰接</p><p><b>  {</b></p><p>  if(j!=-1){//回收區(qū)也有下鄰接,和上下領(lǐng)接合并</p><p>  free_table[k].length+=free_ta

83、ble[j].length+recycle_length;</p><p>  free_table[j].flag=0;//將第j欄的標(biāo)記置為'0'</p><p><b>  }</b></p><p>  else //不存在下鄰接,和上鄰接合并</p><p&

84、gt;  free_table[k].length+=recycle_length;</p><p><b>  }</b></p><p>  else if(j!=-1)</p><p>  { //只有下鄰接,和下鄰接合并</p><p>  free_tabl

85、e[j].length+=recycle_length;</p><p>  free_table[j].address=recycle_address;</p><p><b>  }</b></p><p><b>  else </b></p><p>  {

86、 //上下鄰接都沒有</p><p><b>  x=0;</b></p><p>  while(free_table[x].flag!=0)</p><p>  x=x+1;//在空閑區(qū)表中查找一個(gè)狀態(tài)為'0'的欄目</p><p>  if(x<=m-1)</p>

87、;<p>  { //找到后,在空閑分區(qū)中登記回收的內(nèi)存</p><p>  free_table[x].address=recycle_address;</p><p>  free_table[x].length=recycle_length;</p><p>  free_table[x].flag=1;</p>

88、<p><b>  }</b></p><p><b>  else</b></p><p>  { //空閑表已滿,執(zhí)行回收失敗</p><p>  used_table[y].flag=process_name;</p><p&g

89、t;  cout<<"空閑區(qū)已滿,回收失?。n";</p><p><b>  return 0;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  return process_nam

90、e;</p><p><b>  }</b></p><p><b>  五、測試運(yùn)行</b></p><p>  5.1、后臺(tái)代碼的截圖</p><p>  5.1.1 初始化程序 </p><p> ?。?)如圖5-1所示,系統(tǒng)采用首次適應(yīng)、最佳、最差適應(yīng)算法進(jìn)行內(nèi)存分配

91、(格式)</p><p><b>  圖5-1 分配內(nèi)存</b></p><p>  5.1.2查看內(nèi)存分配狀態(tài)</p><p>  (2)如圖5-2所示,內(nèi)存分配狀態(tài)顯示</p><p><b>  圖5-2顯示狀態(tài)</b></p><p>  5.1.3上下無空閑鄰接回收

92、</p><p>  (3)如圖5-3所示,回收單一分配空間</p><p><b>  圖5-3無鄰接回收</b></p><p>  5.1.4上鄰接空閑區(qū)回收</p><p>  (4)如圖5-4所示,回收區(qū)和上鄰接區(qū)合并</p><p><b>  圖5-4上鄰接</b&g

93、t;</p><p>  5.1.5上下鄰接區(qū)</p><p> ?。?)如圖5-4所示,回收區(qū)和上下鄰接區(qū)合并</p><p><b>  圖5-5上下鄰接</b></p><p><b>  六、心得體會(huì)</b></p><p>  設(shè)計(jì)本課程前,感覺本課程并不是那么難,

94、很容易下手,因?yàn)橹饕簿褪菍懗龌厥罩鞒绦颉?nèi)存分配主程序就行了。但是真正實(shí)施起來確非常困難。 </p><p>  首先,必須解決動(dòng)態(tài)輸入構(gòu)造空閑區(qū)表的問題。剛開始的時(shí)候,我們把其他的程序都寫出來了,卻忘了課題還要求動(dòng)態(tài)輸入構(gòu)造空閑區(qū)表。于是我們又花了很大的力氣才實(shí)現(xiàn)動(dòng)態(tài)輸入構(gòu)造空閑區(qū)表,即:可以根據(jù)自己的需要,從鍵盤輸入空閑區(qū)表的塊數(shù),并輸入每塊空閑區(qū)表的大小及首地址。 </p>

95、<p>  其次,需要解決的是首次適應(yīng)算法和最佳適應(yīng)算法之間的轉(zhuǎn)制問題。我們做完首次適應(yīng)算法的程序后不知道該從什么地方著手寫最佳適應(yīng)算法。最后過了幾天,才想到,原來只需在首次適應(yīng)算法中,每次申請空閑區(qū)前先對空閑區(qū)從小到大排序即可。第三個(gè)難題就是解決回收算法的問題?;厥账惴梢哉f是本實(shí)驗(yàn)最難實(shí)現(xiàn)的算法,因?yàn)樗兴姆N不同的情況。剛開始我們只考慮了三種情況,即:</p><p>  1、要回收的區(qū)域沒有與

96、之相鄰接的空閑區(qū)。 </p><p>  2、要回收區(qū)域有上鄰(與要回收區(qū)域相鄰的上面有空閑區(qū))。 </p><p>  3、要回收的區(qū)域有下鄰(與要回收的區(qū)域相鄰的下面有空閑區(qū))。 </p><p>  當(dāng)我們滿懷欣喜感覺本課程設(shè)計(jì)已經(jīng)完成的時(shí)候卻發(fā)現(xiàn),程序運(yùn)行的時(shí)候,對于一個(gè)剛分配好的空閑區(qū),如果有三個(gè)相鄰的作業(yè)可以同時(shí)在此空閑區(qū)內(nèi)

97、申請到內(nèi)存,并全并回收此三個(gè)作業(yè)后,此空閑區(qū)會(huì)被分割成兩個(gè)空閑區(qū)顯示。這時(shí)我們才意識(shí)到少考慮了一種情況:要回收的區(qū)域有上鄰而且有下鄰。我們又不得不再次修改程序。 就這樣,在寫出大體程序后,我們前后大大小小修改了十多次,最后修改好的程序完全符合課程設(shè)計(jì)要求,我們的課程設(shè)計(jì)終于成功了!</p><p><b>  七、參考教材</b></p><p>  1.

98、湯小丹.計(jì)算機(jī)操作系統(tǒng),西安電子科技大學(xué)出版社.2014</p><p>  2.譚浩強(qiáng).C++程序設(shè)計(jì).清華大學(xué)出版社.2004</p><p>  3.郭有強(qiáng)等編著.《C++面向?qū)ο蟪绦蛟O(shè)計(jì)》.2009</p><p>  4.郭有強(qiáng)等編著.《C++面向?qū)ο蟪绦蛟O(shè)計(jì)實(shí)驗(yàn)指導(dǎo)與課程設(shè)計(jì)》.2009</p><p><b>  附錄

99、:源代碼</b></p><p>  #include<iostream></p><p>  #include<iomanip></p><p>  #include<string></p><p>  using namespace std;</p><p><

100、b>  //全局變量</b></p><p>  float minsize=5;</p><p>  int count1=0;</p><p>  int count2=0;</p><p>  #define m 10 //假定系統(tǒng)允許的空閑區(qū)表最大為m</p><p>  #define n

101、10 //假定系統(tǒng)允許的最大作業(yè)數(shù)量為m</p><p><b>  //已分配表的定義</b></p><p><b>  struct {</b></p><p>  float address; //已分分區(qū)起始地址</p><p>  float length; //已分分區(qū)長度,單位

102、為字節(jié)</p><p>  int flag; //已分配區(qū)表登記欄標(biāo)志,"0"表示空欄目</p><p>  }used_table[n]; //已分配區(qū)表的對象名</p><p><b>  //空閑區(qū)表的定義</b></p><p><b>  struct{</b

103、></p><p>  float address; //空閑區(qū)起始地址</p><p>  float length; //空閑區(qū)長度,單位為字節(jié)</p><p>  int flag; //空閑區(qū)表登記欄標(biāo)志,用"0"表示空欄目,用"1"表示未分配</p><p>  }fr

104、ee_table[m]; //空閑區(qū)表對象名</p><p><b>  //函數(shù)聲明</b></p><p>  void initialize(void);</p><p>  int distribute(int,float); //最優(yōu)動(dòng)態(tài)分配算法</p><p>  int shouci(int,float

105、); //首次適應(yīng)算法</p><p>  int zuicha(int,float); //最差適應(yīng)算法</p><p>  int recycle(int); //內(nèi)存回收</p><p>  void show(); //顯示狀態(tài)</p><p>  void fenpei(); //

106、分配函數(shù)</p><p><b>  //主函數(shù)</b></p><p>  void main(){</p><p>  //system("color 09"); /*修改控制臺(tái)的顏色信息,改為白字藍(lán)底的模式*/ </p><p>  system("mode con: cols=14

107、0 lines=130"); /*設(shè)置批處理運(yùn)行時(shí)窗口大小的*/ </p><p>  int choice;</p><p>  bool exitFlag=false;</p><p>  cout<<"\t\t\t 動(dòng)態(tài)分區(qū)分配方式的模擬 \n";</p><p>  

108、cout<<"\t\t\t ************************************\n";</p><p>  cout<<"請選擇操作類型:\n";</p><p>  initialize(); //開創(chuàng)空閑區(qū)和已分配區(qū)兩個(gè)表</p><p>  while(!exitFlag

109、)</p><p><b>  {</b></p><p>  cout<<"\t\t\t********************************************\n";</p><p>  cout<<"\t\t\t** 1: 分配內(nèi)存 2: 回收內(nèi)存

110、 **\n";</p><p>  cout<<"\t\t\t** 3: 查看分配 0: 退 出 **\n";</p><p>  cout<<"\t\t\t********************************************\n";</p>

111、<p>  cout<<"請輸入您的操作 :";</p><p>  cin >>choice;</p><p>  switch(choice){</p><p><b>  case 0:</b></p><p>  exitFlag=true;</p&

112、gt;<p><b>  break;</b></p><p><b>  case 1:</b></p><p>  fenpei(); //分配內(nèi)存</p><p><b>  break;</b></p><p><b>  case 2:<

113、/b></p><p><b>  int ID;</b></p><p>  cout<<"請輸入你要釋放的分區(qū)號(hào):";</p><p><b>  cin>>ID;</b></p><p>  recycle(ID);</p>&l

114、t;p><b>  break;</b></p><p><b>  case 3:</b></p><p><b>  show();</b></p><p><b>  break;</b></p><p><b>  }</b&

115、gt;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  //初始化兩個(gè)表</b></p><p>  void initialize(void){</p><p><b>  int

116、a;</b></p><p>  for(a=0;a<=n-1;a++){</p><p>  used_table[a].flag=0; //已分配表的表項(xiàng)全部置為空表項(xiàng)</p><p>  free_table[0].address=1000;</p><p>  free_table[0].length=1024;&

117、lt;/p><p>  free_table[0].flag=1; //空閑區(qū)表的表項(xiàng)全部為未分配</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  //分配表</b></p><p>  void

118、 fenpei(){</p><p>  int job_name;</p><p>  float need_memory;</p><p>  bool exitFlag=false;</p><p>  int choice;</p><p>  while(!exitFlag){</p><

119、p>  cout<<"\t\t\t*****************************************************\n";</p><p>  cout<<"\t\t\t** 1: 首次適應(yīng)算法 2: 最優(yōu)動(dòng)態(tài)分配算法 **\n";</p><p>  cout<&

120、lt;"\t\t\t** 3: 最壞適應(yīng)算法 4: 返回主菜單 **\n";</p><p>  cout<<"\t\t\t*****************************************************\n";</p><p>  cout<<"請輸入您

121、的操作 :";</p><p>  cin>>choice;</p><p>  switch(choice){</p><p><b>  case 1:</b></p><p>  cout<<"請輸入作業(yè)名和所需內(nèi)存:";</p><p>

122、;  cin>>job_name>>need_memory;</p><p>  shouci(job_name,need_memory);</p><p><b>  break;</b></p><p><b>  case 2:</b></p><p>  cout&l

123、t;<"請輸入作業(yè)名和所需內(nèi)存:";</p><p>  cin>>job_name>>need_memory;</p><p>  distribute(job_name,need_memory);</p><p><b>  break;</b></p><p>&l

124、t;b>  case 3:</b></p><p>  cout<<"請輸入作業(yè)名和所需內(nèi)存:";</p><p>  cin>>job_name>>need_memory;</p><p>  zuicha(job_name,need_memory);</p><p>

125、;<b>  break;</b></p><p><b>  case 4:</b></p><p>  exitFlag=true;</p><p><b>  }</b></p><p><b>  }</b></p><p>

126、;<b>  }</b></p><p><b>  //首次適應(yīng)算法</b></p><p>  int shouci(int name,float memory){</p><p>  int i,k=-1;</p><p>  float ads, len;</p><p

127、>  int count=0;</p><p><b>  i=0;</b></p><p>  while(i<=m-1) //循環(huán)找到最佳的空閑分區(qū)</p><p><b>  {</b></p><p>  if(memory <=free_table[i].le

128、ngth)</p><p><b>  {</b></p><p><b>  k=i;</b></p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  i=i

129、+1;</b></p><p><b>  }</b></p><p><b>  if(k!=-1)</b></p><p><b>  {</b></p><p>  if((free_table[k].length-memory)<=minsize)

130、 //整個(gè)分配</p><p><b>  {</b></p><p>  free_table[k].flag=0;</p><p>  ads=free_table[k].address;</p><p>  len=free_table[k].length;</p><p><b&g

131、t;  }</b></p><p><b>  else</b></p><p><b>  {//切割空閑區(qū)</b></p><p>  ads=free_table[k].address;</p><p>  len=memory;</p><p>  fr

132、ee_table[k].address+=memory;</p><p>  free_table[k].length-=memory;</p><p><b>  }</b></p><p><b>  i=0;</b></p><p>  //循環(huán)尋找內(nèi)存分配表中標(biāo)志為空欄目的項(xiàng)</p

133、><p>  while(used_table[i].flag!=0) </p><p>  {i=i+1;}</p><p>  if(i<=n-1) //找到,在已分配區(qū)表中登記一個(gè)表項(xiàng)</p><p><b>  {</b></p><p>  used_table[i].

134、address=ads;</p><p>  used_table[i].length=len;</p><p>  used_table[i].flag=name;</p><p><b>  count1++;</b></p><p><b>  }</b></p><p&g

135、t;  else //已分配區(qū)表長度不足</p><p><b>  {</b></p><p>  if(free_table[k].flag == 0) //將已做的整個(gè)分配撤銷</p><p><b>  {</b></p><p>  free_table[k].flag=1

136、;</p><p>  free_table[k].address=ads;</p><p>  free_table[k].length=len;</p><p><b>  }</b></p><p>  else //將已做的切割分配撤銷</p>

137、<p><b>  {</b></p><p>  free_table[k].address=ads; </p><p>  free_table[k].length+=len;</p><p><b>  }</b></p><p>  cout<<"

138、內(nèi)存分配區(qū)已滿,分配失?。n"; </p><p><b>  return 0;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  else</b></

139、p><p><b>  {</b></p><p>  cout <<"無法為該作業(yè)找到合適分區(qū)!\n";</p><p><b>  return 0;</b></p><p><b>  }</b></p><p>  r

140、eturn name;</p><p><b>  }</b></p><p>  //最優(yōu)分配算法實(shí)現(xiàn)的動(dòng)態(tài)分區(qū)</p><p>  int distribute(int process_name, float need_length)</p><p><b>  {</b></p>

141、<p>  int i, k=-1;//k用于定位在空閑表中選擇的未分配欄</p><p>  float ads, len;</p><p>  int count=0;</p><p><b>  i=0;</b></p><p>  while(i<=m-1) //循環(huán)找到最佳

142、的空閑分區(qū)</p><p><b>  {</b></p><p>  if(free_table[i].flag==1 && need_length <=free_table[i].length)</p><p><b>  {</b></p><p><b>  

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論