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

下載本文檔

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

文檔簡介

1、<p><b>  課程設(shè)計</b></p><p>  題 目:主存空間的分配與回收</p><p><b>  學(xué)生姓名: </b></p><p><b>  學(xué) 院: </b></p><p><b>  系 別: </b>&

2、lt;/p><p><b>  專 業(yè): </b></p><p><b>  班 級: </b></p><p><b>  指導(dǎo)教師: </b></p><p>  2011年12月30日</p><p>  課程設(shè)計任務(wù)書(三)</p&g

3、t;<p>  學(xué)院(系):信息學(xué)院計算機系 課程名稱:操作系統(tǒng)課程設(shè)計 指導(dǎo)教師(簽名): </p><p><b>  摘要</b></p><p>  在內(nèi)存初始化完成以后,內(nèi)存中就常駐有內(nèi)核映象(內(nèi)核代碼和數(shù)據(jù))。以后,隨著用戶程序的執(zhí)行和結(jié)束,就需要不斷地分配和釋放物理頁面。內(nèi)核應(yīng)該為分配一組連續(xù)的頁面而建立一種穩(wěn)定、高效的分配

4、策略。為此,必須解決一個比較重要的內(nèi)存管理問題,即外碎片問題。頻繁地請求和釋放不同大小的一組連續(xù)頁面,必然導(dǎo)致在已分配的內(nèi)存塊中分散許多小塊的空閑頁面。由此帶來的問題是,即使這些小塊的空閑頁面加起來足以滿足所請求的頁面,但是要分配一個大塊的連續(xù)頁面可能就根本無法滿足。Linux采用著名的伙伴(Buddy)系統(tǒng)算法來解決外碎片問題。但是請注意,在Linux中,CPU不能按物理地址來訪問存儲空間,而必須使用虛擬地址;因此,對于內(nèi)存頁面的管理

5、,通常是先在虛存空間中分配一個虛存區(qū)間,然后才根據(jù)需要為此區(qū)間分配相應(yīng)的物理頁面并建立起映射,也就是說,虛存區(qū)間的分配在前,而物理頁面的分配在后,但是為了承接上一節(jié)的內(nèi)容,我們先介紹內(nèi)存的分配和回收,然后再介紹用戶進程虛存區(qū)間的建立。分配效率、碎片問題是操作系統(tǒng)中內(nèi)存分配的兩大問題。一個好的分配器應(yīng)該能夠快速地滿足各種大小的分配要求,同時不能產(chǎn)生大量的碎片浪費空間。基于數(shù)據(jù)結(jié)</p><p>  關(guān)鍵字:操作系統(tǒng)

6、 內(nèi)存分配 首次適應(yīng)算法 磁盤存儲管理</p><p><b>  目錄</b></p><p>  第一章 課程設(shè)計簡介1</p><p>  1.1 課程設(shè)計的目的1</p><p>  1.2 課程設(shè)計內(nèi)容2</p><p>  第二章 需求分析3</p>&l

7、t;p>  2.1 硬件需求3</p><p>  2.2 軟件需求3</p><p>  2.3 設(shè)計需求3</p><p>  第三章 概要設(shè)計4</p><p>  3.1算法設(shè)計思想4</p><p>  3.2 數(shù)據(jù)結(jié)構(gòu)的設(shè)計5</p><p>  第四章 詳細(xì)設(shè)計

8、6</p><p>  4.1 菜單模塊6</p><p>  4.2 分配方法模塊8</p><p>  4.2.1首次適應(yīng)算法分配概念8</p><p>  4.2.2 數(shù)據(jù)流程圖8</p><p>  4.2.3 核心代碼8</p><p>  4.3 內(nèi)存釋放模塊9</

9、p><p><b>  4.3.1概念9</b></p><p>  4.3.2 釋放區(qū)與上下臨界區(qū)的關(guān)系9</p><p>  4.3.3 數(shù)據(jù)流程圖10</p><p>  4.3.4 核心代碼11</p><p>  第五章 程序運行問題及解決辦法結(jié)果13</p><

10、;p>  5.1 程序運行出現(xiàn)的問題及解決辦法問題13</p><p>  5.2運行結(jié)果截圖13</p><p>  六.課程總結(jié)與體會心得18</p><p>  6.1課程設(shè)計心得18</p><p><b>  6.2 總結(jié)18</b></p><p><b> 

11、 6.3致謝18</b></p><p><b>  七.參考文獻19</b></p><p><b>  源代碼20</b></p><p>  第一章 課程設(shè)計簡介</p><p>  1.1 課程設(shè)計的目的</p><p>  通過該課程設(shè)計使學(xué)生理解

