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

下載本文檔

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

文檔簡介

1、<p><b>  操作系統(tǒng)原理</b></p><p><b>  課程設計報告</b></p><p>  題目: 存儲器的動態(tài)分區(qū)算法模擬 </p><p>  所在學院: </p><p>  班 級:

2、 </p><p>  學 號: </p><p>  姓 名: </p><p>  指導教師: </p><p>  成 績: </p>

3、<p>  2013年1月 16</p><p><b>  目錄</b></p><p>  一、課程設計目的1</p><p><b>  1、背景1</b></p><p><b>  2、目的1</b></p><p>  二、

4、課題任務描述1</p><p>  三、課題研發(fā)相關知識1</p><p>  1、 首次適應算法(first fit)1</p><p>  2、 最佳適應算法(best fit)1</p><p>  3、 最壞適應算法(worst fit)2</p><p><b>  4、 回收內存2

5、</b></p><p>  5、庫函數的介紹2</p><p><b>  四、課題設計2</b></p><p><b>  1、 總體結構2</b></p><p><b>  2、 數據結構4</b></p><p>  3

6、、 主要功能的流程圖5</p><p>  4、 程序的技術路線............................................................8</p><p>  五、帶有詳細注解的源程序8</p><p>  六、運行與測試18</p><p>  七、收獲及改進意見20</p

7、><p><b>  課程設計目的</b></p><p><b>  1、背景</b></p><p>  主存是CPU可直接訪問的信息空間,合理而有效的使用貯存將在很大程度上影響整個計算機系統(tǒng)的性能。</p><p>  本課題要求模擬實現(xiàn)分區(qū)式主存管理機制。模擬實現(xiàn)各種分區(qū)管理方法以及相應的主存分

8、配以及回收算法。</p><p><b>  2、目的</b></p><p>  通過該課題進一步加深對可變分區(qū)存儲機制的理解。加深對存儲器動態(tài)分區(qū)分配算法的認識。掌握“首次適應算法”、“下次適應算法”、“最佳適應算法發(fā)”、“最壞適應算法”的內存分配過程。掌握內存的回收策略。</p><p><b>  課題任務描述</b&g

9、t;</p><p>  1、設計可用的內存空閑空間,并能動態(tài)輸入用戶作業(yè)所需的內存大小。</p><p>  2、編程模擬各種分配算法的實施過程,允許自行選擇如“首次適應算法”、“下次適應算法”、“最佳適應算法發(fā)”、“最壞適應算法”等常用算法,要求實現(xiàn)不少于三種算法。</p><p>  3、實現(xiàn)內存的回收。要求考慮回收時的內存合并問題。</p>&

10、lt;p>  課題研發(fā)相關知識 (包含所用庫函數的介紹)</p><p>  首次適應算法(first fit)</p><p>  FF算法要求空閑分區(qū)鏈以地址遞增的次序鏈接。在分配內存時,從鏈首開始順序查找,直至找到一個大小能男足要求的空閑分區(qū)位置;然后再按照作業(yè)的大小,從該分區(qū)中劃出一塊內存空間分配給請求者,余下的空閑分區(qū)仍留在空閑鏈中。若從鏈首直至鏈尾都不能找到一個能滿足要求

11、的分區(qū),則此次內存分配失敗,返回。但是,低址部分不斷被劃分,會留下許多難以利用的很小的空閑分區(qū)。</p><p>  最佳適應算法(best fit)</p><p>  所謂“最佳”是指每次為作業(yè)分配內存時,總是把能滿足要求、又是最小的空閑分區(qū)分配給作業(yè),避免“大材小用”。為了加速尋找,該算法要求將所有的空閑分區(qū)按其容量以從小到大的順序形成一空閑分區(qū)鏈。這樣,第一次找到的能滿足要求的空閑

12、區(qū),必然是最佳的。這樣,在存儲器中會留下許多難以利用的小空閑區(qū)。</p><p>  最壞適應算法(worst fit)</p><p>  要掃描整個空閑分區(qū)表或鏈表,總是挑選一個最大的空閑區(qū)分割給作業(yè)使用,其優(yōu)點是可使剩下的空閑區(qū)不至于太小,產生碎片的幾率最小,對中小作業(yè)有力,查找效率很高。但是它會使存儲器中缺乏大的空閑分區(qū)。</p><p><b>

