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

下載本文檔

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

文檔簡介

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

2、 </p><p>  學(xué) 號: </p><p>  姓 名: </p><p>  指導(dǎo)教師: </p><p>  成 績: </p>

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

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

5、</b></p><p>  5、庫函數(shù)的介紹2</p><p><b>  四、課題設(shè)計(jì)2</b></p><p><b>  1、 總體結(jié)構(gòu)2</b></p><p><b>  2、 數(shù)據(jù)結(jié)構(gòu)4</b></p><p>  3

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

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

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

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

10、lt;p>  課題研發(fā)相關(guān)知識 (包含所用庫函數(shù)的介紹)</p><p>  首次適應(yīng)算法(first fit)</p><p>  FF算法要求空閑分區(qū)鏈以地址遞增的次序鏈接。在分配內(nèi)存時(shí),從鏈?zhǔn)组_始順序查找,直至找到一個(gè)大小能男足要求的空閑分區(qū)位置;然后再按照作業(yè)的大小,從該分區(qū)中劃出一塊內(nèi)存空間分配給請求者,余下的空閑分區(qū)仍留在空閑鏈中。若從鏈?zhǔn)字敝伶溛捕疾荒苷业揭粋€(gè)能滿足要求

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

27、E 1000 // 內(nèi)存初始大小</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ū)內(nèi)存</p><p>  subAreaNode *fir = (subAreaNode *)malloc(sizeof(subAreaNode));</p><p>  // 給首個(gè)分區(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>  // 首次適應(yīng)算法</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é)點(diǎn)指針</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èi)存分配成功!\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("找不到合適的內(nèi)存分區(qū),分配失敗...\n");</p><p><b>  return 0;</b></p><p>&

41、lt;b>  }</b></p><p><b>  // 最佳適應(yīng)算法</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é)點(diǎn)指針</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èi)存分配成功!\n");&l

50、t;/p><p><b>  return 1;</b></p><p><b>  } else {</b></p><p>  // 找不到合適的空閑分區(qū)</p><p>  printf("找不到合適的內(nèi)存分區(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é)點(diǎn)指針</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èi)存分配成功!\n");</p><p><b>  return 1;</b></p><p><b>  } else {</b></p><p>  // 找不到合適的空閑分區(qū)&l

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

65、<b>  // 回收內(nèi)存</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:合并上下兩個(gè)分區(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("內(nèi)存分區(qū)回收成功...\n");</p><p><

79、;b>  return 1;</b></p><p><b>  } else {</b></p><p>  // 找不到目標(biāo)作業(yè),回收失敗</p><p>  printf("找不到目標(biāo)作業(yè),內(nèi)存分區(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("** 當(dāng)前的內(nèi)存分配情況如下: **\

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 表示首次適應(yīng)算法\n1 表示最佳適應(yīng)算法\n2 表示最壞適應(yīng)算法\n3 退出\n");</p><p>  printf("********************

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

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

94、t;<p>  } else if(option == 2) {</p><p>  printf("你選擇了最壞適應(yīng)算法,下面進(jìn)行算法的模擬\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("錯(cuò)誤:請輸入 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èi)存\n 2: 回收內(nèi)存\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>  // 模擬分配內(nèi)存</b></p><p>  printf("請輸入作業(yè)號: ");</p><p>  scanf("%d", &task

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

101、;);</p><p><b>  continue;</b></p><p><b>  }</b></p><p><b>  // 調(diào)用分配算法</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>  // 模擬回收內(nèi)存</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("錯(cuò)誤:請輸入 0/1/2\n");<

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

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

108、:</b></p><p><b>  主界面:圖6</b></p><p><b>  圖6</b></p><p>  2.選擇首次適應(yīng)算法:圖7</p><p><b>  圖7</b></p><p>  3.利用首次適應(yīng)算法分配內(nèi)存

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

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

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

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

溫馨提示

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

最新文檔

評論

0/150

提交評論