12、在不同的存儲管理方式下,以及使學(xué)生加深對如何實現(xiàn)主存空間的分配與回收原理的理解。也使學(xué)生初步具有研究、設(shè)計、編制和調(diào)試操作系統(tǒng)模塊的能力。</p><p>  1.2 課程設(shè)計內(nèi)容</p><p>  編程序?qū)崿F(xiàn)下述在不同的存儲管理方式下的主存空間的分配與回收,其中原始數(shù)據(jù)設(shè)為空閑區(qū)說明表結(jié)構(gòu)體</p><p>  (1).設(shè)計基于空閑區(qū)說明表的可變分區(qū)分配與回收算

13、法;</p><p>  (2).或設(shè)計基于空閑區(qū)鏈表的可變分區(qū)的分配與回收;</p><p><b>  第二章 需求分析</b></p><p><b>  2.1 硬件需求</b></p><p>  本系統(tǒng)適用于現(xiàn)用的各種類型的計算機,內(nèi)存容量建議為128MB以上,不必配備外部附加設(shè)備<

14、;/p><p><b>  2.2 軟件需求</b></p><p>  VC++6.0開發(fā)工具</p><p><b>  2.3 設(shè)計需求</b></p><p>  內(nèi)存的分配與回收是內(nèi)存管理的主要功能之一。無論采取哪一種管理和控制方式,能否把外存中的數(shù)據(jù)和程序調(diào)入內(nèi)存,取決于內(nèi)否在內(nèi)存中為他們安

15、排合適的位置。因此,存儲管理模塊要為每一個并發(fā)執(zhí)行的進程分配內(nèi)存空間。另外,當(dāng)進程執(zhí)行結(jié)束之后,存儲管理模塊又要及時回收該進程所占用的內(nèi)存資源,以便給其他進程分配空間。但由于作業(yè)大大小不一,所以系統(tǒng)為作業(yè)分配內(nèi)存大小不一,在釋放時造成系統(tǒng)資源的浪費。因此,采取首次適應(yīng)算法,以及那少內(nèi)存的浪費。</p><p><b>  第三章 概要設(shè)計</b></p><p>&l

16、t;b>  3.1算法設(shè)計思想</b></p><p>  初始化系統(tǒng)的內(nèi)存分區(qū)說明表;輸入當(dāng)前作業(yè)或進程的使用內(nèi)存情況,檢索系統(tǒng)內(nèi)的內(nèi)存分區(qū)說明表,判斷是否可分配,也就是查看是否有足夠的空閑空間,若有,則按需求量分割一部分給作業(yè);若無;則作業(yè)等待。隨著作業(yè)的裝入、完成,主存空間被分割成許多大大小小的分區(qū)。有的分區(qū)被作業(yè)占用,有的分區(qū)空閑。使用內(nèi)存的分配和回收算法進行,完成所有作業(yè)或進程的內(nèi)存使

17、用請求,作業(yè)完成后回收其所占用的內(nèi)存給系統(tǒng);并可輸出查看內(nèi)存的當(dāng)前使用狀況。</p><p>  例如,某時刻主存空間占用情況如圖3-1所示。</p><p>  (1) 為了說明哪些分區(qū)是空閑的,可以用來裝入新作業(yè),必須要有一張空閑區(qū)說明表,如表3-1所示。</p><p>  3-1主存空間占用情況 表3-1 空閑

18、區(qū)說明表</p><p>  其中,起始地址指出各空閑區(qū)的主存起始地址,長度指出空閑區(qū)大小。</p><p><b>  狀態(tài)有:</b></p><p>  未分配:該欄目是記錄的有效空閑區(qū)。</p><p>  空表目:沒有登記信息。</p><p>  由于分區(qū)個數(shù)不定,所以空閑區(qū)說明表中應(yīng)

19、有足夠的空表目項。否則造成溢出,無法登記。</p><p>  同樣,再設(shè)一個已分配區(qū)表,記錄作業(yè)或進程的主存占用情況。</p><p>  (2) 當(dāng)有一個新作業(yè)要求裝入主存時,必須查空閑區(qū)說明表,從中找出一個足夠大的空閑區(qū)。有時找到的空閑區(qū)可能大于作業(yè)需求量,這時應(yīng)將空閑區(qū)一分為二。一個分給作業(yè);另一個仍作為空閑區(qū)留在空閑區(qū)表中。為了盡量減少由于分割造成的碎片,盡可能分配低地址部分的空

20、閑區(qū),將較大空閑區(qū)留在高地址端,以利于大作業(yè)的裝入。為此在空閑區(qū)表中,按空閑區(qū)首地址從低到高進行登記。為了便于快速查找,要不斷地對表格進行緊縮,即讓“空表目”項留在表的后部。</p><p>  (3) 當(dāng)一個作業(yè)執(zhí)行完成時,作業(yè)所占用的分區(qū)應(yīng)歸還給系統(tǒng)。在歸還時要考慮相鄰空閑區(qū)合并的問題。作業(yè)的釋放區(qū)與空閑區(qū)的鄰接分以下4種情況考慮:</p><p>  A.釋放區(qū)下鄰(低地址鄰接)空閑