13、  回收內存</b></p><p>  當進程運行完畢釋放內存時,系統(tǒng)根據會收取的首址,從空閑區(qū)鏈中找到相應的插入點,并考慮回收區(qū)前后是否有空閑分區(qū),如果有,則把兩個分區(qū)合并成一個大的空閑分區(qū)。</p><p><b>  5、庫函數的介紹</b></p><p>  1)stdio 就是指 “standard buffered

14、input&output" 意思就是說帶緩沖的標準輸入輸出! 所以了,用到標準輸入輸出函數時,就要調用這個頭文件!</p><p>  2)Stdlib.h即standard library 標準庫文件。Stdlib頭文件里包含了C,C++語言的最常用的系統(tǒng)函數。Stdlib.h里面定義了五中類型,一些宏和通用工具函數。 類型例如:size_t ,wchar_t, div_t, ldiv_t,l

15、ldiv_t; 宏例如:EXIT_FALIRE,EXIT_SUCCESS,RAND_MAX和MB_CUR_MAX。</p><p>  以下是一些常用的函數:dec 置基數為10 相當于"%d";hex 置基數為16 相當于"%X";oct 置基數為8 相當于"%o";setw(n) 設域寬為n個字符</p><p>  課題設計

16、:總體結構、所使用的數據結構、主要功能的流程圖、程序的技術路線</p><p><b>  總體結構</b></p><p>  本系統(tǒng)采用了首次適應算法、最佳適應算法和最壞適應算法模擬存儲器動態(tài)分區(qū)。系統(tǒng)利用其中某種分配算法,從空閑分區(qū)鏈中找到滿足請求內存大小的分區(qū)并分配內存給作業(yè)。假設總的內存大小為size,作業(yè)請求的內存大小為request,內存碎片最小為f。當

17、request>size時,內存溢出,出現(xiàn)系統(tǒng)錯誤;當request<=size時,在內存中根據上述算法尋找最佳的內存分區(qū)分配給作業(yè)。尋找到合適的內存分區(qū)之后,如果size-request<=f,將此分區(qū)上的內存全部分配給作業(yè);如果size-request>f,就在此分區(qū)上分割request大小的內存給作業(yè),剩余內存繼續(xù)留在當前的分區(qū)中。當進程運行完畢,系統(tǒng)找到該進程并釋放其內存,根據所釋放內存的位置對內存進行合

18、并。</p><p><b>  系統(tǒng)流程圖:如圖1</b></p><p><b>  系統(tǒng)框架圖:如圖2</b></p><p><b>  數據結構</b></p><p> ?。?)定義的全局變量:</p><p>  #define SIZE

19、1000 // 內存初始大小</p><p>  #define MINSIZE 5 // 碎片最小值</p><p>  enum STATE { Free, Busy }//枚舉類型,記錄分區(qū)是否空閑的狀態(tài)量</p><p> ?。?)定義的結構體:struct subAreaNode。記錄分區(qū)的主要數據。</p><p

20、><b> ?。?)函數</b></p><p>  1)void intSubArea():分配初始分區(qū)內存。</p><p>  2)int firstFit(int taskId, int size):首次適應算法實現(xiàn)函數,taskId為作業(yè)名,size為作業(yè)申請的內存大小。</p><p>  3)int bestFit(int

21、taskId, int size):最佳適應算法實現(xiàn)函數,taskId為作業(yè)名,size為作業(yè)申請的內存大小。</p><p>  4)int worstFit(int taskId, int size):最壞適應算法實現(xiàn)函數,taskId為作業(yè)名,size為作業(yè)申請的內存大小。</p><p>  5)int freeSubArea(int taskId):內存回收函數,該函數主要用于實

22、現(xiàn)內存的回收,根據回收內存的位置對分區(qū)進行合并操作。其中taskId為所需回收內存的作業(yè)號。</p><p>  6)void showSubArea():顯示空閑分區(qū)鏈情況。包括起始地址 ,空間大小 。工作狀態(tài) 。作業(yè)號。</p><p>  7)int main():主函數,主要用于顯示操作界面,調用各個子函數等功能。</p><p>  3、主要功能的流程圖&

