版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、<p> ?。ú僮飨到y(tǒng)課程設計)</p><p><b> 連續(xù)動態(tài)分區(qū)內存</b></p><p><b> 管理模擬實現(xiàn)</b></p><p> 學生姓名: </p><p> 學生學號: </p><
2、p> 班 級: </p><p><b> 二〇一三年十二月</b></p><p><b> 目錄</b></p><p> 《操作系統(tǒng)》課程設計....................................................... 1<
3、;/p><p> 引言......................................................................3</p><p> 課程設計目的和內容 ...................................................... 3</p><p> 需求分析...........
4、..............................................................3</p><p> 概要設計...................................................................3</p><p> 開發(fā)環(huán)境...................................
5、..................................... 4</p><p> 系統(tǒng)分析設計..................................................................... 4</p><p> 有關了解內存管理的相關理論.............................................
6、..... 4</p><p> 內存管理概念........................................................................4</p><p> 內存管理的必要性..............................................................4 </p><
7、p> 內存的物理組織.............................................................4 </p><p> 什么是虛擬內存.................................................................5 </p><p> 連續(xù)動態(tài)分區(qū)內存管理方式...........
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ù)據結構體分析.............................
11、.....................................8</p><p> 主要程序代碼分析...............................................................9</p><p> 分析并實現(xiàn)四種內存分配算法 .................................................
12、11</p><p> 最先適應算.....................................................................11 </p><p> 下次適應分配算法..........................................................13 </p><p> 最優(yōu)適
13、應算法...............................................................16 </p><p> 最壞適應算法......................................................... ......18</p><p> 回收內存算法...........................
14、.....................................20</p><p> 調試與操作說明.................................................................22</p><p> 初始界面.........................................................
15、..............22</p><p> 模擬內存分配...............................................................23</p><p> 已分配分區(qū)說明表面............................................................24</p><
16、p> 空閑區(qū)說明表界面.............................................................24</p><p> 回收內存界面.....................................................................25</p><p> 重新申請內存界面...........
17、...............................................26.</p><p> 總結與體會...................................................................... 28</p><p> 參考文獻..........................................
18、............................... 28</p><p><b> 引言</b></p><p> 操作系統(tǒng)是最重要的系統(tǒng)軟件,同時也是最活躍的學科之一。我們通過操作系統(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ù)分配的一種方式,它至今仍在內存分配方式中占有一席之地。</p><p> 課程設計目的和內容:</p><p> 理解內存管理的相關理論,掌握連續(xù)動態(tài)
20、分區(qū)內存管理的理論;通過對實際問題的編程實現(xiàn),獲得實際應用和編程能力。 </p><p> 編寫程序實現(xiàn)連續(xù)動態(tài)分區(qū)內存管理方式,該程序管理一塊虛擬內存,實現(xiàn)內存分配和回收功能。 分析并實現(xiàn)四種內存分配算法,即最先適應算法,下次最先適應算法,最優(yōu)適應算法,最壞適應算法。內存分配算法和回收算法的實現(xiàn)。</p><p><b> 需求分析</b></p>
21、<p> 動態(tài)分區(qū)分配是根據進程的實際需要,動態(tài)地為之分配內存空間。在實現(xiàn)動態(tài)分區(qū)分配時,將涉及到分區(qū)分配中所用的數(shù)據結構、分區(qū)分配算法和分區(qū)的分配和回收操作這樣三個問題。常用的數(shù)據結構有動態(tài)分區(qū)表和動態(tài)分區(qū)鏈。在對數(shù)據結構有一定掌握程度的情況下設計合理的數(shù)據結構來描述存儲空間,實現(xiàn)分區(qū)存儲管理的內存分配功能,應該選擇最合適的適應算法(首次適應算法,最佳適應算法,最后適應算法,最壞適應算法),在動態(tài)分區(qū)存儲管理方式中主要實
22、現(xiàn)內存分配和內存回收算法,在這些存儲管理中間必然會有碎片的產生,當碎片產生時,進行碎片的拼接等相關的內容</p><p><b> 概要設計</b></p><p> 本程序采用機構化模塊化的設計方法,共分為四大模塊。</p><p> ⑴最先適應算法實現(xiàn) </p><p> 從空閑分區(qū)表的第一個表目起查找該表,
23、把最先能夠滿足要求的空閑區(qū)分配給作業(yè),這種方法目的在于減少查找時間。為適應這種算法,空閑分區(qū)表(空閑區(qū)鏈)中的空閑分區(qū)要按地址由低到高進行排序。該算法優(yōu)先使用低址部分空閑區(qū),在低址空間造成許多小的空閑區(qū),在高地址空間保留大的空閑區(qū)。</p><p> ⑵下次適應分配算法實現(xiàn)</p><p> 該算法是最先適應算法的變種。在分配內存空間時,不再每次從表頭(鏈首)開始查找,而是從上次找到空
24、閑區(qū)的下一個空閑開始查找,直到找到第一個能滿足要求的的空閑區(qū)為止,并從中劃出一塊與請求大小相等的內存空間分配給作業(yè)。該算法能使內存中的空閑區(qū)分布得較均勻。</p><p><b> ?、亲顑?yōu)適應算法實現(xiàn)</b></p><p> 它從全部空閑區(qū)中找出能滿足作業(yè)要求的、且大小最小的空閑分區(qū),這種方法能使碎片盡量小。為適應此算法,空閑分區(qū)表(空閑區(qū)鏈)中的空閑分區(qū)要按從
25、小到大進行排序,自表頭開始查找到第一個滿足要求的自由分區(qū)分配。</p><p><b> ⑷最壞算法實現(xiàn)</b></p><p> 最壞適應分配算法要掃描整個空閑分區(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)分析設計: </b></p><p> 相關算法原理,算法流程圖,涉及的數(shù)據結構內容都相應包含在各章節(jié)中</p><p> 有關了解內存管理的相關理論 </p><
27、p><b> 內存管理概念: </b></p><p> 內存管理,是指軟件運行時對計算機內存資源的分配和使用的技術。其最主要的目的是如何高效,快速的分配,并且在適當?shù)臅r候釋放和回收內存資源。內存不是預先劃分好的,而是在系統(tǒng)運行的過程中建立分區(qū).當作業(yè)裝入主存時,根據作業(yè)所需要的主存容量查看是否有足夠的主存空間,若有則按需要分割一個分區(qū)給該作業(yè);否則令該作業(yè)等待.分區(qū)長度不固定分區(qū)
28、個數(shù)不固定。這種存儲管理的方法克服了固定分區(qū)嚴重浪費主存的問題,提高了主存資源的利用率。</p><p><b> 內存管理的必要性:</b></p><p> 內存管理對于編寫出高效率的 Windows 程序是非常重要的,這是因為Windows 是多任務系統(tǒng),它的內存管理和單任務的 DOS 相比有很大的差異。DOS是單任務操作系統(tǒng),應用程序分配到內存后,如果它不
29、主動釋放,系統(tǒng)是不會對它作任何改變的;但 Windows 卻不然,它在同一時刻可能有多個應用程序共享內存,有時為了使某個任務更好地執(zhí)行,Windows 系統(tǒng)可能會對其它任務分配的內存進行移動,甚至刪除。因此,我們在 Windows 應用程序中使用內存時,要遵循Windows 內存管理的一些約定,以盡量提高 Windows 內存的利用率。 </p><p> 1.3 內存的物理組織:</p><
30、;p><b> 物理地址: </b></p><p> 把內存分成若干個大小相等的存儲單元,每個存儲單元占 8 位,稱作字節(jié)(byte)。每個單元給一個編號,這個編號稱為物理地址(內存地址、絕對地址、實地址)。二、物理地址空間: 物理地址的集合稱為物理地址空間(主存地址空間),它是一個一維空間。</p><p><b> 什么是虛擬內存:<
31、/b></p><p> 虛擬內存是內存管理技術的一個極其實用的創(chuàng)新。它是一段程序(由操作系統(tǒng)調度),持續(xù)監(jiān)控著所有物理內存中的代碼段、數(shù)據段,并保證他們在運行中的效率以及可靠性,對于每個用戶層(user-level)的進程分配一段虛擬內存空間。當進程建立時,不需要在物理內存件之間搬移數(shù)據,數(shù)據儲存于磁盤內的虛擬內存空間,也不需要為該進程去配置主內存空間,只有當該進程被被調用的時候才會被加載到主內存。&l
32、t;/p><p> 連續(xù)動態(tài)分區(qū)內存管理方式的實現(xiàn)</p><p> 在早期的操作系統(tǒng)中,主存分配廣泛采用連續(xù)分配方式。 連續(xù)分配方式,是指為一個用戶程序分配一個連續(xù)的內存空間,該連續(xù)內存空間指的的是物理內存。下面介紹連續(xù)分配的四種方式。</p><p> 單一連續(xù)分配(單個分區(qū))</p><p> 最簡單的存儲管理方式,用于多道程序設計
33、技術之前。 內存分為系統(tǒng)區(qū)和用戶區(qū),系統(tǒng)區(qū)由操作系統(tǒng)使用。用戶區(qū)作為一個連續(xù)的分區(qū)分配給一個作業(yè)。 分區(qū)存儲管理是滿足多道程序設計的最簡單的一種存儲管理方法,它允許多 4個用戶程序同時存在系統(tǒng)內存中,即共享內存空間。 按分區(qū)劃分方式可分為固定分區(qū)和可變分區(qū)。</p><p><b> 固定分區(qū)存儲管理 </b></p><p> 把內存的用戶區(qū)預先劃分成多個分區(qū),
34、每個分區(qū)大小可以相同,也可以不同。(分區(qū)的劃分由計算機的操作員或者由操作系統(tǒng)給出,并給出主存分配表) 分區(qū)個數(shù)固定,分區(qū)的大小固定。 一個分區(qū)中可裝入一個作業(yè),作業(yè)執(zhí)行過程中不會改變存放區(qū)域。 早期的 IBM 的 OS/MFT(具有固定任務數(shù)的多道程序系統(tǒng))采用了這種固定分區(qū)的方法。</p><p> 可變分區(qū)存儲管理(動態(tài)分區(qū))</p><p> 內存不是預先劃分好的,而是在系統(tǒng)運行
35、的過程中建立分區(qū).當作業(yè)裝入主存時,根據作業(yè)所需要的主存容量查看是否有足夠的主存空間,若有則按需要分割一個分區(qū)給該作業(yè);否則令該作業(yè)等待。 分區(qū)長度不固定分區(qū)個數(shù)不固定。 這種存儲管理的方法克服了固定分區(qū)嚴重浪費主存的問題,提高了主存資源的利用率。 IBM操作系統(tǒng)OS/MVT采用可變分區(qū)存儲管理。</p><p> 可重定位分區(qū)存儲管理 </p><p> 解決碎片問題的一種簡單方法是
36、采用可重定位分區(qū)分配.。 其中心思想是,把不同程序,且在內存中地址不連續(xù)的想法讓他們連續(xù)。</p><p> 例:內存中現(xiàn)有 3 個空閑區(qū),現(xiàn)有一作業(yè)到達,要求獲得 30k 內存空間,沒有分區(qū)滿足容量要求,若想把作業(yè)裝入,可將內存中所有作業(yè)進行移動,這樣把原來分散的空閑區(qū)匯集成一個大的空閑區(qū)。 將內存中的作業(yè)進行移動使它們連接在一起把原來分散的多個小分區(qū)拼接成一個大的空閑區(qū).這個過程稱為”緊湊”或”移動”。 需
37、解決的問題:每次”緊湊”后程序或數(shù)據裝入的物理地址變化采用動態(tài)重定位。</p><p><b> 問題描述和分析</b></p><p> 系統(tǒng)應利用某種分配算法,從空閑分區(qū)鏈表中找到所需大小的分區(qū),如果空閑分區(qū)大小大于請求分區(qū)大小,則從該分區(qū)中按改請求的大小劃分出一塊內存空間大小劃分出一塊內存空間分配出去,余下的部分仍留在空閑鏈表中。然后,將分配區(qū)的首址返回給調
38、用者。</p><p> 當進程運行完畢師范內存時,系統(tǒng)根據回收區(qū)的首址,從空閑區(qū)中找到相應的插入點,此時可能出現(xiàn)以下四種情況之一:</p><p> ?、旁摽臻e區(qū)的上下兩相鄰分區(qū)都是空閑區(qū):將三個空閑區(qū)合并為一個空閑區(qū)。新空閑區(qū)的起始地址為上空閑區(qū)的起始地址,大小為三個空閑區(qū)之和。空閑區(qū)合并后,取消可用表或自由鏈中下空閑區(qū)的表目項或鏈指針,修改上空閑區(qū)的對應項。 </p>
39、<p> ?、圃摽臻e區(qū)的上相鄰區(qū)是空閑區(qū):將釋放區(qū)與上空閑區(qū)合并為一個空閑區(qū),其起始地址為上空閑區(qū)的起始地址,大小為上空閑區(qū)與釋放區(qū)之和。合并后,修改上空閑區(qū)對應的可用表的表目項或自由鏈指針。 </p><p> ⑶該空閑區(qū)的下相鄰區(qū)是空閑區(qū):將釋放區(qū)與下空閑區(qū)合并,并將釋放區(qū)的起始地址作為合并區(qū)的起始地址。合并區(qū)的長度為釋放區(qū)與下空閑區(qū)之和。同理,合并后修改可用表或自由鏈中相應的表目項或鏈指針。&
40、lt;/p><p> ?、葍上噜弲^(qū)都不是空閑區(qū):釋放區(qū)作為一個新空閑可用區(qū)插入可用表或自由鏈。</p><p><b> 程序流程圖</b></p><p> 內存分配流程圖,如圖</p><p> 內存回收流程圖,如圖</p><p><b> 數(shù)據結構體分析</b>&
41、lt;/p><p><b> ⑴進程屬性結構體</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鏈表結構體</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構體</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當?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.最先適應算法 ...............................\n&quo
49、t;);</p><p> printf("......................... 2.下次適應算法 ............................\n");</p><p> printf("..........................3.最優(yōu)適應算法 ...............................\n&q
50、uot;);</p><p> printf("......................... 4.最壞適應算法 ................................\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)四種內存分配算法</p><p><b>
66、最先適應算法</b></p><p> 空閑區(qū)按地址從小到大的次序排列。</p><p> 分配:當進程申請大小為 SIZE 的內存時,系統(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> 最先適應算法</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> //尋找空閑表中大小滿足申請進程所需大小并且起址最小的空閑結點</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> 下次適應分配算法 </b></p><p> 最先適應算法的變種。</p><p> 總是從空閑區(qū)上次掃描結束處順序查找空閑區(qū)表(鏈),直到找到第一個滿足容量要求的空閑區(qū)為止,分割一部分給作業(yè),剩余部分仍作為空閑區(qū)。</p><p><b&g
78、t; 下次適應分配算法</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> //尋找空閑表中大小滿足申請進程所需大小并且起址最小的空閑結點
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> //修改相應空閑節(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指向修改結點的下一個結點</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)適應算法</b></p><p> 空閑區(qū)按容量遞
96、增的次序排列。</p><p> 分配:當進程申請存儲空間,系統(tǒng)順序查找空閑區(qū)表(鏈),直到找到第一個滿足容量要求的空閑區(qū)為止。 采用最優(yōu)適應算法選中的空閑區(qū)是滿足容量要求的最小空閑區(qū)。 </p><p> 優(yōu)點:選中的空閑區(qū)是滿足容量要求的最小空閑區(qū),而不致于毀掉較大的空閑區(qū)。 </p><p> 缺點:空閑區(qū)的大小一般與申請分區(qū)大小不相等,因此將其一分為二
97、,留下來的空閑區(qū)一般情況下是很小的,以致無法使用。隨著時間的推移,系統(tǒng)中的小空閑區(qū)會越來越多,從而造成存儲空間的浪費。</p><p><b> 最優(yōu)適應算法</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));//申請分配用于存放進程的內存空間</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> 最壞適應算法 </b></p><p> 為了克服最佳適應算法把空閑區(qū)切割得太小的缺點,人們提出了一種最壞適應算法,即每次分配時,總是將最大的空閑區(qū)切去一部分分配給請求者,剩余的部分仍是一個較大的空閑區(qū)。避免了空閑區(qū)越分越小的問題。 </p><p> 要求空閑區(qū)按容量遞減的順序排列。 </p><p> 分配:進程申請
109、存儲區(qū)時,檢查空閑區(qū)表(鏈)的第一個空閑區(qū)的大小是否滿足要求,若不滿足則令進程等待;若滿足則從該空閑區(qū)中分配一部分存儲區(qū)給用戶,剩下的部分仍作為空閑區(qū)。</p><p><b> 最壞適應算法</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ū)中大小滿足進程的請求且尺寸最大的結點</p><p><b> while(l)</b></p><p><b> {</b></p>
113、<p> if(D.size<=l->size)</p><p> //判斷進程所申請的大小是否小于空閑區(qū)的各結點大小</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ū)中尺寸最大的結點 </p><p><b> t=1;</b></p><p><b> }</b></p><p><b> }</b></p&g
115、t;<p> l=l->next;//l指向空閑鏈表下一個結點</p><p><b> }</b></p><p> if(mt!=0)//判斷是否找到了空閑區(qū)的滿足結點</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> //把此進程結點j插入到已分配鏈表中</p&g
119、t;<p> j->next=b->next;</p><p> b->next=j;</p><p> //修改空閑鏈表的相應結點的參數(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> 當某個進程釋放
121、某存儲區(qū)時,系統(tǒng)首先檢查釋放區(qū)是否與系統(tǒng)中的空閑區(qū)相鄰若相鄰則把釋放區(qū)合并到相鄰的空閑區(qū)去,否則把釋放區(qū)作為一個空閑區(qū)插入到空閑表的適當位置。</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ū)表的適當位置。</p><p><b> 回收
123、內存算法</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> //如果在已分配鏈表中則釋放該結點所占空間</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)//所回收進程與空閑結點上下都不鄰接 </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)//所回收進程與空閑結點下鄰接 {</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)//所回收進程與空閑結點上下都不鄰接 {</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)//所回收進程與空閑結點上鄰接 {</p><p> l->size=l->size+ts;</p><p>
134、 if(l->from+l->size==l->next->from)//所回收進程與空閑結點上下都鄰接</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)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 操作系統(tǒng)課程設計--連續(xù)動態(tài)分區(qū)內存管理模擬實現(xiàn)
- 操作系統(tǒng)課程設計--連續(xù)動態(tài)分區(qū)內存管理模擬實現(xiàn)
- 操作系統(tǒng)課程設計--模擬實現(xiàn)可變分區(qū)存儲管理
- 內存管理(操作系統(tǒng))操作系統(tǒng)課程設計
- 操作系統(tǒng)課程設計---動態(tài)分區(qū)分配存儲管理
- 【操作系統(tǒng)課程設計】內存管理子系統(tǒng)
- 操作系統(tǒng)課程設計——操作系統(tǒng)課程設計模擬操作系統(tǒng)
- 操作系統(tǒng)課程設計--模擬操作系統(tǒng)的實現(xiàn)
- 操作系統(tǒng)課程設計實驗報告--內存的連續(xù)分配算法
- 操作系統(tǒng)程序設計課程設計報告-操作系統(tǒng)模擬實現(xiàn)
- 操作系統(tǒng)原理課程設計報告-可變分區(qū)存儲管理
- 模擬操作系統(tǒng)課程設計
- 操作系統(tǒng)課程設計--動態(tài)優(yōu)先權算法模擬
- 《操作系統(tǒng)》課程設計-- 模擬文件管理系統(tǒng)
- 動態(tài)優(yōu)先權算法模擬-操作系統(tǒng)課程設計
- 操作系統(tǒng)課程設計--臨界區(qū)管理實現(xiàn)
- 《操作系統(tǒng)》課程設計--模擬文件管理系統(tǒng)
- 操作系統(tǒng)模擬進程課程設計
- 操作系統(tǒng)課程設計-- 操作系統(tǒng)
- 操作系統(tǒng)課程設計---進程調度子系統(tǒng)模擬實現(xiàn)
評論
0/150
提交評論