21、區(qū);</p><p>  B.釋放區(qū)上鄰(高地址鄰接)空閑區(qū);</p><p>  C.釋放區(qū)上下都與空閑區(qū)鄰接;</p><p>  D.釋放區(qū)與空閑區(qū)不鄰接。</p><p>  3.2 數(shù)據(jù)結(jié)構(gòu)的設(shè)計</p><p>  3.2.1 區(qū)說明表的設(shè)計</p><p>  struct fre

22、earea</p><p><b>  { </b></p><p>  int startaddress; /*空閑區(qū)的起始地址號*/int size; /*空閑區(qū)的大小*/</p><p>  int state; /*空閑區(qū)狀態(tài):0為

23、空表目,1為可用空閑塊*/}freeblock[N]={{100,100,1},{10,10,1},{300,50,0},{20,35,1},{250 ,30,1},{600,200,0}};</p><p>  說明:設(shè)置空閑區(qū)為結(jié)構(gòu)體類型,并且為其初始化,構(gòu)成空閑區(qū)表的分區(qū)</p><p>  3.2.2 已分配區(qū)說明表設(shè)計</p>

24、<p>  struct fullarea</p><p><b>  {</b></p><p>  int address; /*分配作業(yè)的首地址*/</p><p>  int sizes; /*分配作業(yè)的大小*/</p><p>  }fullblock[

25、N];</p><p>  說明:設(shè)置已分配區(qū)說明表為結(jié)構(gòu)體類型,構(gòu)成已分配區(qū)表的分區(qū) </p><p><b>  第四章 詳細(xì)設(shè)計</b></p><p><b>  4.1 菜單模塊</b></p><p>  為了操作界面的人性化和美觀,為模擬系統(tǒng)開辟一個操作菜單,通過switch()