23、lt;/p><p>  (1)首次適應算法First_fit(int,int); 流程圖(圖3)</p><p> ?。?)最佳適應算法Best_fit(int,int); 流程圖(圖4)</p><p> ?。?)最壞適應算法Worst_fit(int,int); 流程圖(圖5)</p><p><b>  程序的技術路線</b

24、></p><p>  本程序采用C語言編寫,在windows下的Visual C++中編譯,模擬可變分區(qū)存儲管理方式的內存分配與回收。假定系統(tǒng)的最大內存空間為1000kb,判斷是否劃分空閑區(qū)的最小限值為MINSIZE=5。初始化用戶可占用內存區(qū)的首地址為0,大小為0B。定義一個結構體及其對象subHead實現(xiàn)內存的分配回收及分配表和空閑表的登記。用最佳分配算法實現(xiàn)動態(tài)分配時,調用int bestFit(i

25、nt taskId, int size)內存分配函數,設定循環(huán)條件查找最佳空閑分區(qū),根據找到的空閑區(qū)大小和作業(yè)大小判斷是整個分配給作業(yè)還是切割空閑區(qū)后再分配給作業(yè),并在“內存分配表”和“空閑分區(qū)表”中作登記。調用int freeSubArea(int taskId)函數實現(xiàn)內存的回收。順序循環(huán)“內存分配表”找到要回收的作業(yè),設置標志位flag,當flag=1時表示回收成功?;厥諆却鏁r需考慮內存的4種合并方式,即合并上下分區(qū)、合并上分區(qū)、

26、合并下分區(qū)、上下分區(qū)都不合并。</p><p>  帶有詳細注解的源程序</p><p>  #include<stdio.h></p><p>  #include<time.h></p><p>  #include<stdlib.h></p><p>  #define SIZ

27、E 1000 // 內存初始大小</p><p>  #define MINSIZE 5 // 碎片最小值</p><p>  enum STATE { Free, Busy };</p><p>  static int ss=0,ee=0;</p><p>  struct subAreaNode {<

28、;/p><p>  int addr; // 起始地址</p><p>  int size; // 分區(qū)大小</p><p>  int taskId; // 作業(yè)號</p><p>  STATE state; // 分區(qū)狀態(tài)</p&g

29、t;<p>  subAreaNode *pre; // 分區(qū)前向指針</p><p>  subAreaNode *nxt; // 分區(qū)后向指針</p><p><b>  }subHead;</b></p><p>  // 初始化空閑分區(qū)鏈</p><p>  void int

30、SubArea()</p><p>  {// 分配初始分區(qū)內存</p><p>  subAreaNode *fir = (subAreaNode *)malloc(sizeof(subAreaNode));</p><p>  // 給首個分區(qū)賦值</p><p>  fir->addr = 0;</p><

31、p>  fir->size = SIZE;</p><p>  fir->state = Free;</p><p>  fir->taskId = -1;</p><p>  fir->pre = &subHead;</p><p>  fir->nxt = NULL;</

32、p><p>  // 初始化分區(qū)頭部信息</p><p>  subHead.pre = NULL;</p><p>  subHead.nxt = fir;</p><p><b>  }</b></p><p><b>  // 首次適應算法</b></p>&

33、lt;p>  int firstFit(int taskId, int size)</p><p>  { subAreaNode *p = subHead.nxt;</p><p>  while(p != NULL)</p><p><b>  {</b></p><p>  if(p->state

34、 == Free && p->size >= size) {</p><p>  // 找到要分配的空閑分區(qū)</p><p>  if(p->size - size <= MINSIZE) {</p><p><b>  // 整塊分配</b></p><p>  p->st

35、ate = Busy;</p><p>  p->taskId = taskId;</p><p><b>  } else {</b></p><p>  // 分配大小為size的區(qū)間</p><p>  subAreaNode *node = (subAreaNode *)malloc(sizeof(subA

36、reaNode));</p><p>  node->addr = p->addr + size;</p><p>  node->size = p->size - size;</p><p>  node->state = Free;</p><p>  node->taskId = -1;</p&

37、gt;<p>  // 修改分區(qū)鏈節(jié)點指針</p><p>  node->pre = p;</p><p>  node->nxt = p->nxt;</p><p>  if(p->nxt != NULL) {</p><p>  p->nxt->pre = node;</p>

38、;<p><b>  }</b></p><p>  p->nxt = node;</p><p><b>  // 分配空閑區(qū)間</b></p><p>  p->size = size;</p><p>  p->state = Busy;</p>

39、<p>  p->taskId = taskId;</p><p><b>  }</b></p><p>  printf("內存分配成功!\n");</p><p><b>  return 1;</b></p><p><b>  }</b&

