版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、<p><b> 課程設計</b></p><p> 題 目:主存空間的分配與回收</p><p><b> 學生姓名: </b></p><p><b> 學 院: </b></p><p><b> 系 別: </b>&
2、lt;/p><p><b> 專 業(yè): </b></p><p><b> 班 級: </b></p><p><b> 指導教師: </b></p><p> 2011年12月30日</p><p> 課程設計任務書(三)</p&g
3、t;<p> 學院(系):信息學院計算機系 課程名稱:操作系統(tǒng)課程設計 指導教師(簽名): </p><p><b> 摘要</b></p><p> 在內存初始化完成以后,內存中就常駐有內核映象(內核代碼和數(shù)據(jù))。以后,隨著用戶程序的執(zhí)行和結束,就需要不斷地分配和釋放物理頁面。內核應該為分配一組連續(xù)的頁面而建立一種穩(wěn)定、高效的分配
4、策略。為此,必須解決一個比較重要的內存管理問題,即外碎片問題。頻繁地請求和釋放不同大小的一組連續(xù)頁面,必然導致在已分配的內存塊中分散許多小塊的空閑頁面。由此帶來的問題是,即使這些小塊的空閑頁面加起來足以滿足所請求的頁面,但是要分配一個大塊的連續(xù)頁面可能就根本無法滿足。Linux采用著名的伙伴(Buddy)系統(tǒng)算法來解決外碎片問題。但是請注意,在Linux中,CPU不能按物理地址來訪問存儲空間,而必須使用虛擬地址;因此,對于內存頁面的管理
5、,通常是先在虛存空間中分配一個虛存區(qū)間,然后才根據(jù)需要為此區(qū)間分配相應的物理頁面并建立起映射,也就是說,虛存區(qū)間的分配在前,而物理頁面的分配在后,但是為了承接上一節(jié)的內容,我們先介紹內存的分配和回收,然后再介紹用戶進程虛存區(qū)間的建立。分配效率、碎片問題是操作系統(tǒng)中內存分配的兩大問題。一個好的分配器應該能夠快速地滿足各種大小的分配要求,同時不能產(chǎn)生大量的碎片浪費空間。基于數(shù)據(jù)結</p><p> 關鍵字:操作系統(tǒng)
6、 內存分配 首次適應算法 磁盤存儲管理</p><p><b> 目錄</b></p><p> 第一章 課程設計簡介1</p><p> 1.1 課程設計的目的1</p><p> 1.2 課程設計內容2</p><p> 第二章 需求分析3</p>&l
7、t;p> 2.1 硬件需求3</p><p> 2.2 軟件需求3</p><p> 2.3 設計需求3</p><p> 第三章 概要設計4</p><p> 3.1算法設計思想4</p><p> 3.2 數(shù)據(jù)結構的設計5</p><p> 第四章 詳細設計
8、6</p><p> 4.1 菜單模塊6</p><p> 4.2 分配方法模塊8</p><p> 4.2.1首次適應算法分配概念8</p><p> 4.2.2 數(shù)據(jù)流程圖8</p><p> 4.2.3 核心代碼8</p><p> 4.3 內存釋放模塊9</
9、p><p><b> 4.3.1概念9</b></p><p> 4.3.2 釋放區(qū)與上下臨界區(qū)的關系9</p><p> 4.3.3 數(shù)據(jù)流程圖10</p><p> 4.3.4 核心代碼11</p><p> 第五章 程序運行問題及解決辦法結果13</p><
10、;p> 5.1 程序運行出現(xiàn)的問題及解決辦法問題13</p><p> 5.2運行結果截圖13</p><p> 六.課程總結與體會心得18</p><p> 6.1課程設計心得18</p><p><b> 6.2 總結18</b></p><p><b>
11、 6.3致謝18</b></p><p><b> 七.參考文獻19</b></p><p><b> 源代碼20</b></p><p> 第一章 課程設計簡介</p><p> 1.1 課程設計的目的</p><p> 通過該課程設計使學生理解
12、在不同的存儲管理方式下,以及使學生加深對如何實現(xiàn)主存空間的分配與回收原理的理解。也使學生初步具有研究、設計、編制和調試操作系統(tǒng)模塊的能力。</p><p> 1.2 課程設計內容</p><p> 編程序實現(xiàn)下述在不同的存儲管理方式下的主存空間的分配與回收,其中原始數(shù)據(jù)設為空閑區(qū)說明表結構體</p><p> (1).設計基于空閑區(qū)說明表的可變分區(qū)分配與回收算
13、法;</p><p> (2).或設計基于空閑區(qū)鏈表的可變分區(qū)的分配與回收;</p><p><b> 第二章 需求分析</b></p><p><b> 2.1 硬件需求</b></p><p> 本系統(tǒng)適用于現(xiàn)用的各種類型的計算機,內存容量建議為128MB以上,不必配備外部附加設備<
14、;/p><p><b> 2.2 軟件需求</b></p><p> VC++6.0開發(fā)工具</p><p><b> 2.3 設計需求</b></p><p> 內存的分配與回收是內存管理的主要功能之一。無論采取哪一種管理和控制方式,能否把外存中的數(shù)據(jù)和程序調入內存,取決于內否在內存中為他們安
15、排合適的位置。因此,存儲管理模塊要為每一個并發(fā)執(zhí)行的進程分配內存空間。另外,當進程執(zhí)行結束之后,存儲管理模塊又要及時回收該進程所占用的內存資源,以便給其他進程分配空間。但由于作業(yè)大大小不一,所以系統(tǒng)為作業(yè)分配內存大小不一,在釋放時造成系統(tǒng)資源的浪費。因此,采取首次適應算法,以及那少內存的浪費。</p><p><b> 第三章 概要設計</b></p><p>&l
16、t;b> 3.1算法設計思想</b></p><p> 初始化系統(tǒng)的內存分區(qū)說明表;輸入當前作業(yè)或進程的使用內存情況,檢索系統(tǒng)內的內存分區(qū)說明表,判斷是否可分配,也就是查看是否有足夠的空閑空間,若有,則按需求量分割一部分給作業(yè);若無;則作業(yè)等待。隨著作業(yè)的裝入、完成,主存空間被分割成許多大大小小的分區(qū)。有的分區(qū)被作業(yè)占用,有的分區(qū)空閑。使用內存的分配和回收算法進行,完成所有作業(yè)或進程的內存使
17、用請求,作業(yè)完成后回收其所占用的內存給系統(tǒ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ū)說明表中應
19、有足夠的空表目項。否則造成溢出,無法登記。</p><p> 同樣,再設一個已分配區(qū)表,記錄作業(yè)或進程的主存占用情況。</p><p> (2) 當有一個新作業(yè)要求裝入主存時,必須查空閑區(qū)說明表,從中找出一個足夠大的空閑區(qū)。有時找到的空閑區(qū)可能大于作業(yè)需求量,這時應將空閑區(qū)一分為二。一個分給作業(yè);另一個仍作為空閑區(qū)留在空閑區(qū)表中。為了盡量減少由于分割造成的碎片,盡可能分配低地址部分的空
20、閑區(qū),將較大空閑區(qū)留在高地址端,以利于大作業(yè)的裝入。為此在空閑區(qū)表中,按空閑區(qū)首地址從低到高進行登記。為了便于快速查找,要不斷地對表格進行緊縮,即讓“空表目”項留在表的后部。</p><p> (3) 當一個作業(yè)執(zhí)行完成時,作業(yè)所占用的分區(qū)應歸還給系統(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ù)結構的設計</p><p> 3.2.1 區(qū)說明表的設計</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> 說明:設置空閑區(qū)為結構體類型,并且為其初始化,構成空閑區(qū)表的分區(qū)</p><p> 3.2.2 已分配區(qū)說明表設計</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> 說明:設置已分配區(qū)說明表為結構體類型,構成已分配區(qū)表的分區(qū) </p><p><b> 第四章 詳細設計</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)原有內存空閑區(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 內存中沒有符合的空閑區(qū)可供分配!等待釋放內存中~~\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è)分配內存中……\n\n");</p><p> Sleep(1*1000);system("cls");</p>&
33、lt;p> printf("\n\1 系統(tǒng)為作業(yè)分配內存成功!:\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\n");</p><p> Sle
37、ep(1*1000);system("cls");</p><p> printf("\n\1 系統(tǒng)回收內存成功!:\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首次適應算法分配概念</p><p> 首次適應算法要求可用表或自由鏈按起始地址遞增的次序排列。該算法的最大特點是一旦找到大于或等于所要求內存長度的分區(qū),則結束探索
43、。然后該算法從所找到分區(qū)中畫出所要求的內存長度分配給用戶,把余下的部分進行合并(如果有相鄰空閑區(qū)存在)后留在可用表中,但要修改其相應的表項。</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 內存釋放模塊</p><p><b> 4.3.1概念</b></p><p> 當一個作業(yè)執(zhí)行完成時,作業(yè)所占用的分區(qū)應歸還給系統(tǒng)。由于每個作業(yè)或進程所用的內存長度不一樣而出現(xiàn)大量分散,較小的空閑區(qū)。這
50、樣造成內存大量的浪費。解決這個辦法之一就是在空閑區(qū)回收時,把不連續(xù)的空閑區(qū)集中起來。</p><p> 4.3.2 釋放區(qū)與上下臨界區(qū)的關系</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ū)的對應項。</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> 第五章 程序運行問題及解決辦法結果</p><p> 5.1 程序運行出現(xiàn)的問題及解決辦法問題<
69、;/p><p> ?。?)程序運行沒有按預期完成任務,解決辦法是每次在對內存的分配和會和回收之前和之后都要對空閑區(qū)按地址進行排序</p><p> ?。?)程序不能顯示作業(yè)狀況,解決辦法是為作業(yè)作一個已分配表用來存儲作業(yè)記錄</p><p> ?。?)在進行排序時,采用冒泡法進行排序</p><p><b> 5.2運行結果截圖<
70、;/b></p><p><b> ?。?)主菜單</b></p><p> ?。?)載入作業(yè)結結果</p><p><b> (1)</b></p><p><b> ?。?)</b></p><p><b> ?。?) 分配結果圖&
71、lt;/b></p><p> ?。?) 模擬系統(tǒng)回收內存</p><p> (5) 回收結果顯示</p><p><b> ?。?)</b></p><p><b> ?。?)</b></p><p><b> ?。?) 多分配結果</b>&l
72、t;/p><p><b> (7) 多回收結果</b></p><p><b> 5.8 退出系統(tǒng)</b></p><p> 六.課程總結與體會心得</p><p><b> 6.1課程設計心得</b></p><p> 在這次課程設計中,我們的收
73、獲應該說是非常大的。開始的時候我們在網(wǎng)上搜索了一些代碼。但是這個代碼語法本身有問題。但是由于對JAVA的使用不夠熟練,所以我們就用了比較熟悉的c語言。整個過程的代碼都是我們自己動腦筋寫的,最終代碼調試運行成功,但是我們還是面臨一個很大的問題就是,源程序使用C編寫的,我們如何用圖形化界面表示出來呢?我們查閱了相關資料并且動手實踐,但仍未解決,最后決定不使用圖形用戶界面。在這次實踐中,我們充分的意識到,編程功底的薄弱,只是粗淺的了解了語言,
74、只是會一些語法,在編程思想上,我們顯的很弱。在今后的學習中,一定要擴大自己的知識面,如:多從網(wǎng)上尋找可實現(xiàn)的項目,同學之間組成團隊,多學習,自己用代碼實現(xiàn);還有就是要精通一們語言,熟練掌握其數(shù)據(jù)結構,算法思想,以至于能夠熟練運用。應該說這是通過我們小組成員的共同努力和動腦完成的,雖然內容并不是很復雜,但是我們覺得設計的過程相當重要,學到了很多。我覺得課程設計反映的是一個從理論到實際應用的過程,但是更遠一點可以聯(lián)系到以后畢業(yè)之后從學校轉到
75、踏上社會的一個過程。小組人員的配合﹑相處,以及自身的動腦和努力,都是以后工作中需要的。</p><p><b> 6.2 總結</b></p><p> 在這次設計中遇到了很多實際性的問題,在實際設計中才發(fā)現(xiàn),書本上理論性的東西與在實際運用中的還是有一定距離的。一切問題必須要靠自己一點一滴的解決,而在解決的過程當中你會發(fā)現(xiàn)自己在飛速的提升。程序設計是一個很靈活的東
76、西,它反映了你解決問題的邏輯思維和創(chuàng)新能力,是一個設計的靈魂所在。通過這次課程設計我也發(fā)現(xiàn)了自身存在的不足之處,雖然感覺理論上已經(jīng)掌握,但在運用到實踐的過程中仍有意想不到的困惑,經(jīng)過一番努力才得以解決??傊?,通過這次課程設計,我真的在實踐中學到的不僅是課本知識的鞏固和提高,而且還有在實踐中使我著手解決不少程序設計的細節(jié)問題。而這些問題是我在從低級的程序員向高級程序設計師過度的過程必須要解決的。而我個人認為,我越早接觸,越多接觸,越快解決
77、對我本人縮短此過程有重要的意義。</p><p><b> 6.3致謝</b></p><p> 首先感謝兩位xx老師在這次課程設計中給予我們的指導和建議,在他的指導下我們順利的完成了本次課程設計!其次,要感謝我們同學,在我們互相幫助之下,攻克了在課程設計中遇到的一個個難關!</p><p><b> 七.參考文獻</b&
78、gt;</p><p><b> 1. 教材</b></p><p> [1] 張堯學主編.計算機操作系統(tǒng)教程(第三版).北京:清華大學出版社,2006</p><p><b> 2. 主要參考書 </b></p><p> [1] 張堯學編.計算機操作系統(tǒng)教程(第三版)習題解答與實驗指導.
79、北京:清華大學出版社,2006</p><p> [2] 湯子瀛主編.計算機操作系統(tǒng)(第三版).西安:西安電子科技大學出版社,2001 </p><p> [3] 張坤等編.操作系統(tǒng)實驗教程.北京:清華大學出版社,2008</p><p> [4] 張麗芬等編.操作系統(tǒng)實驗教程.北京:清華大學出版社,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)基礎(第三版).北京:清華大學出版社,2000</p><p> [7] 馮耀霖等編.操作系統(tǒng).西安:西安電子科技大學出版社,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ū)說明表結構,并初始化變量*/</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");</p><p> printf("*
88、 *\n");</p><p> printf("* 3.顯示分配回收結果 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ū)的標志,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)原有內存空閑區(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 內存中沒有符合的空閑區(qū)可供分配!等待釋放內存中~~\n");</p><p> Sleep(1*1000);system("cls");</p>
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 操作系統(tǒng) 實驗二 主存分配與回收
- 操作系統(tǒng)課程設計——操作系統(tǒng)課程設計模擬操作系統(tǒng)
- 操作系統(tǒng)課程設計-- 操作系統(tǒng)
- 操作系統(tǒng)課程設計之獨占設備的分配
- 操作系統(tǒng)課程設計
- 操作系統(tǒng)課程設計
- 操作系統(tǒng)課程設計---geekos操作系統(tǒng)的研究與實現(xiàn)
- 操作系統(tǒng)課程設計
- 操作系統(tǒng)課程設計
- 操作系統(tǒng)課程設計
- 操作系統(tǒng)課程設計
- 操作系統(tǒng)課程設計-- geekos操作系統(tǒng)的研究與實現(xiàn)
- 操作系統(tǒng)課程設計--模擬操作系統(tǒng)的實現(xiàn)
- 內存管理(操作系統(tǒng))操作系統(tǒng)課程設計
- 操作系統(tǒng)linux主存管理操作系統(tǒng)實驗 5
- 課程設計---操作系統(tǒng)課程設計之linux磁盤空間管理
- 操作系統(tǒng)課程設計報告磁盤空間管理
- 操作系統(tǒng)課程設計---動態(tài)分區(qū)分配存儲管理
- 操作系統(tǒng)課程設計--基于文件分配表的文件管理系統(tǒng)
- 操作系統(tǒng)課程設計--cpu進程調度和內存分配
評論
0/150
提交評論