26、case的方法來實現(xiàn),其核心代碼為</p><p>  int start;</p><p><b>  char t;</b></p><p><b>  while(c)</b></p><p><b>  {</b></p><p>  syste

27、m("cls");</p><p><b>  muen();</b></p><p>  printf("請選擇操作編號:");</p><p>  scanf("%d",&b);</p><p><b>  switch(b)<

28、/b></p><p><b>  {</b></p><p><b>  case 1:</b></p><p>  system("cls");</p><p>  printf("\n系統(tǒng)原有內(nèi)存空閑區(qū)分表和已分配表區(qū)如下:\n\n");<

29、/p><p>  order();order1();show();</p><p>  printf("\n請輸入作業(yè)申請量:");</p><p>  scanf("%d",&a);</p><p><b>  order();</b></p><p>

30、;  start=alloc(a,d);d++;</p><p>  if(start==-1)</p><p><b>  {</b></p><p>  system("cls");</p><p>  printf("\n\1 內(nèi)存中沒有符合的空閑區(qū)可供分配!等待釋放內(nèi)存中~~\n

31、");</p><p>  Sleep(1*1000);system("cls");</p><p><b>  show();</b></p><p>  setfree();</p><p><b>  break;</b></p><p>

32、<b>  }</b></p><p>  system("cls");</p><p>  printf("\n\1 系統(tǒng)采用最佳適應(yīng)算法正在為作業(yè)分配內(nèi)存中……\n\n");</p><p>  Sleep(1*1000);system("cls");</p>&

33、lt;p>  printf("\n\1 系統(tǒng)為作業(yè)分配內(nèi)存成功!:\n\n");</p><p>  order();order1();</p><p>  Sleep(1*1000);system("cls");</p><p><b>  break;</b></p><

34、;p><b>  case 2:</b></p><p>  system("cls");</p><p>  order();show();setfree();system("cls");</p><p><b>  order1();</b></p><

35、p>  for(i=0;i<N;i++)</p><p><b>  {</b></p><p>  if(fullblock[i].address==0)</p><p><b>  {</b></p><p><b>  d=i;</b></p>

36、<p><b>  break;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  printf("\n\1 系統(tǒng)正在回收為作業(yè)分配的內(nèi)存中……\n\n");</p><p>  Sle

37、ep(1*1000);system("cls");</p><p>  printf("\n\1 系統(tǒng)回收內(nèi)存成功!:\n\n");</p><p><b>  order();</b></p><p>  Sleep(1*1000);system("cls");</p&g

38、t;<p><b>  break;</b></p><p><b>  case 3:</b></p><p>  system("cls");</p><p>  t=getchar();</p><p>  printf("\n");<

39、;/p><p><b>  order();</b></p><p><b>  show();</b></p><p>  printf("\n\1 按回車鍵返回主菜單~\n\n");</p><p>  if((t=getchar())=='\n')<

40、/p><p><b>  break;</b></p><p><b>  case 0:</b></p><p><b>  if(b==0)</b></p><p><b>  c=0;</b></p><p><b> 

41、 break;</b></p><p><b>  default: </b></p><p>  system("cls");</p><p>  printf("\n輸入有誤,請重新選擇!\n");</p><p>  Sleep(2*1000);system

42、("cls");}</p><p><b>  } </b></p><p>  4.2 分配方法模塊</p><p>  4.2.1首次適應(yīng)算法分配概念</p><p>  首次適應(yīng)算法要求可用表或自由鏈按起始地址遞增的次序排列。該算法的最大特點是一旦找到大于或等于所要求內(nèi)存長度的分區(qū),則結(jié)束探索

43、。然后該算法從所找到分區(qū)中畫出所要求的內(nèi)存長度分配給用戶,把余下的部分進行合并(如果有相鄰空閑區(qū)存在)后留在可用表中,但要修改其相應(yīng)的表項。</p><p>  4.2.2 數(shù)據(jù)流程圖</p><p>  4.2.3 核心代碼</p><p>  int alloc(int a,int b)

44、 </p><p>  { int i,j,tag=0;j=b;</p><p>  for(i=0;i<N;i++)</p><p>  if(freeblock[i].state==1&&freeblock[i].size>a) </p><p>  {

45、 freeblock[i].startaddress=freeblock[i].startaddress+a;</p><p>  freeblock[i].size=freeblock[i].size-a;</p><p>  fullblock[j].address=freeblock[i].startaddress-a;</p><p>  fullblo

46、ck[j].sizes=a;</p><p>  tag=1;</p><p>  return freeblock[i].startaddress-a;</p><p><b>  break;</b></p><p><b>  }</b></p>&

47、lt;p><b>  else</b></p><p>  if (freeblock[i].state==1&&freeblock[i].size==a)</p><p>  { freeblock[i].state=0;</p><p>  fullblock[j].address=freeblock[i].start

48、address;</p><p>  fullblock[j].sizes=a;</p><p>  tag=1;</p><p>  return freeblock[i].startaddress;</p><p><b>  break;}</b></p>&

49、lt;p>  if(tag==0)</p><p>  return -1;}</p><p>  4.3 內(nèi)存釋放模塊</p><p><b>  4.3.1概念</b></p><p>  當(dāng)一個作業(yè)執(zhí)行完成時,作業(yè)所占用的分區(qū)應(yīng)歸還給系統(tǒng)。由于每個作業(yè)或進程所用的內(nèi)存長度不一樣而出現(xiàn)大量分散,較小的空閑區(qū)。這

50、樣造成內(nèi)存大量的浪費。解決這個辦法之一就是在空閑區(qū)回收時,把不連續(xù)的空閑區(qū)集中起來。</p><p>  4.3.2 釋放區(qū)與上下臨界區(qū)的關(guān)系</p><p>  A.釋放區(qū)下鄰(低地址鄰接)空閑區(qū):將釋放區(qū)與下空閑區(qū)合并,將其釋放區(qū)的首地址作為合并區(qū)的首地址,合并區(qū)的長度為釋放區(qū)與下空閑區(qū)長度之和。</p><p>  B.釋放區(qū)上鄰(高地址鄰接)空閑區(qū):將釋放區(qū)

51、與下空閑區(qū)合并,將其上臨區(qū)的首地址作為合并區(qū)的首地址,合并區(qū)的長度為釋放區(qū)與下空閑區(qū)長度之和。</p><p>  C.釋放區(qū)上下都與空閑區(qū)鄰接:釋放區(qū)作為一個新的可用區(qū)插入可用表。</p><p>  D.釋放區(qū)與空閑區(qū)不鄰接:將三個空閑區(qū)合并為一個空閑區(qū),新空閑區(qū)的首地址為上空閑區(qū)的首地址,大小為三個空閑區(qū)之和。合并后,取消可用表下空閑區(qū),修改上空閑區(qū)的對應(yīng)項。</p>

52、<p>  4.3.3 數(shù)據(jù)流程圖</p><p>  4.3.4 核心代碼</p><p>  voidsetfree() { </p><p>  int s,l,i,j,k; /*tagl代表

53、釋放區(qū)的高地址是否鄰接一個空閑區(qū),tag2代表釋放區(qū)的高低地址是否都鄰接一個空閑區(qū),tag3代表釋放區(qū)的低地址是否鄰接一個空閑區(qū)*/</p><p>  printf("\n\n請輸入需要釋作業(yè)的首地址:");</p><p>  scanf("%d",&s); /*輸入釋放區(qū)的開始地址*/</p&g

54、t;<p>  printf("\n輸入作業(yè)的大小:");</p><p>  scanf( "%d",&l);/*輸入釋放區(qū)的大小*/</p><p>  for(k=0;k<N;k++)</p><p><b>  {</b></p>

55、;<p>  if(fullblock[k].address==s)</p><p><b>  {</b></p><p>  if(fullblock[k].sizes==l)</p><p><b>  {</b></p><p>  fullblock[k].address=0

56、;</p><p>  fullblock[k].sizes=0;</p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</

57、b></p><p>  fullblock[k].sizes=fullblock[k].sizes-l;</p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  }</b></p><p&

58、gt;  if(k==N-1)</p><p><b>  {</b></p><p>  printf("\n輸入釋放作業(yè)開始地址不存在,請重新輸入!");</p><p>  setfree();</p><p><b>  return;</b></p>&l

59、t;p><b>  }</b></p><p><b>  }</b></p><p>  for(i=0;i<N;i++) </p><p><b>  {</b></p><p>  if(freeblock[i].startaddress+freeblock[

60、i].size==s&&freeblock[i].state==1)</p><p><b>  {</b></p><p>  for(j=i+1;j<N;j++)</p><p><b>  {</b></p><p>  if(freeblock[j].startaddr

61、ess==s+l&& freeblock[j].state==1)</p><p><b>  {</b></p><p>  freeblock[i].size=freeblock[i].size+l+freeblock[j].size;</p><p>  freeblock[j].state=0;</p>&

62、lt;p><b>  return;</b></p><p><b>  }</b></p><p>  freeblock[i].size=freeblock[i].size+l;</p><p>  freeblock[i].state=1;</p><p><b>  retu

63、rn;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  for(j=0;j

64、<N;j++)</p><p><b>  {</b></p><p>  if(freeblock[j].startaddress==s+l&& freeblock[j].state==1)</p><p><b>  {</b></p><p>  freeblock[j]

65、.startaddress=s;</p><p>  freeblock[j].size=freeblock[j].size+l;</p><p><b>  return;</b></p><p><b>  }</b></p><p><b>  else</b></

66、p><p><b>  {</b></p><p>  if(freeblock[j].state==0)</p><p><b>  {</b></p><p>  freeblock[j].size=l;</p><p>  freeblock[j].startaddress

67、=s;</p><p>  freeblock[j].state=1;</p><p><b>  return;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</

68、b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  第五章 程序運行問題及解決辦法結(jié)果</p><p>  5.1 程序運行出現(xiàn)的問題及解決辦法問題<

69、;/p><p> ?。?)程序運行沒有按預(yù)期完成任務(wù),解決辦法是每次在對內(nèi)存的分配和會和回收之前和之后都要對空閑區(qū)按地址進行排序</p><p>  (2)程序不能顯示作業(yè)狀況,解決辦法是為作業(yè)作一個已分配表用來存儲作業(yè)記錄</p><p>  (3)在進行排序時,采用冒泡法進行排序</p><p><b>  5.2運行結(jié)果截圖<

70、;/b></p><p><b> ?。?)主菜單</b></p><p> ?。?)載入作業(yè)結(jié)結(jié)果</p><p><b> ?。?)</b></p><p><b> ?。?)</b></p><p><b> ?。?) 分配結(jié)果圖&

71、lt;/b></p><p>  (4) 模擬系統(tǒng)回收內(nèi)存</p><p> ?。?) 回收結(jié)果顯示</p><p><b>  (1)</b></p><p><b> ?。?)</b></p><p><b> ?。?) 多分配結(jié)果</b>&l

72、t;/p><p><b> ?。?) 多回收結(jié)果</b></p><p><b>  5.8 退出系統(tǒng)</b></p><p>  六.課程總結(jié)與體會心得</p><p><b>  6.1課程設(shè)計心得</b></p><p>  在這次課程設(shè)計中,我們的收

73、獲應(yīng)該說是非常大的。開始的時候我們在網(wǎng)上搜索了一些代碼。但是這個代碼語法本身有問題。但是由于對JAVA的使用不夠熟練,所以我們就用了比較熟悉的c語言。整個過程的代碼都是我們自己動腦筋寫的,最終代碼調(diào)試運行成功,但是我們還是面臨一個很大的問題就是,源程序使用C編寫的,我們?nèi)绾斡脠D形化界面表示出來呢?我們查閱了相關(guān)資料并且動手實踐,但仍未解決,最后決定不使用圖形用戶界面。在這次實踐中,我們充分的意識到,編程功底的薄弱,只是粗淺的了解了語言,