40、gt;</p><p>  p = p->nxt;</p><p><b>  }</b></p><p>  printf("找不到合適的內存分區(qū),分配失敗...\n");</p><p><b>  return 0;</b></p><p>&

41、lt;b>  }</b></p><p><b>  // 最佳適應算法</b></p><p>  int bestFit(int taskId, int size)</p><p><b>  {</b></p><p>  subAreaNode *tar = NULL;&l

42、t;/p><p>  int tarSize = SIZE + 1;</p><p>  subAreaNode *p = subHead.nxt;</p><p>  while(p != NULL)</p><p>  { // 尋找最佳空閑區(qū)間</p><p>  if(p->state == Free

43、&& p->size >= size && p->size < tarSize) {</p><p><b>  tar = p;</b></p><p>  tarSize = p->size;</p><p><b>  }</b></p>&

44、lt;p>  p = p->nxt;</p><p><b>  }</b></p><p>  if(tar != NULL) {</p><p>  // 找到要分配的空閑分區(qū)</p><p>  if(tar->size - size <= MINSIZE) {</p><

45、;p><b>  // 整塊分配</b></p><p>  tar->state = Busy;</p><p>  tar->taskId = taskId;</p><p><b>  } else {</b></p><p>  // 分配大小為size的區(qū)間</p&

46、gt;<p>  subAreaNode *node = (subAreaNode *)malloc(sizeof(subAreaNode));</p><p>  node->addr = tar->addr + size;</p><p>  node->size = tar->size - size;</p><p>  

47、node->state = Free;</p><p>  node->taskId = -1;</p><p>  // 修改分區(qū)鏈節(jié)點指針</p><p>  node->pre = tar;</p><p>  node->nxt = tar->nxt;</p><p>  if(t

48、ar->nxt != NULL) {</p><p>  tar->nxt->pre = node;</p><p><b>  }</b></p><p>  tar->nxt = node;</p><p><b>  // 分配空閑區(qū)間</b></p>

49、<p>  tar->size = size;</p><p>  tar->state = Busy;</p><p>  tar->taskId = taskId;</p><p><b>  }</b></p><p>  printf("內存分配成功!\n");&l

