版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 操作系統(tǒng) 實驗二 主存分配與回收
- 操作系統(tǒng)課程設(shè)計——操作系統(tǒng)課程設(shè)計模擬操作系統(tǒng)
- 操作系統(tǒng)課程設(shè)計-- 操作系統(tǒng)
- 操作系統(tǒng)課程設(shè)計之獨占設(shè)備的分配
- 操作系統(tǒng)課程設(shè)計
- 操作系統(tǒng)課程設(shè)計
- 操作系統(tǒng)課程設(shè)計---geekos操作系統(tǒng)的研究與實現(xiàn)
- 操作系統(tǒng)課程設(shè)計
- 操作系統(tǒng)課程設(shè)計
- 操作系統(tǒng)課程設(shè)計
- 操作系統(tǒng)課程設(shè)計
- 操作系統(tǒng)課程設(shè)計-- geekos操作系統(tǒng)的研究與實現(xiàn)
- 操作系統(tǒng)課程設(shè)計--模擬操作系統(tǒng)的實現(xiàn)
- 內(nèi)存管理(操作系統(tǒng))操作系統(tǒng)課程設(shè)計
- 操作系統(tǒng)linux主存管理操作系統(tǒng)實驗 5
- 課程設(shè)計---操作系統(tǒng)課程設(shè)計之linux磁盤空間管理
- 操作系統(tǒng)課程設(shè)計報告磁盤空間管理
- 操作系統(tǒng)課程設(shè)計---動態(tài)分區(qū)分配存儲管理
- 操作系統(tǒng)課程設(shè)計--基于文件分配表的文件管理系統(tǒng)
- 操作系統(tǒng)課程設(shè)計--cpu進程調(diào)度和內(nèi)存分配
評論
0/150
提交評論