74、只是會一些語法,在編程思想上,我們顯的很弱。在今后的學(xué)習(xí)中,一定要擴大自己的知識面,如:多從網(wǎng)上尋找可實現(xiàn)的項目,同學(xué)之間組成團隊,多學(xué)習(xí),自己用代碼實現(xiàn);還有就是要精通一們語言,熟練掌握其數(shù)據(jù)結(jié)構(gòu),算法思想,以至于能夠熟練運用。應(yīng)該說這是通過我們小組成員的共同努力和動腦完成的,雖然內(nèi)容并不是很復(fù)雜,但是我們覺得設(shè)計的過程相當(dāng)重要,學(xué)到了很多。我覺得課程設(shè)計反映的是一個從理論到實際應(yīng)用的過程,但是更遠一點可以聯(lián)系到以后畢業(yè)之后從學(xué)校轉(zhuǎn)到

75、踏上社會的一個過程。小組人員的配合﹑相處,以及自身的動腦和努力,都是以后工作中需要的。</p><p><b>  6.2 總結(jié)</b></p><p>  在這次設(shè)計中遇到了很多實際性的問題,在實際設(shè)計中才發(fā)現(xiàn),書本上理論性的東西與在實際運用中的還是有一定距離的。一切問題必須要靠自己一點一滴的解決,而在解決的過程當(dāng)中你會發(fā)現(xiàn)自己在飛速的提升。程序設(shè)計是一個很靈活的東