50、t;/p><p><b>  return 1;</b></p><p><b>  } else {</b></p><p>  // 找不到合適的空閑分區(qū)</p><p>  printf("找不到合適的內存分區(qū),分配失敗...\n");</p><p>

51、<b>  return 0;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  int worstFit(int taskId, int size)</p><p><b>  {</b><

52、/p><p>  subAreaNode *tar = NULL;</p><p>  int tarSize;</p><p><b>  int mm=1;</b></p><p>  subAreaNode *p = subHead.nxt;</p><p>  while(p != NULL&

53、amp;&mm==1)</p><p>  { // 尋找最佳空閑區(qū)間</p><p>  if(p->state == Free && p->size >= size) {</p><p><b>  tar = p;</b></p><p>  tarSize = p-

54、>size;</p><p><b>  mm=0;</b></p><p><b>  }</b></p><p><b>  else</b></p><p>  p = p->nxt;</p><p><b>  }</

55、b></p><p>  p=subHead.nxt;</p><p>  while(p != NULL)</p><p><b>  {</b></p><p>  // 尋找最大空閑區(qū)間</p><p>  if(p->state == Free && p-&g

56、t;size >= tarSize && p->size>=size) {</p><p><b>  tar = p; </b></p><p>  tarSize = p->size;//遍歷找到最大空閑區(qū)間</p><p><b>  p=p->nxt;</b></

57、p><p><b>  }</b></p><p><b>  else</b></p><p>  p = p->nxt;</p><p><b>  }</b></p><p>  if(tar != NULL) {</p><

58、p>  // 找到要分配的空閑分區(qū)</p><p>  if(tar->size-size<= MINSIZE) {</p><p><b>  // 整塊分配</b></p><p>  tar->state = Busy;</p><p>  tar->taskId = taskId;&

59、lt;/p><p><b>  } else {</b></p><p>  // 分配大小為size的區(qū)間 subAreaNode*node=(subAreaNode*)malloc(sizeof(subAreaNode));</p><p>  node->addr = tar->addr + size

60、;</p><p>  node->size = tar->size - size;</p><p>  node->state = Free;</p><p>  node->taskId = -1;</p><p>  // 修改分區(qū)鏈節(jié)點指針</p><p>  node->pre

61、= tar;</p><p>  node->nxt = tar->nxt;</p><p>  if(tar->nxt != NULL) {</p><p>  tar->nxt->pre = node;</p><p><b>  }</b></p><p> 

62、 tar->nxt = node;</p><p><b>  // 分配空閑區(qū)間</b></p><p>  tar->size = size;</p><p>  tar->state = Busy;</p><p>  tar->taskId = taskId;</p><

63、;p><b>  }</b></p><p>  printf("內存分配成功!\n");</p><p><b>  return 1;</b></p><p><b>  } else {</b></p><p>  // 找不到合適的空閑分區(qū)&l

64、t;/p><p>  printf("找不到合適的內存分區(qū),分配失敗...\n");</p><p><b>  return 0;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>

65、<b>  // 回收內存</b></p><p>  int freeSubArea(int taskId)</p><p><b>  {</b></p><p>  int flag = 0;</p><p>  subAreaNode *p = subHead.nxt, *pp;</p

66、><p>  while(p != NULL)</p><p><b>  {</b></p><p>  if(p->state == Busy && p->taskId == taskId) {</p><p><b>  flag = 1;</b></p>

67、<p>  if((p->pre != &subHead && p->pre->state == Free) </p><p>  && (p->nxt != NULL && p->nxt->state == Free)) {</p><p>  // 情況1:合并上下兩個分區(qū)</

68、p><p><b>  // 先合并上區(qū)間</b></p><p><b>  pp = p;</b></p><p>  p = p->pre;</p><p>  p->size += pp->size;</p><p>  p->nxt = pp-&

69、gt;nxt;</p><p>  pp->nxt->pre = p;</p><p><b>  free(pp);</b></p><p><b>  // 后合并下區(qū)間</b></p><p>  pp = p->nxt;</p><p>  p-&g

70、t;size += pp->size;</p><p>  p->nxt = pp->nxt;</p><p>  if(pp->nxt != NULL) {</p><p>  pp->nxt->pre = p;</p><p><b>  }</b></p><

71、p><b>  free(pp);</b></p><p>  } else if((p->pre == &subHead || p->pre->state == Busy)</p><p>  && (p->nxt != NULL && p->nxt->state == Free))

72、{</p><p>  // 情況2:只合并下面的分區(qū)</p><p>  pp = p->nxt;</p><p>  p->size += pp->size;</p><p>  p->state = Free;</p><p>  p->taskId = -1;</p>

73、<p>  p->nxt = pp->nxt;</p><p>  if(pp->nxt != NULL) {</p><p>  pp->nxt->pre = p;</p><p><b>  }</b></p><p><b>  free(pp);</b&g

74、t;</p><p>  } else if((p->pre != &subHead && p->pre->state == Free)</p><p>  && (p->nxt == NULL || p->nxt->state == Busy)) {</p><p>  // 情況3:只合

75、并上面的分區(qū)</p><p><b>  pp = p;</b></p><p>  p = p->pre;</p><p>  p->size += pp->size;</p><p>  p->nxt = pp->nxt;</p><p>  if(pp->

76、nxt != NULL) {</p><p>  pp->nxt->pre = p;</p><p><b>  }</b></p><p><b>  free(pp);</b></p><p><b>  } else {</b></p><

77、p>  // 情況4:上下分區(qū)均不用合并</p><p>  p->state = Free;</p><p>  p->taskId = -1;</p><p><b>  }</b></p><p><b>  }</b></p><p>  p = p

78、->nxt;</p><p><b>  }</b></p><p>  if(flag == 1) {</p><p><b>  // 回收成功</b></p><p>  printf("內存分區(qū)回收成功...\n");</p><p><

79、;b>  return 1;</b></p><p><b>  } else {</b></p><p>  // 找不到目標作業(yè),回收失敗</p><p>  printf("找不到目標作業(yè),內存分區(qū)回收失敗...\n");</p><p><b>  return 0

80、;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  /* int start(int task)</p><p><b>  {</b></p><p>  clock_t s;&l

81、t;/p><p>  s=(int)clock();</p><p><b>  return s;</b></p><p><b>  }</b></p><p>  int end(int task)</p><p><b>  {</b></p&

82、gt;<p>  clock_t s;</p><p>  s=(int)clock();</p><p><b>  return s;</b></p><p><b>  }*/</b></p><p>  // 顯示空閑分區(qū)鏈情況</p><p>  vo

83、id showSubArea()</p><p><b>  {</b></p><p>  printf("*********************************************\n");</p><p>  printf("** 當前的內存分配情況如下: **\

84、n");</p><p>  printf("*********************************************\n");</p><p>  printf("** 起始地址 | 空間大小 | 工作狀態(tài) | 作業(yè)號 **\n");</p><p>  subAreaNode *p = subH

85、ead.nxt;</p><p>  while(p != NULL)</p><p><b>  {</b></p><p>  printf("**-----------------------------------------**\n");</p><p>  printf("**&

86、quot;);</p><p>  printf("%5d k |", p->addr);</p><p>  printf("%5d k |", p->size);</p><p>  printf(" %5s |", p->state == Free ? "Fre

87、e" : "Busy");</p><p>  if(p->taskId > 0) {</p><p>  printf("%5d ", p->taskId);</p><p><b>  } else {</b></p><p>  printf(

88、" ");</p><p><b>  }</b></p><p>  printf("**\n"); </p><p>  p = p->nxt;</p><p><b>  }</b></p><p>  pri

89、ntf("*********************************************\n");</p><p><b>  }</b></p><p>  int main()</p><p><b>  {</b></p><p>  int option, o

90、pe, taskId, size;</p><p>  // 初始化空閑分區(qū)鏈</p><p>  intSubArea();</p><p><b>  // 選擇分配算法</b></p><p>  l1: while(1)</p><p><b>  {</b><

91、/p><p>  printf("**********************\n");</p><p>  printf("請選擇要模擬的分配算法:\n0 表示首次適應算法\n1 表示最佳適應算法\n2 表示最壞適應算法\n3 退出\n");</p><p>  printf("********************

92、**\n");</p><p>  scanf("%d", &option);</p><p>  system("cls");</p><p>  if(option == 0) {</p><p>  printf("你選擇了首次適應算法,下面進行算法的模擬\n"

93、;);</p><p><b>  break;</b></p><p>  } else if(option == 1) {</p><p>  printf("你選擇了最佳適應算法,下面進行算法的模擬\n");</p><p><b>  break;</b></p&g

94、t;<p>  } else if(option == 2) {</p><p>  printf("你選擇了最壞適應算法,下面進行算法的模擬\n");</p><p><b>  break;</b></p><p><b>  }</b></p><p>  e

95、lse if(option == 3){</p><p><b>  exit(0);</b></p><p><b>  }</b></p><p><b>  else {</b></p><p>  printf("錯誤:請輸入 0/1\n\n");&

96、lt;/p><p><b>  }</b></p><p><b>  }</b></p><p>  // 模擬動態(tài)分區(qū)分配算法</p><p><b>  while(1)</b></p><p><b>  {</b></p

97、><p>  printf("\n");</p><p>  printf("*********************************************\n");</p><p>  printf(" 1: 分配內存\n 2: 回收內存\n 3: 返回上一級菜單\n 0: 退出 \

98、n\n");</p><p>  printf("*********************************************\n");</p><p>  scanf("%d", &ope);</p><p>  system("cls");</p><

99、p>  if(ope == 0) break;</p><p>  if(ope == 1) {</p><p><b>  // 模擬分配內存</b></p><p>  printf("請輸入作業(yè)號: ");</p><p>  scanf("%d", &task

100、Id);</p><p>  printf("請輸入需要分配的內存大小(KB): ");</p><p>  scanf("%d", &size);</p><p>  if(size <= 0) {</p><p>  printf("錯誤:分配內存大小必須為正值\n"

101、;);</p><p><b>  continue;</b></p><p><b>  }</b></p><p><b>  // 調用分配算法</b></p><p>  if(option == 0) {</p><p>  firstFit(

102、taskId, size);</p><p>  } else if(option==1){</p><p>  bestFit(taskId, size);</p><p><b>  }</b></p><p><b>  else </b></p><p>  wor

103、stFit(taskId, size);</p><p>  // 顯示空閑分區(qū)鏈情況</p><p>  showSubArea();</p><p>  } else if(ope == 2) {</p><p><b>  // 模擬回收內存</b></p><p>  printf(&qu

104、ot;請輸入要回收的作業(yè)號: ");</p><p>  scanf("%d", &taskId);</p><p>  freeSubArea(taskId);</p><p>  // 顯示空閑分區(qū)鏈情況</p><p>  showSubArea();</p><p>  }

105、 else if(ope==3){</p><p><b>  goto l1;</b></p><p><b>  }</b></p><p><b>  else {</b></p><p>  printf("錯誤:請輸入 0/1/2\n");<

106、/p><p><b>  }</b></p><p><b>  }</b></p><p>  printf("分配算法模擬結束\n");</p><p><b>  return 0;</b></p><p><b>  }

