版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、<p> ?。ú僮飨到y(tǒng)課程設(shè)計)</p><p><b> 連續(xù)動態(tài)分區(qū)內(nèi)存</b></p><p><b> 管理模擬實現(xiàn)</b></p><p> 學(xué)生姓名: </p><p> 學(xué)生學(xué)號: </p><
2、p> 班 級: </p><p><b> 二〇一三年十二月</b></p><p><b> 目錄</b></p><p> 《操作系統(tǒng)》課程設(shè)計....................................................... 1<
3、;/p><p> 引言......................................................................3</p><p> 課程設(shè)計目的和內(nèi)容 ...................................................... 3</p><p> 需求分析...........
4、..............................................................3</p><p> 概要設(shè)計...................................................................3</p><p> 開發(fā)環(huán)境...................................
5、..................................... 4</p><p> 系統(tǒng)分析設(shè)計..................................................................... 4</p><p> 有關(guān)了解內(nèi)存管理的相關(guān)理論.............................................
6、..... 4</p><p> 內(nèi)存管理概念........................................................................4</p><p> 內(nèi)存管理的必要性..............................................................4 </p><
7、p> 內(nèi)存的物理組織.............................................................4 </p><p> 什么是虛擬內(nèi)存.................................................................5 </p><p> 連續(xù)動態(tài)分區(qū)內(nèi)存管理方式...........
8、........................................ 5</p><p> 單一連續(xù)分配(單個分區(qū))................................................... 5</p><p> 固定分區(qū)存儲管理...........................................................
9、....5</p><p> 可變分區(qū)存儲管理(動態(tài)分區(qū)).............................................. 5 </p><p> 可重定位分區(qū)存儲管理........................................................5</p><p> 問題描述和分析.........
10、...........................................................6</p><p> 程序流程圖........................................................................6</p><p> 數(shù)據(jù)結(jié)構(gòu)體分析.............................
11、.....................................8</p><p> 主要程序代碼分析...............................................................9</p><p> 分析并實現(xiàn)四種內(nèi)存分配算法 .................................................
12、11</p><p> 最先適應(yīng)算.....................................................................11 </p><p> 下次適應(yīng)分配算法..........................................................13 </p><p> 最優(yōu)適
13、應(yīng)算法...............................................................16 </p><p> 最壞適應(yīng)算法......................................................... ......18</p><p> 回收內(nèi)存算法...........................
14、.....................................20</p><p> 調(diào)試與操作說明.................................................................22</p><p> 初始界面.........................................................
15、..............22</p><p> 模擬內(nèi)存分配...............................................................23</p><p> 已分配分區(qū)說明表面............................................................24</p><
16、p> 空閑區(qū)說明表界面.............................................................24</p><p> 回收內(nèi)存界面.....................................................................25</p><p> 重新申請內(nèi)存界面...........
17、...............................................26.</p><p> 總結(jié)與體會...................................................................... 28</p><p> 參考文獻..........................................
18、............................... 28</p><p><b> 引言</b></p><p> 操作系統(tǒng)是最重要的系統(tǒng)軟件,同時也是最活躍的學(xué)科之一。我們通過操作系統(tǒng)可以理解計算機系統(tǒng)的資源如何組織,操作系統(tǒng)如何有效地管理這些系統(tǒng)資源,用戶如何通過操作系統(tǒng)與計算機系統(tǒng)打交道。</p><p> 存儲器是計算
19、機系統(tǒng)的重要組成部分,近年來,存儲器容量雖然一直在不斷擴大,但仍不能滿足現(xiàn)代軟件發(fā)展的需要,因此,存儲器仍然是一種寶貴而又緊俏的資源。如何對它加以有效的管理,不僅直接影響到存儲器的利用率,而且還對系統(tǒng)性能有重大影響。而動態(tài)分區(qū)分配屬于連續(xù)分配的一種方式,它至今仍在內(nèi)存分配方式中占有一席之地。</p><p> 課程設(shè)計目的和內(nèi)容:</p><p> 理解內(nèi)存管理的相關(guān)理論,掌握連續(xù)動態(tài)
20、分區(qū)內(nèi)存管理的理論;通過對實際問題的編程實現(xiàn),獲得實際應(yīng)用和編程能力。 </p><p> 編寫程序?qū)崿F(xiàn)連續(xù)動態(tài)分區(qū)內(nèi)存管理方式,該程序管理一塊虛擬內(nèi)存,實現(xiàn)內(nèi)存分配和回收功能。 分析并實現(xiàn)四種內(nèi)存分配算法,即最先適應(yīng)算法,下次最先適應(yīng)算法,最優(yōu)適應(yīng)算法,最壞適應(yīng)算法。內(nèi)存分配算法和回收算法的實現(xiàn)。</p><p><b> 需求分析</b></p>
21、<p> 動態(tài)分區(qū)分配是根據(jù)進程的實際需要,動態(tài)地為之分配內(nèi)存空間。在實現(xiàn)動態(tài)分區(qū)分配時,將涉及到分區(qū)分配中所用的數(shù)據(jù)結(jié)構(gòu)、分區(qū)分配算法和分區(qū)的分配和回收操作這樣三個問題。常用的數(shù)據(jù)結(jié)構(gòu)有動態(tài)分區(qū)表和動態(tài)分區(qū)鏈。在對數(shù)據(jù)結(jié)構(gòu)有一定掌握程度的情況下設(shè)計合理的數(shù)據(jù)結(jié)構(gòu)來描述存儲空間,實現(xiàn)分區(qū)存儲管理的內(nèi)存分配功能,應(yīng)該選擇最合適的適應(yīng)算法(首次適應(yīng)算法,最佳適應(yīng)算法,最后適應(yīng)算法,最壞適應(yīng)算法),在動態(tài)分區(qū)存儲管理方式中主要實
22、現(xiàn)內(nèi)存分配和內(nèi)存回收算法,在這些存儲管理中間必然會有碎片的產(chǎn)生,當(dāng)碎片產(chǎn)生時,進行碎片的拼接等相關(guān)的內(nèi)容</p><p><b> 概要設(shè)計</b></p><p> 本程序采用機構(gòu)化模塊化的設(shè)計方法,共分為四大模塊。</p><p> ?、抛钕冗m應(yīng)算法實現(xiàn) </p><p> 從空閑分區(qū)表的第一個表目起查找該表,
23、把最先能夠滿足要求的空閑區(qū)分配給作業(yè),這種方法目的在于減少查找時間。為適應(yīng)這種算法,空閑分區(qū)表(空閑區(qū)鏈)中的空閑分區(qū)要按地址由低到高進行排序。該算法優(yōu)先使用低址部分空閑區(qū),在低址空間造成許多小的空閑區(qū),在高地址空間保留大的空閑區(qū)。</p><p> ?、葡麓芜m應(yīng)分配算法實現(xiàn)</p><p> 該算法是最先適應(yīng)算法的變種。在分配內(nèi)存空間時,不再每次從表頭(鏈?zhǔn)祝╅_始查找,而是從上次找到空
24、閑區(qū)的下一個空閑開始查找,直到找到第一個能滿足要求的的空閑區(qū)為止,并從中劃出一塊與請求大小相等的內(nèi)存空間分配給作業(yè)。該算法能使內(nèi)存中的空閑區(qū)分布得較均勻。</p><p><b> ?、亲顑?yōu)適應(yīng)算法實現(xiàn)</b></p><p> 它從全部空閑區(qū)中找出能滿足作業(yè)要求的、且大小最小的空閑分區(qū),這種方法能使碎片盡量小。為適應(yīng)此算法,空閑分區(qū)表(空閑區(qū)鏈)中的空閑分區(qū)要按從
25、小到大進行排序,自表頭開始查找到第一個滿足要求的自由分區(qū)分配。</p><p><b> ?、茸顗乃惴▽崿F(xiàn)</b></p><p> 最壞適應(yīng)分配算法要掃描整個空閑分區(qū)或鏈表,總是挑選一個最大的空閑分區(qū)分割給作業(yè)使用。該算法要求將所有的空閑分區(qū)按其容量從大到小的順序形成一空閑分區(qū)鏈,查找時只要看第一個分區(qū)能否滿足作業(yè)要求。</p><p>&
26、lt;b> 開發(fā)環(huán)境:</b></p><p> win7 下 VC++6.0</p><p><b> 系統(tǒng)分析設(shè)計: </b></p><p> 相關(guān)算法原理,算法流程圖,涉及的數(shù)據(jù)結(jié)構(gòu)內(nèi)容都相應(yīng)包含在各章節(jié)中</p><p> 有關(guān)了解內(nèi)存管理的相關(guān)理論 </p><
27、p><b> 內(nèi)存管理概念: </b></p><p> 內(nèi)存管理,是指軟件運行時對計算機內(nèi)存資源的分配和使用的技術(shù)。其最主要的目的是如何高效,快速的分配,并且在適當(dāng)?shù)臅r候釋放和回收內(nèi)存資源。內(nèi)存不是預(yù)先劃分好的,而是在系統(tǒng)運行的過程中建立分區(qū).當(dāng)作業(yè)裝入主存時,根據(jù)作業(yè)所需要的主存容量查看是否有足夠的主存空間,若有則按需要分割一個分區(qū)給該作業(yè);否則令該作業(yè)等待.分區(qū)長度不固定分區(qū)
28、個數(shù)不固定。這種存儲管理的方法克服了固定分區(qū)嚴(yán)重浪費主存的問題,提高了主存資源的利用率。</p><p><b> 內(nèi)存管理的必要性:</b></p><p> 內(nèi)存管理對于編寫出高效率的 Windows 程序是非常重要的,這是因為Windows 是多任務(wù)系統(tǒng),它的內(nèi)存管理和單任務(wù)的 DOS 相比有很大的差異。DOS是單任務(wù)操作系統(tǒng),應(yīng)用程序分配到內(nèi)存后,如果它不
29、主動釋放,系統(tǒng)是不會對它作任何改變的;但 Windows 卻不然,它在同一時刻可能有多個應(yīng)用程序共享內(nèi)存,有時為了使某個任務(wù)更好地執(zhí)行,Windows 系統(tǒng)可能會對其它任務(wù)分配的內(nèi)存進行移動,甚至刪除。因此,我們在 Windows 應(yīng)用程序中使用內(nèi)存時,要遵循Windows 內(nèi)存管理的一些約定,以盡量提高 Windows 內(nèi)存的利用率。 </p><p> 1.3 內(nèi)存的物理組織:</p><
30、;p><b> 物理地址: </b></p><p> 把內(nèi)存分成若干個大小相等的存儲單元,每個存儲單元占 8 位,稱作字節(jié)(byte)。每個單元給一個編號,這個編號稱為物理地址(內(nèi)存地址、絕對地址、實地址)。二、物理地址空間: 物理地址的集合稱為物理地址空間(主存地址空間),它是一個一維空間。</p><p><b> 什么是虛擬內(nèi)存:<
31、/b></p><p> 虛擬內(nèi)存是內(nèi)存管理技術(shù)的一個極其實用的創(chuàng)新。它是一段程序(由操作系統(tǒng)調(diào)度),持續(xù)監(jiān)控著所有物理內(nèi)存中的代碼段、數(shù)據(jù)段,并保證他們在運行中的效率以及可靠性,對于每個用戶層(user-level)的進程分配一段虛擬內(nèi)存空間。當(dāng)進程建立時,不需要在物理內(nèi)存件之間搬移數(shù)據(jù),數(shù)據(jù)儲存于磁盤內(nèi)的虛擬內(nèi)存空間,也不需要為該進程去配置主內(nèi)存空間,只有當(dāng)該進程被被調(diào)用的時候才會被加載到主內(nèi)存。&l
32、t;/p><p> 連續(xù)動態(tài)分區(qū)內(nèi)存管理方式的實現(xiàn)</p><p> 在早期的操作系統(tǒng)中,主存分配廣泛采用連續(xù)分配方式。 連續(xù)分配方式,是指為一個用戶程序分配一個連續(xù)的內(nèi)存空間,該連續(xù)內(nèi)存空間指的的是物理內(nèi)存。下面介紹連續(xù)分配的四種方式。</p><p> 單一連續(xù)分配(單個分區(qū))</p><p> 最簡單的存儲管理方式,用于多道程序設(shè)計
33、技術(shù)之前。 內(nèi)存分為系統(tǒng)區(qū)和用戶區(qū),系統(tǒng)區(qū)由操作系統(tǒng)使用。用戶區(qū)作為一個連續(xù)的分區(qū)分配給一個作業(yè)。 分區(qū)存儲管理是滿足多道程序設(shè)計的最簡單的一種存儲管理方法,它允許多 4個用戶程序同時存在系統(tǒng)內(nèi)存中,即共享內(nèi)存空間。 按分區(qū)劃分方式可分為固定分區(qū)和可變分區(qū)。</p><p><b> 固定分區(qū)存儲管理 </b></p><p> 把內(nèi)存的用戶區(qū)預(yù)先劃分成多個分區(qū),
34、每個分區(qū)大小可以相同,也可以不同。(分區(qū)的劃分由計算機的操作員或者由操作系統(tǒng)給出,并給出主存分配表) 分區(qū)個數(shù)固定,分區(qū)的大小固定。 一個分區(qū)中可裝入一個作業(yè),作業(yè)執(zhí)行過程中不會改變存放區(qū)域。 早期的 IBM 的 OS/MFT(具有固定任務(wù)數(shù)的多道程序系統(tǒng))采用了這種固定分區(qū)的方法。</p><p> 可變分區(qū)存儲管理(動態(tài)分區(qū))</p><p> 內(nèi)存不是預(yù)先劃分好的,而是在系統(tǒng)運行
35、的過程中建立分區(qū).當(dāng)作業(yè)裝入主存時,根據(jù)作業(yè)所需要的主存容量查看是否有足夠的主存空間,若有則按需要分割一個分區(qū)給該作業(yè);否則令該作業(yè)等待。 分區(qū)長度不固定分區(qū)個數(shù)不固定。 這種存儲管理的方法克服了固定分區(qū)嚴(yán)重浪費主存的問題,提高了主存資源的利用率。 IBM操作系統(tǒng)OS/MVT采用可變分區(qū)存儲管理。</p><p> 可重定位分區(qū)存儲管理 </p><p> 解決碎片問題的一種簡單方法是
36、采用可重定位分區(qū)分配.。 其中心思想是,把不同程序,且在內(nèi)存中地址不連續(xù)的想法讓他們連續(xù)。</p><p> 例:內(nèi)存中現(xiàn)有 3 個空閑區(qū),現(xiàn)有一作業(yè)到達,要求獲得 30k 內(nèi)存空間,沒有分區(qū)滿足容量要求,若想把作業(yè)裝入,可將內(nèi)存中所有作業(yè)進行移動,這樣把原來分散的空閑區(qū)匯集成一個大的空閑區(qū)。 將內(nèi)存中的作業(yè)進行移動使它們連接在一起把原來分散的多個小分區(qū)拼接成一個大的空閑區(qū).這個過程稱為”緊湊”或”移動”。 需
37、解決的問題:每次”緊湊”后程序或數(shù)據(jù)裝入的物理地址變化采用動態(tài)重定位。</p><p><b> 問題描述和分析</b></p><p> 系統(tǒng)應(yīng)利用某種分配算法,從空閑分區(qū)鏈表中找到所需大小的分區(qū),如果空閑分區(qū)大小大于請求分區(qū)大小,則從該分區(qū)中按改請求的大小劃分出一塊內(nèi)存空間大小劃分出一塊內(nèi)存空間分配出去,余下的部分仍留在空閑鏈表中。然后,將分配區(qū)的首址返回給調(diào)
38、用者。</p><p> 當(dāng)進程運行完畢師范內(nèi)存時,系統(tǒng)根據(jù)回收區(qū)的首址,從空閑區(qū)中找到相應(yīng)的插入點,此時可能出現(xiàn)以下四種情況之一:</p><p> ⑴該空閑區(qū)的上下兩相鄰分區(qū)都是空閑區(qū):將三個空閑區(qū)合并為一個空閑區(qū)。新空閑區(qū)的起始地址為上空閑區(qū)的起始地址,大小為三個空閑區(qū)之和??臻e區(qū)合并后,取消可用表或自由鏈中下空閑區(qū)的表目項或鏈指針,修改上空閑區(qū)的對應(yīng)項。 </p>
39、<p> ?、圃摽臻e區(qū)的上相鄰區(qū)是空閑區(qū):將釋放區(qū)與上空閑區(qū)合并為一個空閑區(qū),其起始地址為上空閑區(qū)的起始地址,大小為上空閑區(qū)與釋放區(qū)之和。合并后,修改上空閑區(qū)對應(yīng)的可用表的表目項或自由鏈指針。 </p><p> ?、窃摽臻e區(qū)的下相鄰區(qū)是空閑區(qū):將釋放區(qū)與下空閑區(qū)合并,并將釋放區(qū)的起始地址作為合并區(qū)的起始地址。合并區(qū)的長度為釋放區(qū)與下空閑區(qū)之和。同理,合并后修改可用表或自由鏈中相應(yīng)的表目項或鏈指針。&
40、lt;/p><p> ?、葍上噜弲^(qū)都不是空閑區(qū):釋放區(qū)作為一個新空閑可用區(qū)插入可用表或自由鏈。</p><p><b> 程序流程圖</b></p><p> 內(nèi)存分配流程圖,如圖</p><p> 內(nèi)存回收流程圖,如圖</p><p><b> 數(shù)據(jù)結(jié)構(gòu)體分析</b>&
41、lt;/p><p><b> ⑴進程屬性結(jié)構(gòu)體</b></p><p> typedef struct readyque</p><p><b> {</b></p><p> char name[10];</p><p><b> int size;<
42、/b></p><p> }readyque,*readyqueue;</p><p><b> ?、瓶臻e鏈表結(jié)構(gòu)體</b></p><p> typedef struct idlyspace</p><p><b> {</b></p><p><b>
43、; int from;</b></p><p><b> int size;</b></p><p> idlyspace * next;</p><p> }idlyspace,*idly;</p><p><b> ?、且逊峙滏湵斫Y(jié)構(gòu)體</b></p><
44、p> typedef struct busyspace</p><p><b> {</b></p><p><b> int from;</b></p><p> readyque r;</p><p> busyspace * next;</p><p>
45、 }busyspace,*busy</p><p><b> 主要程序代碼分析</b></p><p> ?、胖骱瘮?shù)//代碼請?zhí)砑舆m當(dāng)?shù)淖⑨尅?lt;/p><p> int main()</p><p><b> {</b></p><p> Is=(idly)mall
46、oc(sizeof(idlyspace));</p><p> Is->from=0;</p><p> Is->size=256;</p><p> Is->next=NULL;</p><p><b> Is2=Is;</b></p><p> Bs=(busy)m
47、alloc(sizeof(busyspace));</p><p> Bs->next=NULL;</p><p><b> int t,t1;</b></p><p> printf("\n.......................歡迎來到動態(tài)分區(qū)存儲管理系統(tǒng)..................\n\n")
48、;</p><p> printf("...........................請選擇要執(zhí)行的算法:...........................\n");</p><p> printf("......................... 1.最先適應(yīng)算法 ...............................\n&quo
49、t;);</p><p> printf("......................... 2.下次適應(yīng)算法 ............................\n");</p><p> printf("..........................3.最優(yōu)適應(yīng)算法 ...............................\n&q
50、uot;);</p><p> printf("......................... 4.最壞適應(yīng)算法 ................................\n");</p><p> printf(".................................................................
51、.......\n");</p><p> printf("請輸入您的選擇:");</p><p> scanf("%d",&t);</p><p><b> int i;</b></p><p> while(i!=5)</p><p
52、><b> {</b></p><p> printf("........................................................................\n");</p><p> printf(".........................操作菜單如下:(請選擇)...
53、....................n");</p><p> printf("..........................1.輸入進程分配空間 ...........................n");</p><p> printf("......................... 2.進程撤銷回收空間 .........
54、..................\n");</p><p> printf("......................... 3.輸出所有空閑分區(qū) ..........................\n");</p><p> printf("..........................4.輸出所有已分配分區(qū).........
55、.................\n");</p><p> printf(".......................... 5.退 出 ..........................\n");</p><p> printf(".........................................
56、...............................\n");</p><p> scanf("%d",&i);</p><p><b> switch(i)</b></p><p><b> {</b></p><p><b> c
57、ase 1:</b></p><p><b> switch(t)</b></p><p><b> {</b></p><p><b> case 1:</b></p><p><b> t1=FF();</b></p>
58、<p><b> break;</b></p><p><b> case 2:</b></p><p><b> t1=NF();</b></p><p><b> break;</b></p><p><b> case
59、 3:</b></p><p><b> t1=BF();</b></p><p><b> break;</b></p><p><b> case 4:</b></p><p><b> t1=WF();</b></p>
60、<p><b> break;</b></p><p><b> default:</b></p><p> printf("選擇算法錯誤\n");</p><p><b> return 1;</b></p><p><b>
61、; }</b></p><p><b> if(t1)</b></p><p> printf("分配空間成功\n");</p><p><b> else</b></p><p> printf("分配空間失敗\n");</p&g
62、t;<p><b> break;</b></p><p><b> case 2:</b></p><p> t1=recover();</p><p><b> if(t1)</b></p><p> printf("回收成功\n"
63、;);</p><p><b> else</b></p><p> printf("回收失敗\n");</p><p><b> break;</b></p><p><b> case 3:</b></p><p> I
64、sprint();</p><p><b> break;</b></p><p><b> case 4:</b></p><p> Bsprint();</p><p><b> break;</b></p><p><b> }
65、</b></p><p><b> }</b></p><p><b> return 0;</b></p><p><b> }</b></p><p> 第三章 :分析并實現(xiàn)四種內(nèi)存分配算法</p><p><b>
66、最先適應(yīng)算法</b></p><p> 空閑區(qū)按地址從小到大的次序排列。</p><p> 分配:當(dāng)進程申請大小為 SIZE 的內(nèi)存時,系統(tǒng)順序查找空閑區(qū)表(鏈),直到找到容量滿足要求(≥SIZE)的空閑區(qū)為止。從該空閑區(qū)中劃出大小為 SIZE的分區(qū)分配給進程,余下的部分仍作為一個空閑區(qū),但要修改其首址和大小。 </p><p> 優(yōu)點:這種算法是
67、盡可能地利用低地址部分的空閑區(qū),而盡量地保證高地址 6部分的大空閑區(qū),有利于大作業(yè)的裝入。</p><p> 缺點:主存低地址和高地址分區(qū)利用不均衡。在低地址部分集中了許多非常小的空閑區(qū)碎片降低了主存的利用率。</p><p><b> 最先適應(yīng)算法</b></p><p><b> int FF()</b><
68、/p><p><b> {</b></p><p><b> int t=0;</b></p><p> readyque D;</p><p> printf“"請輸入進程名:\”");</p><p> scanf“"%”",
69、D.name);</p><p> printf“"輸入進程申請空間大小:\”");</p><p> scanf“"%”",&D.size);</p><p> idly l=Is;</p><p> int mt=256;</p><p> busy b=B
70、s;</p><p> idly min=NULL;</p><p> while(l)</p><p> //尋找空閑表中大小滿足申請進程所需大小并且起址最小的空閑結(jié)點</p><p><b> {</b></p><p> if(D.size<=l->size)&l
71、t;/p><p><b> {</b></p><p> if(l->from<mt)</p><p> { mt=l->from; min=l; t=1;</p><p><b> }</b></p><p><b> }</b>
72、;</p><p> l=l->next;</p><p><b> }</b></p><p> if(mt!=256)//如果找到則為進程分配空間</p><p><b> {</b></p><p><b> busy j;<
73、;/b></p><p> j=(busy)malloc(sizeof(busyspace));</p><p> j->from=min->from;</p><p> for(int i=0;i<10;i++)</p><p><b> {</b></p><p&g
74、t; j->r.name[i]=D.name[i];</p><p><b> }</b></p><p> j->r.size=D.size;</p><p> while(b->next)</p><p> { if(b->next->from<j->from)&l
75、t;/p><p> b=b->next; else</p><p><b> break;</b></p><p><b> }</b></p><p> j->next=b->next;</p><p> b->next=j;</p>
76、;<p> min->from=min->from+D.size;</p><p> min->size=min->size-D.size;</p><p><b> }</b></p><p><b> return t;</b></p><p>&l
77、t;b> }</b></p><p><b> 下次適應(yīng)分配算法 </b></p><p> 最先適應(yīng)算法的變種。</p><p> 總是從空閑區(qū)上次掃描結(jié)束處順序查找空閑區(qū)表(鏈),直到找到第一個滿足容量要求的空閑區(qū)為止,分割一部分給作業(yè),剩余部分仍作為空閑區(qū)。</p><p><b&g
78、t; 下次適應(yīng)分配算法</b></p><p><b> int NF()</b></p><p><b> {</b></p><p><b> int t=0;</b></p><p> readyque D;</p><p>
79、 printf“"請輸入進程名:\”");</p><p> scanf“"%”",D.name);</p><p> printf“"輸入進程申請空間大小:\”");</p><p> scanf“"%”",&D.size);</p><p>
80、 int mt=256;</p><p> idly l=Is2;</p><p> idly min=NULL;</p><p> busy b=Bs;</p><p><b> while(l)</b></p><p> //尋找空閑表中大小滿足申請進程所需大小并且起址最小的空閑結(jié)點
81、</p><p><b> {</b></p><p> if(D.size<=l->size)</p><p><b> {</b></p><p> if(l->from<mt)</p><p> { mt=l->from; min
82、=l; t=1;</p><p><b> }</b></p><p><b> }</b></p><p> l=l->next;</p><p><b> }</b></p><p> if(mt!=256)//如果
83、找到則為進程分配空間</p><p><b> {</b></p><p><b> busy j;</b></p><p> j=(busy)malloc(sizeof(busyspace));</p><p> j->from=min->from;</p>&l
84、t;p> for(int i=0;i<10;i++)</p><p><b> {</b></p><p> j->r.name[i]=D.name[i];</p><p><b> }</b></p><p> j->r.size=D.size;</p>
85、;<p> while(b->next)</p><p> { if(b->next->from<j->from)</p><p> b=b->next; else</p><p><b> break;</b></p><p><b> }</
86、b></p><p> //將申請空間進程插入到已分配鏈表中</p><p> j->next=b->next;</p><p> b->next=j;</p><p> //修改相應(yīng)空閑節(jié)點的起址和大小</p><p> min->from=min->from+D.siz
87、e;</p><p> min->size=min->size-D.size;</p><p> Is2=min->next;//ls2指向修改結(jié)點的下一個結(jié)點</p><p><b> t=1;</b></p><p><b> return t;</b>
88、;</p><p><b> }</b></p><p> l=Is;//l指向空閑表的頭</p><p> while(l!=Is2)//循環(huán)查找</p><p><b> {</b></p><p> if(D.size<=l->s
89、ize)</p><p><b> {</b></p><p> if(l->from<mt)</p><p> { mt=l->from; min=l; t=1;</p><p><b> }</b></p><p><b> }<
90、;/b></p><p> l=l->next;</p><p><b> }</b></p><p> if(mt!=256)</p><p><b> {</b></p><p><b> busy j;</b></p&g
91、t;<p> j=(busy)malloc(sizeof(busyspace));</p><p> j->from=min->from;</p><p> for(int i=0;i<10;i++)</p><p><b> {</b></p><p> j->r.nam
92、e[i]=D.name[i];</p><p><b> }</b></p><p> j->r.size=D.size;</p><p> while(b->next)</p><p> { if(b->next->from<j->from)</p><p
93、> b=b->next; else</p><p><b> break;</b></p><p><b> }</b></p><p> j->next=b->next;</p><p> b->next=j;</p><p> m
94、in->from=min->from+D.size;</p><p> min->size=min->size-D.size;</p><p> Is2=min->next;</p><p><b> t=1;</b></p><p><b> return t;</
95、b></p><p><b> }</b></p><p><b> return t;</b></p><p><b> }</b></p><p><b> 最優(yōu)適應(yīng)算法</b></p><p> 空閑區(qū)按容量遞
96、增的次序排列。</p><p> 分配:當(dāng)進程申請存儲空間,系統(tǒng)順序查找空閑區(qū)表(鏈),直到找到第一個滿足容量要求的空閑區(qū)為止。 采用最優(yōu)適應(yīng)算法選中的空閑區(qū)是滿足容量要求的最小空閑區(qū)。 </p><p> 優(yōu)點:選中的空閑區(qū)是滿足容量要求的最小空閑區(qū),而不致于毀掉較大的空閑區(qū)。 </p><p> 缺點:空閑區(qū)的大小一般與申請分區(qū)大小不相等,因此將其一分為二
97、,留下來的空閑區(qū)一般情況下是很小的,以致無法使用。隨著時間的推移,系統(tǒng)中的小空閑區(qū)會越來越多,從而造成存儲空間的浪費。</p><p><b> 最優(yōu)適應(yīng)算法</b></p><p><b> int BF()</b></p><p><b> {</b></p><p>
98、;<b> int t=0;</b></p><p> readyque D;</p><p> printf“"請輸入進程名:\”");</p><p> scanf“"%”",D.name);</p><p> printf“"輸入進程申請空間大小:\”&q
99、uot;);</p><p> scanf“"%”",&D.size);</p><p> idly l=Is;</p><p> idly min=NULL;</p><p> int mt=256;</p><p> busy b=Bs;</p><p>
100、;<b> while(l)</b></p><p> //在空閑鏈中尋找第一個大于所輸入的進程大小的空閑塊</p><p><b> {</b></p><p> if(D.size<=l->size)</p><p><b> {</b></p&
101、gt;<p> if(l->size<mt)</p><p><b> { </b></p><p> mt=l->size; min=l; t=1;</p><p><b> }</b></p><p><b> }</b></
102、p><p> l=l->next;</p><p><b> }</b></p><p> if(mt!=256)//找到第一個滿足要求的空閑塊</p><p><b> {</b></p><p><b> busy j;</b
103、></p><p> j=(busy)malloc(sizeof(busyspace));//申請分配用于存放進程的內(nèi)存空間</p><p> j->from=min->from;</p><p> //將第一個滿足要求的空閑塊(min)的首地址賦給j</p><p> for(int i=0;i&l
104、t;10;i++)</p><p><b> {</b></p><p> j->r.name[i]=D.name[i];</p><p><b> }</b></p><p> j->r.size=D.size;</p><p> while(b-&g
105、t;next)</p><p> //按從小到大的順序查找新進程在已分配區(qū)中的位置</p><p> { if(b->next->from<j->from)</p><p> b=b->next; else</p><p><b> break;</b></p>
106、;<p><b> }</b></p><p> j->next=b->next;</p><p> b->next=j;//將所輸入的進程插入進程鏈</p><p> min->from=min->from+D.size;//改變該空閑塊的起始地址</p>
107、;<p> min->size=min->size-D.size;//改變該空閑塊的剩余大小</p><p><b> }</b></p><p><b> return t;</b></p><p><b> }</b></p><p&
108、gt;<b> 最壞適應(yīng)算法 </b></p><p> 為了克服最佳適應(yīng)算法把空閑區(qū)切割得太小的缺點,人們提出了一種最壞適應(yīng)算法,即每次分配時,總是將最大的空閑區(qū)切去一部分分配給請求者,剩余的部分仍是一個較大的空閑區(qū)。避免了空閑區(qū)越分越小的問題。 </p><p> 要求空閑區(qū)按容量遞減的順序排列。 </p><p> 分配:進程申請
109、存儲區(qū)時,檢查空閑區(qū)表(鏈)的第一個空閑區(qū)的大小是否滿足要求,若不滿足則令進程等待;若滿足則從該空閑區(qū)中分配一部分存儲區(qū)給用戶,剩下的部分仍作為空閑區(qū)。</p><p><b> 最壞適應(yīng)算法</b></p><p><b> int WF()</b></p><p><b> {</b><
110、;/p><p><b> int t=0;</b></p><p> readyque D;</p><p> printf“"請輸入進程名:\”");</p><p> scanf“"%”",D.name);</p><p> printf“&quo
111、t;輸入進程申請空間大小:\”");</p><p> scanf“"%”",&D.size);//輸入進程申請的空間大小</p><p> idly l=Is;//l指向空閑鏈表ls頭</p><p> idly min=NULL;</p><p><b> int mt
112、=0;</b></p><p> busy b=Bs;//b指向已分配鏈表Bs頭</p><p> //找到空閑分區(qū)中大小滿足進程的請求且尺寸最大的結(jié)點</p><p><b> while(l)</b></p><p><b> {</b></p>
113、<p> if(D.size<=l->size)</p><p> //判斷進程所申請的大小是否小于空閑區(qū)的各結(jié)點大小</p><p><b> {</b></p><p> if(l->size>mt)</p><p><b> {</b></
114、p><p> mt=l->size;</p><p> min=l;//min指向空閑區(qū)中尺寸最大的結(jié)點 </p><p><b> t=1;</b></p><p><b> }</b></p><p><b> }</b></p&g
115、t;<p> l=l->next;//l指向空閑鏈表下一個結(jié)點</p><p><b> }</b></p><p> if(mt!=0)//判斷是否找到了空閑區(qū)的滿足結(jié)點</p><p><b> {</b></p><p><
116、b> busy j;</b></p><p> j=(busy)malloc(sizeof(busyspace));</p><p> j->from=min->from;</p><p> for(int i=0;i<10;i++)</p><p><b> {</b>&l
117、t;/p><p> j->r.name[i]=D.name[i];</p><p><b> }</b></p><p> j->r.size=D.size;</p><p> while(b->next)//尋找插入到已分配鏈表中的位置</p><p>
118、{ if(b->next->from<j->from)</p><p> b=b->next; else</p><p><b> break;</b></p><p><b> }</b></p><p> //把此進程結(jié)點j插入到已分配鏈表中</p&g
119、t;<p> j->next=b->next;</p><p> b->next=j;</p><p> //修改空閑鏈表的相應(yīng)結(jié)點的參數(shù)</p><p> min->from=min->from+D.size;</p><p> min->size=min->size-D.s
120、ize;</p><p><b> }</b></p><p><b> return t;</b></p><p><b> }</b></p><p><b> 可變分區(qū)的回收</b></p><p> 當(dāng)某個進程釋放
121、某存儲區(qū)時,系統(tǒng)首先檢查釋放區(qū)是否與系統(tǒng)中的空閑區(qū)相鄰若相鄰則把釋放區(qū)合并到相鄰的空閑區(qū)去,否則把釋放區(qū)作為一個空閑區(qū)插入到空閑表的適當(dāng)位置。</p><p> 釋放區(qū)與空閑區(qū)相鄰的四種情況。</p><p> 釋放區(qū)與前空閑區(qū)相鄰:把釋放區(qū)與前空閑區(qū)合并到一個空閑區(qū)。其首址仍為前空閑區(qū)首址,大小為釋放區(qū)大小與空閑區(qū)大小之和。</p><p> 釋放區(qū)與后空閑
122、區(qū)相鄰:則把釋放區(qū)合并到后空閑區(qū),其首地址為釋放區(qū)首地址,大小為二者之和。</p><p> 釋放區(qū)與前后兩空閑區(qū)相鄰:這三個區(qū)合為一個空閑區(qū),首地址為前空閑區(qū)首址,大小為這三個空閑區(qū)之和,并取消后空閑區(qū)表目。</p><p> 釋放區(qū)不與任何空閑區(qū)相鄰:將釋放區(qū)作為一個空閑區(qū),將其大小和首址插入到空閑區(qū)表的適當(dāng)位置。</p><p><b> 回收
123、內(nèi)存算法</b></p><p> int recover()</p><p><b> {</b></p><p> readyque D;</p><p> printf“"請輸入想要回收的進程名\”");</p><p> scanf“"%
124、”",D.name);</p><p> busy b=Bs;</p><p> idly l=Is;</p><p> while(b->next) //查找輸入的進程名是否在已分配鏈表中</p><p><b> {</b></p><p> bool
125、yo=1;</p><p> for(int i=0;i<10;i++)</p><p><b> {</b></p><p> if(b->next->r.name[i]==D.name[i]) yo=yo*1;</p><p> else yo=0;</p><p>
126、<b> }</b></p><p> //如果在已分配鏈表中則釋放該結(jié)點所占空間</p><p><b> if(yo)</b></p><p><b> {</b></p><p> int t=b->next->from;</p>&l
127、t;p> int ts=b->next->r.size;</p><p><b> while(l)</b></p><p> { if(l->from>t+ts)//所回收進程與空閑結(jié)點上下都不鄰接 </p><p><b> { </b></p><
128、p><b> idly tl;</b></p><p> tl=(idly)malloc(sizeof(idlyspace));</p><p> tl->from=t;</p><p> tl->size=ts;</p><p> tl->next=l; </p><
129、;p><b> Is=tl;</b></p><p><b> break; </b></p><p><b> }</b></p><p> if(l->from==t+ts)//所回收進程與空閑結(jié)點下鄰接 {</p><p> l->
130、from=t;</p><p> l->size=l->size+ts;</p><p> busy tb=b->next;</p><p> b->next=b->next->next;</p><p><b> free(tb);</b></p><p&
131、gt;<b> return 1;</b></p><p><b> } </b></p><p> if(l->from+l->size<t)//所回收進程與空閑結(jié)點上下都不鄰接 {</p><p><b> idly tl;</b></p><
132、;p> tl=(idly)malloc(sizeof(idlyspace));</p><p> tl->from=t;</p><p> tl->size=ts;</p><p> tl->next=l->next;</p><p> l->next=tl;</p><p&g
133、t;<b> break; </b></p><p><b> } </b></p><p> else if(l->from+l->size==t)//所回收進程與空閑結(jié)點上鄰接 {</p><p> l->size=l->size+ts;</p><p>
134、 if(l->from+l->size==l->next->from)//所回收進程與空閑結(jié)點上下都鄰接</p><p><b> {</b></p><p> l->size=l->size+l->next->size;</p><p> idly tm=l->next;<
135、;/p><p> l->next=l->next->next;</p><p><b> freI);</b></p><p><b> }</b></p><p><b> br</b></p><p> l=l->nex
136、t;</p><p><b> }</b></p><p> //從已分配鏈表中釋放所回收進程</p><p> busy tb=b->next;</p><p> b->next=b->next->next;</p><p><b> free(tb)
溫馨提示
- 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)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 操作系統(tǒng)課程設(shè)計--連續(xù)動態(tài)分區(qū)內(nèi)存管理模擬實現(xiàn)
- 操作系統(tǒng)課程設(shè)計--連續(xù)動態(tài)分區(qū)內(nèi)存管理模擬實現(xiàn)
- 操作系統(tǒng)課程設(shè)計--模擬實現(xiàn)可變分區(qū)存儲管理
- 內(nèi)存管理(操作系統(tǒng))操作系統(tǒng)課程設(shè)計
- 操作系統(tǒng)課程設(shè)計---動態(tài)分區(qū)分配存儲管理
- 【操作系統(tǒng)課程設(shè)計】內(nèi)存管理子系統(tǒng)
- 操作系統(tǒng)課程設(shè)計——操作系統(tǒng)課程設(shè)計模擬操作系統(tǒng)
- 操作系統(tǒng)課程設(shè)計--模擬操作系統(tǒng)的實現(xiàn)
- 操作系統(tǒng)課程設(shè)計實驗報告--內(nèi)存的連續(xù)分配算法
- 操作系統(tǒng)程序設(shè)計課程設(shè)計報告-操作系統(tǒng)模擬實現(xiàn)
- 操作系統(tǒng)原理課程設(shè)計報告-可變分區(qū)存儲管理
- 模擬操作系統(tǒng)課程設(shè)計
- 操作系統(tǒng)課程設(shè)計--動態(tài)優(yōu)先權(quán)算法模擬
- 《操作系統(tǒng)》課程設(shè)計-- 模擬文件管理系統(tǒng)
- 動態(tài)優(yōu)先權(quán)算法模擬-操作系統(tǒng)課程設(shè)計
- 操作系統(tǒng)課程設(shè)計--臨界區(qū)管理實現(xiàn)
- 《操作系統(tǒng)》課程設(shè)計--模擬文件管理系統(tǒng)
- 操作系統(tǒng)模擬進程課程設(shè)計
- 操作系統(tǒng)課程設(shè)計-- 操作系統(tǒng)
- 操作系統(tǒng)課程設(shè)計---進程調(diào)度子系統(tǒng)模擬實現(xiàn)
評論
0/150
提交評論