76、西,它反映了你解決問題的邏輯思維和創(chuàng)新能力,是一個設(shè)計的靈魂所在。通過這次課程設(shè)計我也發(fā)現(xiàn)了自身存在的不足之處,雖然感覺理論上已經(jīng)掌握,但在運用到實踐的過程中仍有意想不到的困惑,經(jīng)過一番努力才得以解決??傊?,通過這次課程設(shè)計,我真的在實踐中學(xué)到的不僅是課本知識的鞏固和提高,而且還有在實踐中使我著手解決不少程序設(shè)計的細(xì)節(jié)問題。而這些問題是我在從低級的程序員向高級程序設(shè)計師過度的過程必須要解決的。而我個人認(rèn)為,我越早接觸,越多接觸,越快解決

77、對我本人縮短此過程有重要的意義。</p><p><b>  6.3致謝</b></p><p>  首先感謝兩位xx老師在這次課程設(shè)計中給予我們的指導(dǎo)和建議,在他的指導(dǎo)下我們順利的完成了本次課程設(shè)計!其次,要感謝我們同學(xué),在我們互相幫助之下,攻克了在課程設(shè)計中遇到的一個個難關(guān)!</p><p><b>  七.參考文獻</b&

78、gt;</p><p><b>  1. 教材</b></p><p>  [1] 張堯?qū)W主編.計算機操作系統(tǒng)教程(第三版).北京:清華大學(xué)出版社,2006</p><p><b>  2. 主要參考書 </b></p><p>  [1] 張堯?qū)W編.計算機操作系統(tǒng)教程(第三版)習(xí)題解答與實驗指導(dǎo).

79、北京:清華大學(xué)出版社,2006</p><p>  [2] 湯子瀛主編.計算機操作系統(tǒng)(第三版).西安:西安電子科技大學(xué)出版社,2001 </p><p>  [3] 張坤等編.操作系統(tǒng)實驗教程.北京:清華大學(xué)出版社,2008</p><p>  [4] 張麗芬等編.操作系統(tǒng)實驗教程.北京:清華大學(xué)出版社,2006</p><p>  [5]

80、 Andrew S.Tanenbaum. Modern Operating Systems, Second Edition.Englewood Cliffs,N.J,Prentice Hall, 2001</p><p>  [6] 屠祁等編.操作系統(tǒng)基礎(chǔ)(第三版).北京:清華大學(xué)出版社,2000</p><p>  [7] 馮耀霖等編.操作系統(tǒng).西安:西安電子科技大學(xué)出版社,2001&l

81、t;/p><p>  [8] 左萬歷.計算機操作系統(tǒng)教程(第二版).北京:高等教育出版社,2004</p><p><b>  源代碼</b></p><p>  #include<windows.h></p><p>  #include <stdio.h></p><p>

82、  #define N 6</p><p>  struct freearea/*定義一個空閑區(qū)說明表結(jié)構(gòu),并初始化變量*/</p><p><b>  { </b></p><p>  int startaddress;/*空閑區(qū)始址*/</p><p>  

83、int size;/*空閑區(qū)大小*/</p><p>  int state;/*空閑區(qū)狀態(tài):0為空表目,1為可用空閑塊*/</p><p>  }freeblock[N]={{100,100,1},{10,10,1},{300,50,0},{20,35,1},{250,30,1},{600,200,0}};</p>

84、;<p>  struct fullarea</p><p><b>  {</b></p><p>  int address;</p><p>  int sizes;</p><p>  }fullblock[N];</p><p>  void m