107、</b></p><p>  運行與測試(調試通過的程序,主要測試用例和運行界面截圖)</p><p>  1.測試數據:預設總的內存大小為100k。選擇首次適應算法,分別輸入作業(yè)號及作業(yè)的大?。?,200k),(2,200k),(3,155k),(4,445k),然后回收作業(yè)2和作業(yè)4,最后退出系統(tǒng)。</p><p><b>  運行截圖如下

108、:</b></p><p><b>  主界面:圖6</b></p><p><b>  圖6</b></p><p>  2.選擇首次適應算法:圖7</p><p><b>  圖7</b></p><p>  3.利用首次適應算法分配內存

109、:圖8</p><p><b>  圖8</b></p><p><b>  回收內存:圖9</b></p><p><b>  圖9</b></p><p>  5.退出系統(tǒng):圖10</p><p><b>  圖10</b>&l

110、t;/p><p><b>  收獲及改進意見</b></p><p>  每一次的實踐,都會有很大的收獲。做這個題目的時候,就針對此題要解決的幾個問題反復思考,重新翻開教科書把相關內容特別是算法原理認真細致的看了一遍,設想會遇到的問題。在內存動態(tài)分配程序設計中,最佳適應算法比首次要難一些,要加上對分配后該分區(qū)是否能最好地利用的判斷。再一個問題是回收時候的合并,對地址的修改