85、uen()</p><p><b>  {</b></p><p>  printf("\n**************************************************\n");</p><p>  printf("*

86、 *\n");</p><p>  printf("* \1模擬的主存空間的分配與回收\1 *\n");</p><p>  printf("* *\n");</p>&

87、lt;p>  printf("* *\n");</p><p>  printf("* 1.載入作業(yè) 2.回收內(nèi)存 *\n");</p><p>  printf("*

88、 *\n");</p><p>  printf("* 3.顯示分配回收結(jié)果 0.退出 *\n");</p><p>  printf("*

89、 *\n");</p><p>  printf("* *\n");</p><p>  printf("* *\n");</p>

90、<p>  printf("**************************************************\n");</p><p><b>  }</b></p><p>  void order()</p><p><b>  {</b></p>&l

91、t;p><b>  int j,i;</b></p><p>  struct freearea m;</p><p>  for(i=0;i<N;i++)</p><p>  for(j=i; j<N; j++)</p><p>  if(freeblock[i].sta

92、rtaddress>freeblock[j].startaddress)</p><p><b>  {</b></p><p>  m.startaddress=freeblock[j].startaddress;</p><p>  m.size=freeblock[j].size;</p><p>  m.s

93、tate=freeblock[j].state;</p><p>  freeblock[j].startaddress=freeblock[i].startaddress;</p><p>  freeblock[j].size=freeblock[i].size;</p><p>  freeblock[j].state=freeblock[i].state;&

94、lt;/p><p>  freeblock[i].startaddress=m.startaddress;</p><p>  freeblock[i].size=m.size;</p><p>  freeblock[i].state=m.state;</p><p><b>  }</b></p><

95、p>  for(i=0;i<N;i++) </p><p>  for(j=0;j<N;j++)</p><p>  if(freeblock[j].state==0 && freeblock[j+1].state==1)</p><p><b>  {</b></p>

96、<p>  m.startaddress=freeblock[j].startaddress;</p><p>  m.size=freeblock[j].size;</p><p>  m.state=freeblock[j].state;</p><p>  freeblock[j].startaddress=freeblock[j+1].starta

97、ddress;</p><p>  freeblock[j].size=freeblock[j+1].size;</p><p>  freeblock[j].state=freeblock[j+1].state;</p><p>  freeblock[j+1].startaddress=m.startaddress;</p><p>  

98、freeblock[j+1].size=m.size;</p><p>  freeblock[j+1].state=m.state;</p><p><b>  }</b></p><p><b>  }</b></p><p>  void order1()</p><p&g

99、t;<b>  {</b></p><p><b>  int j,i;</b></p><p>  struct fullarea m;</p><p>  for(i=0;i<N;i++)</p><p>  for(j=i; j<N; j++)<

100、/p><p>  if(fullblock[i].address<fullblock[j].address)</p><p><b>  {</b></p><p>  m.address=fullblock[j].address;</p><p>  m.sizes=fullblock[j].sizes;</p

101、><p>  fullblock[j].address=fullblock[i].address;</p><p>  fullblock[j].sizes=fullblock[i].sizes;</p><p>  fullblock[i].address=m.address;</p><p>  fullblock[i].sizes=m.si

102、zes;</p><p><b>  }</b></p><p><b>  }</b></p><p>  void show()</p><p><b>  {</b></p><p><b>  int

103、i;</b></p><p>  printf( "|……………………………………………||……………………………………………|\n");</p><p>  printf( "| 空閑區(qū)說明表 || 已分配區(qū)表 |\n");</p>&

104、lt;p>  printf( "| || |\n");</p><p>  printf( "|startsizestate ||start size |\n");</p>

105、<p>  printf( "|……………………………………………||……………………………………………|\n");</p><p>  for(i=0;i<N;i++)</p><p><b>  { </b></p><p>  printf( "|%3d%3d%3d ||%

106、3d %3d |\n",freeblock[i].startaddress, freeblock[i].size, freeblock[i].state,fullblock[i].address, fullblock[i].sizes);</p><p>  printf( "| ||

107、 |\n");</p><p><b>  }</b></p><p>  printf( "|……………………………………………||……………………………………………|\n");</p><p><b>  }</b></p><p&

108、gt;  int alloc(int a,int b) /*定義為作業(yè)分配主存空間的函數(shù)alloc(),a為作業(yè)申請量*/</p><p><b>  {</b></p><p>  int i,j,tag=0;/* tag為檢查是

109、否有滿足作業(yè)需要的空閑區(qū)的標(biāo)志,0表示滿,1表示未滿*/</p><p><b>  j=b;</b></p><p>  for(i=0;i<N;i++)</p><p>  if(freeblock[i].state==1&&freeblock[i].size>a) /*檢查空閑區(qū)說明表

110、是否有滿足作業(yè)要求的空閑區(qū)*/</p><p><b>  {</b></p><p>  freeblock[i].startaddress=freeblock[i].startaddress+a;</p><p>  freeblock[i].size=freeblock[i].size-a;</p><p>  f

111、ullblock[j].address=freeblock[i].startaddress-a;</p><p>  fullblock[j].sizes=a;</p><p>  tag=1;/*有滿足條件的空閑區(qū)時,tag置1*/</p><p>  return freeblock[i].startaddress-a;</p

112、><p><b>  break;</b></p><p><b>  }</b></p><p><b>  else</b></p><p>  if (freeblock[i].state==1&&freeblock[i].size==a)</p>

113、<p><b>  { </b></p><p>  freeblock[i].state=0;</p><p>  fullblock[j].address=freeblock[i].startaddress;</p><p>  fullblock[j].sizes=a;</p><p>  tag=1

114、;/*有滿足條件的空閑區(qū)時,tag置1*/</p><p>  return freeblock[i].startaddress;/*返回為作業(yè)分配的主存地址*/</p><p><b>  break;</b></p><p><b>  }</b></p>&

115、lt;p>  if(tag==0)</p><p><b>  {</b></p><p>  return -1;</p><p><b>  }</b></p><p><b>  }</b></p><p>  voidsetfree()

116、 { </p><p>  int s,l,i,j,k; /*tagl代表釋放區(qū)的高地址是否鄰接一個空閑區(qū),tag2代表釋放區(qū)的高低地址是否都鄰接一個空閑區(qū),tag3代表釋放區(qū)的低地址是否鄰接一個空閑區(qū)*/</p><p>  prin

117、tf("\n\n請輸入需要釋作業(yè)的首地址:");</p><p>  scanf("%d",&s); /*輸入釋放區(qū)的開始地址*/</p><p>  printf("\n輸入作業(yè)的大小:");</p><p>  scanf( "%d",&a

118、mp;l);/*輸入釋放區(qū)的大小*/</p><p>  for(k=0;k<N;k++)</p><p><b>  {</b></p><p>  if(fullblock[k].address==s)</p><p><b>  {</b></p>

119、;<p>  if(fullblock[k].sizes==l)</p><p><b>  {</b></p><p>  fullblock[k].address=0;</p><p>  fullblock[k].sizes=0;</p><p><b>  break;</b>

120、</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  fullblock[k].sizes=fullblock[k].sizes-l;</p><p><

121、b>  break;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  if(k==N-1)</p><p><b>  {</b></p><p>  printf("

122、;\n輸入釋放作業(yè)開始地址不存在,請重新輸入!");</p><p>  setfree();</p><p><b>  return;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>

123、  for(i=0;i<N;i++) </p><p><b>  {</b></p><p>  if(freeblock[i].startaddress+freeblock[i].size==s&&freeblock[i].state==1)</p><p><b>  {</b></p&g

124、t;<p>  for(j=i+1;j<N;j++)</p><p><b>  {</b></p><p>  if(freeblock[j].startaddress==s+l&& freeblock[j].state==1)</p><p><b>  {</b></p>

125、;<p>  freeblock[i].size=freeblock[i].size+l+freeblock[j].size;</p><p>  freeblock[j].state=0;</p><p><b>  return;</b></p><p><b>  }</b></p>&l

126、t;p>  freeblock[i].size=freeblock[i].size+l;</p><p>  freeblock[i].state=1;</p><p><b>  return;</b></p><p><b>  }</b></p><p><b>  }<

127、/b></p><p><b>  else</b></p><p><b>  {</b></p><p>  for(j=0;j<N;j++)</p><p><b>  {</b></p><p>  if(freeblock[j].s

128、tartaddress==s+l&& freeblock[j].state==1)</p><p><b>  {</b></p><p>  freeblock[j].startaddress=s;</p><p>  freeblock[j].size=freeblock[j].size+l;</p><

129、p><b>  return;</b></p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  if(freeblock[j].state==0)</p&

130、gt;<p><b>  {</b></p><p>  freeblock[j].size=l;</p><p>  freeblock[j].startaddress=s;</p><p>  freeblock[j].state=1;</p><p><b>  return;</b&

131、gt;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b>&l

132、t;/p><p><b>  }</b></p><p>  void main()</p><p><b>  {</b></p><p>  int i,b,a,d=0,c=1;</p><p>  int start;</p><p><b&g

133、t;  char t;</b></p><p><b>  while(c)</b></p><p><b>  {</b></p><p>  system("cls");</p><p><b>  muen();</b></p>

134、<p>  printf("請選擇操作編號:");</p><p>  scanf("%d",&b);</p><p><b>  switch(b)</b></p><p><b>  {</b></p><p><b>

135、;  case 1:</b></p><p>  system("cls");</p><p>  printf("\n系統(tǒng)原有內(nèi)存空閑區(qū)分表和已分配表區(qū)如下:\n\n");</p><p>  order();order1();show();</p><p>  printf("

136、;\n請輸入作業(yè)申請量:");</p><p>  scanf("%d",&a);</p><p><b>  order();</b></p><p>  start=alloc(a,d);d++;</p><p>  if(start==-1)</p><p&

137、gt;<b>  {</b></p><p>  system("cls");</p><p>  printf("\n\1 內(nèi)存中沒有符合的空閑區(qū)可供分配!等待釋放內(nèi)存中~~\n");</p><p>  Sleep(1*1000);system("cls");</p>

溫馨提示

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

評論

0/150

提交評論