111、不是很有把握。著手寫程序后,半天才理清回收的內存和上下鄰合并的條件與關系,寫此處的代碼時,邏輯上比較混亂,反復錯誤反復修改了很多次才調試正確,這也是花了最多時間才得以正確實現(xiàn)的部分。之前大多用的c語言,對結構體,對象等知識淡忘了很多,這一次的實踐讓我找回了很多學過的知識點,也彌補了很多的不足之處。邏輯思維也得到了鍛煉,寫代碼也不再像初學的時候那么繁瑣,自己都能感覺到那一點點的進步,頓時也覺得充實起來。還有一個難點就是為作業(yè)找到最佳空閑區(qū)

112、,此處是參照了一些資料后,理清了條件,然后用一個while()兩個if()語句循環(huán)嵌套就實現(xiàn)了此功能。實踐中也發(fā)現(xiàn)自身很多的不足,比如上理論課時認為已經理解了的算法原理在用代碼實踐時,發(fā)現(xiàn)還是有模糊和思考不周的地方。</p><p>  學習著,收獲著,并快樂著,這真是我的感觸。對于自身不足的地方,我也有了比較清晰的認識,對未來的發(fā)展,也有了個參照,將遇到的困難一個個跨過,并最終完成此次課程設計,真的感覺很有收獲

溫馨提示

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

評論

0/150

提交評論