版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p> 《操作系統(tǒng)》課程設(shè)計</p><p> 論文題目: 連續(xù)動態(tài)分區(qū)內(nèi)存管理模擬實現(xiàn) </p><p> 所在班級: </p><p> 學(xué)生學(xué)號: </p><p> 學(xué)生姓名:
2、 </p><p> 任課教師: </p><p> 完成日期: 2012年12月1日 </p><p> 《操作系統(tǒng)》課程設(shè)計1</p><p> 課程設(shè)計目的和內(nèi)容:3</p><p><b> 開
3、發(fā)環(huán)境:3</b></p><p><b> 系統(tǒng)分析設(shè)計:3</b></p><p> 第一章 :有關(guān)了解內(nèi)存管理的相關(guān)理論3</p><p> 1.1 內(nèi)存管理概念:3</p><p> 1.2 內(nèi)存管理的必要性:3</p><p> 1.3 內(nèi)存的物理組
4、織:4</p><p> 1.4 什么是虛擬內(nèi)存:4</p><p> 第二章 :連續(xù)動態(tài)分區(qū)內(nèi)存管理方式的實現(xiàn)4</p><p> 2.1 單一連續(xù)分配(單個分區(qū))4</p><p> 2.2 固定分區(qū)存儲管理5</p><p> 2.3 可變分區(qū)存儲管理(動態(tài)分區(qū))5</p>
5、;<p> 2.4 可重定位分區(qū)存儲管理5</p><p> 2.5 覆蓋技術(shù)與對換技術(shù)6</p><p> 第三章 :分析并實現(xiàn)四種內(nèi)存分配算法6</p><p> 3.1 最先適應(yīng)算法6</p><p> 3.2 下次適應(yīng)分配算法9</p><p> 3.3 最優(yōu)適應(yīng)算
6、法11</p><p> 3.4 最壞適應(yīng)算法13</p><p> 第四章:實現(xiàn)對分配內(nèi)存后進(jìn)行回收的算法16</p><p> 4.1 可變分區(qū)的回收16</p><p> 4.2 對可變分區(qū)回收的流程圖17</p><p> 4.3 利用可變分區(qū)的首次適應(yīng)算法,模擬內(nèi)存的分配與回收算法
7、。18</p><p> 第五章 有關(guān)動態(tài)分區(qū)的數(shù)據(jù)結(jié)構(gòu)、存儲管理分析及實現(xiàn)虛擬內(nèi)存的算法25</p><p> 5.1 實現(xiàn)動態(tài)分區(qū)需要的數(shù)據(jù)結(jié)構(gòu)25</p><p> 5.2 可變分區(qū)存儲管理分析:26</p><p> 5.3 使用三種方法FIFO、OPI、LRU實現(xiàn)虛擬內(nèi)存頁面置換算法26</p>
8、<p> 心得體會及小結(jié):35</p><p><b> 參考文獻(xiàn):36</b></p><p> 課程設(shè)計目的和內(nèi)容:</p><p> 理解內(nèi)存管理的相關(guān)理論,掌握連續(xù)動態(tài)分區(qū)內(nèi)存管理的理論;通過對實際問題的編程實現(xiàn),獲得實際應(yīng)用和編程能力。</p><p> 編寫程序?qū)崿F(xiàn)連續(xù)動態(tài)分區(qū)內(nèi)存
9、管理方式,該程序管理一塊虛擬內(nèi)存,實現(xiàn)內(nèi)存分配和回收功能。</p><p> 分析并實現(xiàn)四種內(nèi)存分配算法,即首次適應(yīng)算法,循環(huán)首次適應(yīng)算法,最佳適應(yīng)算法,最壞適應(yīng)算法。內(nèi)存分配算法和回收算法的實現(xiàn)。</p><p><b> 開發(fā)環(huán)境:</b></p><p> win7下VC++6.0</p><p><b
10、> 系統(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><p> 1.1 內(nèi)存管理概念:</p><p> 內(nèi)存管理,是指軟件運(yùn)行時對計算機(jī)內(nèi)存資源的分配和使用的技術(shù)。其最主要的目的是如何高效
11、,快速的分配,并且在適當(dāng)?shù)臅r候釋放和回收內(nèi)存資源。內(nèi)存不是預(yù)先劃分好的,而是在系統(tǒng)運(yùn)行的過程中建立分區(qū).當(dāng)作業(yè)裝入主存時,根據(jù)作業(yè)所需要的主存容量查看是否有足夠的主存空間,若有則按需要分割一個分區(qū)給該作業(yè);否則令該作業(yè)等待.分區(qū)長度不固定,分區(qū)個數(shù)不固定。這種存儲管理的方法克服了固定分區(qū)嚴(yán)重浪費(fèi)主存的問題,提高了主存資源的利用率。</p><p> 1.2 內(nèi)存管理的必要性:</p><p
12、> 內(nèi)存管理對于編寫出高效率的Windows程序是非常重要的,這是因為Windows是多任務(wù)系統(tǒng),它的內(nèi)存管理和單任務(wù)的DOS相比有很大的差異。DOS是單任務(wù)操作系統(tǒng),應(yīng)用程序分配到內(nèi)存后,如果它不主動釋放,系統(tǒng)是不會對它作任何改變的;但Windows卻不然,它在同一時刻可能有多個應(yīng)用程序共享內(nèi)存,有時為了使某個任務(wù)更好地執(zhí)行,Windows系統(tǒng)可能會對其它任務(wù)分配的內(nèi)存進(jìn)行移動,甚至刪除。因此,我們在Windows應(yīng)用程序中使
13、用內(nèi)存時,要遵循Windows內(nèi)存管理的一些約定,以盡量提高Windows內(nèi)存的利用率。</p><p> 1.3 內(nèi)存的物理組織:</p><p><b> 一、物理地址:</b></p><p> 把內(nèi)存分成若干個大小相等的存儲單元,每個存儲單元占8位,稱作字節(jié)(byte)。每個單元給一個編號,這個編號稱為物理地址(內(nèi)存地址、絕對地
14、址、實地址)。</p><p><b> 二、物理地址空間:</b></p><p> 物理地址的集合稱為物理地址空間(主存地址空間),它是一個一維空間。</p><p> 1.4 什么是虛擬內(nèi)存:</p><p> 虛擬內(nèi)存是內(nèi)存管理技術(shù)的一個極其實用的創(chuàng)新。它是一段程序(由操作系統(tǒng)調(diào)度),持續(xù)監(jiān)控著所有物理
15、內(nèi)存中的代碼段、數(shù)據(jù)段,并保證他們在運(yùn)行中的效率以及可靠性,對于每個用戶層(user-level)的進(jìn)程分配一段虛擬內(nèi)存空間。當(dāng)進(jìn)程建立時,不需要在物理內(nèi)存件之間搬移數(shù)據(jù),數(shù)據(jù)儲存于磁盤內(nèi)的虛擬內(nèi)存空間,也不需要為該進(jìn)程去配置主內(nèi)存空間,只有當(dāng)該進(jìn)程被被調(diào)用的時候才會被加載到主內(nèi)存。</p><p> :連續(xù)動態(tài)分區(qū)內(nèi)存管理方式的實現(xiàn)</p><p> 在早期的操作系統(tǒng)中,主存分配廣泛
16、采用連續(xù)分配方式。</p><p> 連續(xù)分配方式,是指為一個用戶程序分配一個連續(xù)的內(nèi)存空間,該連續(xù)內(nèi)存空間指的的是物理內(nèi)存。下面介紹連續(xù)分配的四種方式。</p><p> 2.1 單一連續(xù)分配(單個分區(qū))</p><p> 最簡單的存儲管理方式,用于多道程序設(shè)計技術(shù)之前。</p><p> 內(nèi)存分為系統(tǒng)區(qū)和用戶區(qū),系統(tǒng)區(qū)由操作系統(tǒng)
17、使用。用戶區(qū)作為一個連續(xù)的分區(qū)分配給一個作業(yè)。</p><p> 分區(qū)存儲管理是滿足多道程序設(shè)計的最簡單的一種存儲管理方法,它允許多個用戶程序同時存在系統(tǒng)內(nèi)存中,即共享內(nèi)存空間。</p><p> 按分區(qū)劃分方式可分為固定分區(qū)和可變分區(qū)。</p><p> 2.2 固定分區(qū)存儲管理 </p><p> 把內(nèi)存的用戶區(qū)預(yù)先劃分成多
18、個分區(qū),每個分區(qū)大小可以相同,也可以不同。(分區(qū)的劃分由計算機(jī)的操作員或者由操作系統(tǒng)給出,并給出主存分配表)</p><p> 分區(qū)個數(shù)固定,分區(qū)的大小固定。</p><p> 一個分區(qū)中可裝入一個作業(yè),作業(yè)執(zhí)行過程中不會改變存放區(qū)域。</p><p> 早期的IBM的OS/MFT(具有固定任務(wù)數(shù)的多道程序系統(tǒng))采用了這種固定分區(qū)的方法。</p>
19、<p> 2.3 可變分區(qū)存儲管理(動態(tài)分區(qū))</p><p> 內(nèi)存不是預(yù)先劃分好的,而是在系統(tǒng)運(yùn)行的過程中建立分區(qū).當(dāng)作業(yè)裝入主存時,根據(jù)作業(yè)所需要的主存容量查看是否有足夠的主存空間,若有則按需要分割一個分區(qū)給該作業(yè);否則令該作業(yè)等待。</p><p> 分區(qū)長度不固定,分區(qū)個數(shù)不固定。</p><p> 這種存儲管理的方法克服了固定分區(qū)嚴(yán)
20、重浪費(fèi)主存的問題,提高了主存資源的利用率。</p><p> ?。桑拢筒僮飨到y(tǒng)OS/MVT采用可變分區(qū)存儲管理。</p><p> 2.4 可重定位分區(qū)存儲管理</p><p> 解決碎片問題的一種簡單方法是采用可重定位分區(qū)分配.。</p><p> 其中心思想是,把不同程序,且在內(nèi)存中地址不連續(xù)的想法讓他們連續(xù)。例:內(nèi)存中現(xiàn)有3個空
21、閑區(qū),現(xiàn)有一作業(yè)到達(dá),要求獲得30k內(nèi)存空間,沒有分區(qū)滿足容量要求,若想把作業(yè)裝入,可將內(nèi)存中所有作業(yè)進(jìn)行移動,這樣把原來分散的空閑區(qū)匯集成一個大的空閑區(qū)。</p><p> 將內(nèi)存中的作業(yè)進(jìn)行移動,使它們連接在一起,把原來分散的多個小分區(qū)拼接成一個大的空閑區(qū).這個過程稱為”緊湊”或”移動”。</p><p> 需解決的問題:每次”緊湊”后,程序或數(shù)據(jù)裝入的物理地址變化,采用動態(tài)重定位
22、。</p><p> 2.5 覆蓋技術(shù)與對換技術(shù)</p><p><b> 一、為什么引入?</b></p><p> 在多道環(huán)境下擴(kuò)充內(nèi)存的方法,用以解決在較小的存儲空間中運(yùn)行較大程序時遇到的矛盾。</p><p> 覆蓋技術(shù)主要用在早期的操作系統(tǒng)中。</p><p> 對換技術(shù)被廣
23、泛用于小型分時系統(tǒng)中,交換技術(shù)的發(fā)展導(dǎo)致了虛存技術(shù)的出現(xiàn)。</p><p><b> 二 、覆蓋技術(shù)</b></p><p> 把程序劃分為若干個功能上相對獨(dú)立的程序段,按照其自身的邏輯結(jié)構(gòu)將那些不會同時執(zhí)行的程序段共享同一塊內(nèi)存區(qū)域</p><p> 程序段先保存在磁盤上,當(dāng)有關(guān)程序段的前一部分執(zhí)行結(jié)束,把后續(xù)程序段調(diào)入內(nèi)存,覆蓋前面的
24、程序段(內(nèi)存“擴(kuò)大”了)</p><p> 覆蓋:一個作業(yè)的若干程序段,或幾個作業(yè)的某些部分共享某一個存儲空間</p><p> 一般要求作業(yè)各模塊之間有明確的調(diào)用結(jié)構(gòu),程序員要向系統(tǒng)指明覆蓋結(jié)構(gòu),然后由由操作系統(tǒng)完成自動覆蓋。</p><p><b> 對換技術(shù)</b></p><p> 為平衡系統(tǒng)負(fù)載,通過選
25、擇一個進(jìn)程,把其暫時移出到磁盤,騰出空間給其他進(jìn)程使用,同時把磁盤中的某個進(jìn)程再換進(jìn)主存,讓其投入運(yùn)行,這種互換稱對換。</p><p><b> 多用于分時系統(tǒng)中</b></p><p> ?。悍治霾崿F(xiàn)四種內(nèi)存分配算法</p><p> 3.1 最先適應(yīng)算法</p><p> 空閑區(qū)按地址從小到大的次序排列。
26、 </p><p> 分配:當(dāng)進(jìn)程申請大小為SIZE的內(nèi)存時,系統(tǒng)順序查找空閑區(qū)表(鏈),直到找到容量滿足要求(≥SIZE)的空閑區(qū)為止。從該空閑區(qū)中劃出大小為SIZE的分區(qū)分配給進(jìn)程,余下的部分仍作為一個空閑區(qū),但要修改其首址和大小。</p><p> 優(yōu)點:這種算法是盡可能地利用低地址部分的空閑區(qū),而盡量地保證高地址部分的大空閑區(qū),有利于大作業(yè)的裝入。</p><
27、;p> 缺點:主存低地址和高地址分區(qū)利用不均衡。在低地址部分,集中了許多非常小的空閑區(qū)(碎片),降低了主存的利用率。</p><p> 最先適應(yīng)算法代碼實現(xiàn):</p><p> #include<stdio.h></p><p> void main()</p><p> { int m,n,i,j,j0,k,k
28、0,A[30][3],B[30];</p><p> printf("請輸入空閑分區(qū)塊數(shù):");</p><p> scanf("%d",&m);</p><p> printf("\n\t分區(qū)號\t\t大小\t\t起始地址\n");</p><p> for(i=0
29、;i<m;i++)</p><p> for(j=0;j<3;j++)</p><p> scanf("%d",&A[i][j]);</p><p> /* 按地址從小到大排列(直接選擇排序) */</p><p> for(i=0;i<m-1;i++)</p><p
30、><b> { k0=i;</b></p><p> for(k=i+1;k<m;k++)</p><p> if(A[k][2]<A[k0][2])k0=k;</p><p><b> if(k0!=i)</b></p><p> { for(j=0;j<
31、3;j++)</p><p> { int t;</p><p> t=A[k0][j];</p><p> A[k0][j]=A[i][j];</p><p> A[i][j]=t;</p><p><b> }</b></p><p><b>
32、 }</b></p><p><b> }</b></p><p> printf("\n----首次適應(yīng)算法按地址從小到大排列后空閑區(qū)----\n");</p><p> printf("\t分區(qū)號\t\t大小\t\t起始地址\n");</p><p>
33、for(i=0;i<m;i++)</p><p> for(j=0;j<3;j++)</p><p> { printf("\t%d\t",A[i][j]);</p><p> if(j==2)printf("\n");</p><p><b> }</b>
34、</p><p> printf("\n請輸入要分配的作業(yè)數(shù):");</p><p> scanf("%d",&n);</p><p> printf("請輸入作業(yè)大小:\n");</p><p> for(j0=0;j0<n;j0++)</p>
35、<p> scanf("%d",&B[j0]);</p><p> /* 空閑表首址和大小變換 */</p><p><b> i=j0=0;</b></p><p><b> do</b></p><p> { while(A[i][1]<
36、;B[j0]&&i<m)</p><p><b> i++;</b></p><p> if(i==m)printf("\n內(nèi)存不足,%dK大小的作業(yè)需要等待內(nèi)存資源!\n",B[j0]);</p><p><b> if(i<m)</b></p><
37、;p> { A[i][1]=A[i][1]-B[j0];</p><p> A[i][2]=A[i][2]+B[j0];</p><p><b> }</b></p><p><b> j0++;i=0;</b></p><p> }while(j0<n);</p
38、><p> printf("\n----首次適應(yīng)算法分區(qū)分配后的空閑區(qū)----\n");</p><p> printf("\t分區(qū)號\t\t大小\t\t起始地址\n");</p><p> for(i=0;i<m;i++)</p><p> for(j=0;j<3;j++)</p
39、><p> { if(A[i][1]) printf("\t%d\t",A[i][j]);</p><p> if(j==2) printf("\n");</p><p><b> }</b></p><p><b> }</b></p>
40、<p><b> 運(yùn)行結(jié)果如下:</b></p><p> 3.2 下次適應(yīng)分配算法</p><p> 最先適應(yīng)算法的變種。</p><p> 總是從空閑區(qū)上次掃描結(jié)束處順序查找空閑區(qū)表(鏈),直到找到第一個滿足容量要求的空閑區(qū)為止,分割一部分給作業(yè),剩余部分仍作為空閑區(qū)。</p><p> 下
41、次適應(yīng)分配算法代碼實現(xiàn):</p><p> void NF_Assign(unsigned size)/*循環(huán)首次適應(yīng)算法的分配*/</p><p><b> {</b></p><p> LN *p,*t,*s;</p><p><b> p=find;</b></p>&l
42、t;p> if (fsize <= 0)</p><p><b> {</b></p><p> printf("系統(tǒng)已無可用空間\n");</p><p><b> return;</b></p><p><b> }</b><
43、/p><p> else if (size > fsize)</p><p><b> {</b></p><p> printf("系統(tǒng)空間不足!分配不成功\n");</p><p><b> return;</b></p><p><b
44、> }</b></p><p> else if (size <= 0)</p><p><b> {</b></p><p> printf("大小不正確!\n");</p><p><b> }</b></p><p>
45、;<b> do</b></p><p><b> {</b></p><p> if(size > p->size)</p><p><b> {</b></p><p> p=p->next;</p><p> if(p
46、==find)</p><p><b> {</b></p><p> printf("沒有足夠大的空閑區(qū)分配!分配不成功\n"); break;</p><p><b> }</b></p><p><b> }</b></p>&
47、lt;p><b> else</b></p><p><b> {</b></p><p> p->size -= size;</p><p> p->m_addr += size;</p><p> fsize -= size;</p><p>
48、 find=p->next;</p><p> if(p->size==0)</p><p><b> {</b></p><p> t = getpch(LN);</p><p> t=p->next;</p><p> t->front=p->fron
49、t;</p><p> (t->front)->next=t;</p><p><b> n--;</b></p><p> if (p == L) {L=t;}</p><p><b> free(p);</b></p><p><b> f
50、ind = t;</b></p><p><b> }</b></p><p> printf("\n分配成功!\n");</p><p><b> break;</b></p><p><b> }</b></p><
51、;p> } while (1);</p><p> }// end of NF_Assign</p><p><b> 運(yùn)行結(jié)果如下:</b></p><p> 3.3 最優(yōu)適應(yīng)算法</p><p> 空閑區(qū)按容量遞增的次序排列。</p><p> 分配:當(dāng)進(jìn)程申請存儲空間,系
52、統(tǒng)順序查找空閑區(qū)表(鏈),直到找到第一個滿足容量要求的空閑區(qū)為止。</p><p> 采用最優(yōu)適應(yīng)算法選中的空閑區(qū)是滿足容量要求的最小空閑區(qū)。</p><p> 優(yōu)點:選中的空閑區(qū)是滿足容量要求的最小空閑區(qū),而不致于毀掉較大的空閑區(qū)。</p><p> 缺點:空閑區(qū)的大小一般與申請分區(qū)大小不相等,因此將其一分為二,留下來的空閑區(qū)一般情況下是很小的,以致無法使用
53、。隨著時間的推移,系統(tǒng)中的小空閑區(qū)會越來越多,從而造成存儲空間的浪費(fèi)。</p><p> 最優(yōu)適應(yīng)算法代碼實現(xiàn):</p><p> #include<stdio.h></p><p> void main()</p><p> { int m,n,i,j,j0,k,k0,A[30][3],B[30];</p>
54、;<p> printf("請輸入空閑分區(qū)塊數(shù):");</p><p> scanf("%d",&m);</p><p> printf("\t分區(qū)號\t\t大小\t\t起始地址\n");</p><p> for(i=0;i<m;i++)</p><
55、p> for(j=0;j<3;j++)</p><p> scanf("%d",&A[i][j]);</p><p> /* 按空閑區(qū)的容量大小從小到大排列(直接選擇排序) */</p><p> for(i=0;i<m-1;i++)</p><p><b> { k0=
56、i;</b></p><p> for(k=i+1;k<m;k++)</p><p> if(A[k][1]<A[k0][1])k0=k;</p><p><b> if(k0!=i)</b></p><p> { for(j=0;j<3;j++)</p><p
57、> { int t;</p><p> t=A[k0][j];</p><p> A[k0][j]=A[i][j];</p><p> A[i][j]=t;</p><p><b> }</b></p><p><b> }</b></p>
58、<p><b> }</b></p><p> printf("\n----最佳適應(yīng)算法按空閑區(qū)的容量從小到大排列后空閑區(qū)----\n");</p><p> printf("\t分區(qū)號\t\t大小\t\t起始地址\n");</p><p> for(i=0;i<m;i++)&
59、lt;/p><p> for(j=0;j<3;j++)</p><p> { printf("\t%d\t",A[i][j]);</p><p> if(j==2)printf("\n");</p><p><b> }</b></p><p>
60、; printf("\n請輸入要分配的作業(yè)數(shù):");</p><p> scanf("%d",&n);</p><p> printf("請輸入作業(yè)大小:\n");</p><p> for(j0=0;j0<n;j0++)</p><p> scanf(&qu
61、ot;%d",&B[j0]);</p><p><b> i=j0=0;</b></p><p><b> do</b></p><p> { while(A[i][1]<B[j0]&&i<m)</p><p><b> i++;&
62、lt;/b></p><p> if(i==m)printf("\n內(nèi)存不足,%dK大小的作業(yè)需要等待內(nèi)存資源!\n",B[j0]);</p><p><b> if(i<m)</b></p><p> { A[i][1]=A[i][1]-B[j0];</p><p> A[
63、i][2]=A[i][2]+B[j0];</p><p><b> }</b></p><p><b> j0++;</b></p><p> for(i=0;i<m-1;i++)</p><p><b> { k0=i;</b></p><
64、;p> for(k=i+1;k<m;k++)</p><p> if(A[k][1]<A[k0][1])k0=k;</p><p><b> if(k0!=i)</b></p><p> { for(j=0;j<3;j++)</p><p> { int t;</p>
65、<p> t=A[k0][j];</p><p> A[k0][j]=A[i][j];</p><p> A[i][j]=t;</p><p><b> }</b></p><p><b> }</b></p><p><b> }<
66、/b></p><p><b> i=0;</b></p><p> }while(j0<n);</p><p> printf("\n----最佳適應(yīng)算法分區(qū)分配后的空閑區(qū)----\n");</p><p> printf("\t分區(qū)號\t\t大小\t\t起始地址\n
67、");</p><p> for(i=0;i<m;i++)</p><p> for(j=0;j<3;j++)</p><p> { if(A[i][1]) printf("\t%d\t",A[i][j]);</p><p> if(j==2) printf("\n&quo
68、t;);</p><p><b> }</b></p><p><b> }</b></p><p><b> 運(yùn)行結(jié)果如下:</b></p><p> 3.4 最壞適應(yīng)算法</p><p> 為了克服最佳適應(yīng)算法把空閑區(qū)切割得太小的缺點,人
69、們提出了一種最壞適應(yīng)算法,即每次分配時,總是將最大的空閑區(qū)切去一部分分配給請求者,剩余的部分仍是一個較大的空閑區(qū)。避免了空閑區(qū)越分越小的問題。</p><p> 要求空閑區(qū)按容量遞減的順序排列。</p><p> 分配:進(jìn)程申請存儲區(qū)時,檢查空閑區(qū)表(鏈)的第一個空閑區(qū)的大小是否滿足要求,若不滿足則令進(jìn)程等待;若滿足則從該空閑區(qū)中分配一部分存儲區(qū)給用戶,剩下的部分仍作為空閑區(qū)。<
70、/p><p> 最壞適應(yīng)算法代碼實現(xiàn):</p><p> #include<stdio.h></p><p> void main()</p><p> { int m,n,i,j,j0,k,k0,A[30][3],B[30];</p><p> printf("請輸入空閑分區(qū)塊數(shù):&q
71、uot;);</p><p> scanf("%d",&m);</p><p> printf("\t分區(qū)號\t\t大小\t\t起始地址\n");</p><p> for(i=0;i<m;i++)</p><p> for(j=0;j<3;j++)</p>&
72、lt;p> scanf("%d",&A[i][j]);</p><p> /* 按空閑區(qū)的容量大小從小到大排列(直接選擇排序) */</p><p> for(i=0;i<m-1;i++)</p><p><b> { k0=i;</b></p><p> for(
73、k=i+1;k<m;k++)</p><p> if(A[k][1]<A[k0][1])k0=k;</p><p><b> if(k0!=i)</b></p><p> { for(j=0;j<3;j++)</p><p> { int t;</p><p>
74、t=A[k0][j];</p><p> A[k0][j]=A[i][j];</p><p> A[i][j]=t;</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p
75、><p> printf("\n----最佳適應(yīng)算法按空閑區(qū)的容量從小到大排列后空閑區(qū)----\n");</p><p> printf("\t分區(qū)號\t\t大小\t\t起始地址\n");</p><p> for(i=0;i<m;i++)</p><p> for(j=0;j<3;j+
76、+)</p><p> { printf("\t%d\t",A[i][j]);</p><p> if(j==2)printf("\n");</p><p><b> }</b></p><p> printf("\n請輸入要分配的作業(yè)數(shù):");&l
77、t;/p><p> scanf("%d",&n);</p><p> printf("請輸入作業(yè)大小:\n");</p><p> for(j0=0;j0<n;j0++)</p><p> scanf("%d",&B[j0]);</p><
78、;p><b> i=j0=0;</b></p><p><b> do</b></p><p> { while(A[i][1]<B[j0]&&i<m)</p><p><b> i++;</b></p><p> if(i==m
79、)printf("\n內(nèi)存不足,%dK大小的作業(yè)需要等待內(nèi)存資源!\n",B[j0]);</p><p><b> if(i<m)</b></p><p> { A[i][1]=A[i][1]-B[j0];</p><p> A[i][2]=A[i][2]+B[j0];</p><p&g
80、t;<b> }</b></p><p><b> j0++;</b></p><p> for(i=0;i<m-1;i++)</p><p><b> { k0=i;</b></p><p> for(k=i+1;k<m;k++)</p>
81、<p> if(A[k][1]<A[k0][1])k0=k;</p><p><b> if(k0!=i)</b></p><p> { for(j=0;j<3;j++)</p><p> { int t;</p><p> t=A[k0][j];</p><
82、;p> A[k0][j]=A[i][j];</p><p> A[i][j]=t;</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> i
83、=0;</b></p><p> }while(j0<n);</p><p> printf("\n----最佳適應(yīng)算法分區(qū)分配后的空閑區(qū)----\n");</p><p> printf("\t分區(qū)號\t\t大小\t\t起始地址\n");</p><p> for(i=0;
84、i<m;i++)</p><p> for(j=0;j<3;j++)</p><p> { if(A[i][1]) printf("\t%d\t",A[i][j]);</p><p> if(j==2) printf("\n");</p><p><b> }&l
85、t;/b></p><p><b> }</b></p><p><b> 運(yùn)行結(jié)果如下:</b></p><p> 第四章:實現(xiàn)對分配內(nèi)存后進(jìn)行回收的算法</p><p> 4.1 可變分區(qū)的回收</p><p> 當(dāng)某個進(jìn)程釋放某存儲區(qū)時,系統(tǒng)首先檢查釋
86、放區(qū)是否與系統(tǒng)中的空閑區(qū)相鄰,若相鄰則把釋放區(qū)合并到相鄰的空閑區(qū)中去,否則把釋放區(qū)作為一個空閑區(qū)插入到空閑區(qū)表的適當(dāng)位置。</p><p> 釋放區(qū)與空閑區(qū)相鄰的四種情況</p><p> (a)釋放區(qū)與前空閑區(qū)相鄰:將釋放區(qū)與前空閑區(qū)合并為一個空閑區(qū)。其首址仍為前空閑區(qū)首址,大小為釋放區(qū)大小與空閑區(qū)大小之和。</p><p> (b)釋放區(qū)與后空閑區(qū)相鄰:則
87、把釋放區(qū)合并到后空閑,首地址為釋放區(qū)首地址,大小為二者大小之和。</p><p> (c)釋放區(qū)與前后兩個空閑區(qū)相鄰:將這三個區(qū)合為一個空閑區(qū),其首址為前空閑區(qū)首址,大小為這三個區(qū)大小之和,并取消原后空閑區(qū)表目。</p><p> (d)釋放區(qū)不與任何空閑區(qū)相鄰:將釋放區(qū)作為一個空閑區(qū),將其大小和首址插入到空閑區(qū)表的適當(dāng)位置。</p><p> 4.2 對可
88、變分區(qū)回收的流程圖</p><p> 當(dāng)對內(nèi)存進(jìn)行了為作業(yè)分配了存儲大小時,使用完后要將它回收,其回收的流程圖如下:</p><p> 4.3 利用可變分區(qū)的首次適應(yīng)算法,模擬內(nèi)存的分配與回收算法。</p><p> 一、基本思想:可變分區(qū)分配是根據(jù)進(jìn)程的實際需求,動態(tài)地為之分配內(nèi)存空間。首次適應(yīng)算法要求空閑空間鏈以地址遞增的次序鏈接。進(jìn)行內(nèi)存分配時,從鏈
89、表頭部開始依次檢索,找到第一個不小于請求空間大小的空閑空間進(jìn)行分配。分配時需考慮碎片問題,若分配會導(dǎo)致碎片產(chǎn)生則將整塊分區(qū)分配。</p><p><b> 二、主要數(shù)據(jù)結(jié)構(gòu):</b></p><p> struct FreeArea{ 鏈結(jié)點包含的數(shù)據(jù):分區(qū)號、大小、起址、標(biāo)記 </p><p><b>
90、 int ID;</b></p><p><b> int size;</b></p><p> long address;</p><p><b> int sign;</b></p><p><b> };</b></p><p&g
91、t; struct Node { 雙鏈表結(jié)點結(jié)構(gòu)體:數(shù)據(jù)區(qū)、前向指針、后繼指針</p><p> FreeArea data;</p><p> struct Node *prior; </p><p> struct Node *next; </p><p> }*DLinkList;</p>&l
92、t;p><b> 三、源程序代碼:</b></p><p> #include<iostream></p><p> using namespace std;</p><p> #define Free 0 //空閑狀態(tài)</p><p> #define Busy 1 //已用狀態(tài)</p
93、><p> #define PBusy 2 //碎片已用狀態(tài)</p><p> #define FINISH 1 //完成</p><p> #define FINISH2 1 //完成</p><p> #define ERROR 0 //出錯</p><p> #define memory 512
94、 //最大內(nèi)存空間為(單位:KB)</p><p> #define min 10 //碎片最小值(單位:KB)</p><p> typedef struct FreeArea//空閑鏈數(shù)據(jù)</p><p><b> {</b></p><p><b> int ID;</b></p
95、><p><b> int size;</b></p><p> long address;</p><p><b> int sign;</b></p><p><b> };</b></p><p> typedef struct Node /
96、/空閑連結(jié)構(gòu)</p><p><b> { </b></p><p> FreeArea data;</p><p> struct Node *prior; </p><p> struct Node *next; </p><p> }*DLinkList;</p>
97、<p> DLinkList head; //頭結(jié)點</p><p> DLinkList tail; //尾結(jié)點</p><p> int Create()//初始化</p><p><b> {</b></p><p> head=(DLinkList)malloc(sizeof(Node)
98、);//分配內(nèi)存</p><p> tail=(DLinkList)malloc(sizeof(Node));</p><p> head->prior=NULL;</p><p> head->next=tail;</p><p> tail->prior=head;</p><p> t
99、ail->next=NULL;</p><p> tail->data.address=0;</p><p> tail->data.size=memory;</p><p> tail->data.ID=0;</p><p> tail->data.sign=Free;</p><p
100、> return FINISH;</p><p><b> }</b></p><p> int FirstFit(int ID,int request)//首次適應(yīng)算法</p><p><b> {</b></p><p> DLinkList temp=(DLinkList)ma
101、lloc(sizeof(Node));//新建作業(yè)的結(jié)點</p><p> temp->data.ID=ID;</p><p> temp->data.size=request;</p><p> temp->data.sign=Busy;</p><p> Node *p=head;//插入指針P </p&g
102、t;<p><b> while(p)</b></p><p><b> {</b></p><p> if(p->data.sign==Free && p->data.size==request)//剩余大小恰好滿足{</p><p> p->data.sign=B
103、usy;</p><p> p->data.ID=ID;</p><p> return FINISH;</p><p><b> break;</b></p><p><b> }</b></p><p> else if(p->data.sign==
104、Free && p->data.size>request && (p->data.size-request>min))//滿足需求且有剩余且不產(chǎn)生碎片</p><p><b> {</b></p><p> temp->prior=p->prior;</p><p> t
105、emp->next=p;</p><p> temp->data.address=p->data.address;</p><p> p->prior->next=temp;</p><p> p->prior=temp;</p><p> p->data.address=temp->d
106、ata.address+temp->data.size;</p><p><b> p->data</b></p><p> .size=p->data.size-request;</p><p> return FINISH;</p><p><b> break;</b>
107、;</p><p><b> }</b></p><p> else if(p->data.sign==Free && p->data.size>request && p->data.size-request<=min)//產(chǎn)生碎片時</p><p><b> {&l
108、t;/b></p><p> p->data.sign=PBusy;</p><p> p->data.ID=ID;</p><p> return FINISH;</p><p><b> break;</b></p><p><b> }</b>
109、;</p><p> p=p->next;//若前面的分區(qū)都已分配,P指針后移</p><p><b> }</b></p><p> return ERROR;</p><p><b> }</b></p><p> int Allocate()//主存分配
110、</p><p><b> {</b></p><p> int ID,request;</p><p> cout<<"請輸入作業(yè)所在分區(qū)號:";</p><p><b> cin>>ID;</b></p><p> c
111、out<<"請輸入分配的主存(單位:KB):";</p><p> cin>>request;</p><p> if(request<0 ||request==0)</p><p><b> {</b></p><p> cout<<"分配
112、的主存必須是正整數(shù)!"<<endl;</p><p> return ERROR;</p><p><b> }</b></p><p> if(FirstFit(ID,request)==FINISH)</p><p> cout<<"分配成功!"<&
113、lt;endl;</p><p><b> else</b></p><p> cout<<"內(nèi)存不足,分配失敗!"<<endl;</p><p><b> }</b></p><p> int Recycle(int ID)//回收</p&
114、gt;<p><b> {</b></p><p> Node *p=head;</p><p><b> while(p)</b></p><p><b> {</b></p><p> if(p->data.ID==ID)</p>
115、<p><b> {</b></p><p> p->data.sign=Free;</p><p> //p->data.ID=Free;</p><p> if((p->prior->data.sign==Free)&&(p->next->data.sign==Free
116、))//與前后的空閑塊相連</p><p><b> {</b></p><p> p->prior->data.size=p->prior->data.size+p->data.size+p->next->data.size;</p><p> p->prior->next=p-&g
117、t;next->next;</p><p> if(p->next->next==NULL)//若p->next是最后一個結(jié)點</p><p> {p->prior->data.ID=Free;p->next=NULL;}</p><p> else{p->next->next->prior=p-&g
118、t;prior;}</p><p><b> break; </b></p><p><b> }</b></p><p> if(p->prior->data.sign==Free)//與前面的空閑塊相連</p><p><b> {</b></p&
119、gt;<p> p->prior->data.size+=p->data.size;</p><p> p->prior->next=p->next;</p><p> p->next->prior=p->prior;</p><p><b> break;</b>&l
120、t;/p><p><b> }</b></p><p> if(p->next->data.sign==Free)//與后面的空閑塊相連</p><p><b> {</b></p><p> p->data.size+=p->next->data.size;<
121、;/p><p> if(p->next->next==NULL)//若p->next是最后一個結(jié)點</p><p> p->next=NULL;</p><p><b> else{</b></p><p> p->next->next->prior=p;</p>
122、<p> p->next=p->next->next;}</p><p><b> break;</b></p><p><b> }</b></p><p><b> break;</b></p><p><b> }
123、</b></p><p> p=p->next;</p><p><b> }</b></p><p> cout<<"分區(qū):"<<ID<<"回收成功"<<endl;</p><p> return FINI
124、SH;</p><p><b> }</b></p><p> void show()//顯示</p><p><b> {</b></p><p> cout<<" 主存分配情況 \n";</p><
125、;p> Node *p=head->next;</p><p><b> while(p)</b></p><p><b> {</b></p><p> cout<<"分區(qū)號:";</p><p> if(p->data.ID==Free
126、)</p><p> cout<<"Free"<<endl;</p><p><b> else</b></p><p> cout<<p->data.ID<<endl;</p><p> cout<<"起始地址:&q
127、uot;<<p->data.address;</p><p> cout<<" 分區(qū)大?。?quot;<<p->data.size<<" KB";</p><p> cout<<" 狀 態(tài):";</p><p> if(p-
128、>data.sign==Free)</p><p> cout<<"空 閑"<<endl;</p><p> else if(p->data.sign==PBusy)</p><p> cout<<"碎片已分配"<<endl;</p><p&
129、gt;<b> else</b></p><p> cout<<"已分配"<<endl;</p><p> p=p->next;</p><p><b> }</b></p><p> cout<<endl;</p>
130、<p><b> }</b></p><p> void main()</p><p><b> {</b></p><p><b> Create();</b></p><p> int choice;</p><p><
131、b> int i;</b></p><p> for(i=0;;i++)</p><p><b> { </b></p><p> cout<<"請輸入操作:";</p><p> cout<<"1.分配內(nèi)存 2.回收內(nèi)存
132、 3.顯示主存 0.退出";</p><p> cout<<endl;</p><p> cin>>choice;</p><p> if(choice==1)// 分配內(nèi)存</p><p> Allocate();</p><p> else if(choice
133、==2)// 內(nèi)存回收</p><p> { int ID;</p><p> cout<<"請輸入要釋放的分區(qū)號:";</p><p><b> cin>>ID;</b></p><p> Recycle(ID);</p><p><
134、;b> }</b></p><p> else if(choice==3)//顯示主存</p><p><b> show();</b></p><p> else if(choice==0)//退出</p><p><b> break;</b></p>
135、<p> else //非法輸入</p><p><b> {</b></p><p> cout<<"輸入有誤!"<<endl;</p><p><b> continue;</b></p><p><b> }</b
136、></p><p><b> }</b></p><p><b> }</b></p><p><b> 運(yùn)行結(jié)果如下:</b></p><p> 第五章 有關(guān)動態(tài)分區(qū)的數(shù)據(jù)結(jié)構(gòu)、存儲管理分析及實現(xiàn)虛擬內(nèi)存的算法</p><p> 5.
137、1 實現(xiàn)動態(tài)分區(qū)需要的數(shù)據(jù)結(jié)構(gòu)</p><p> 在動態(tài)分區(qū)存儲管理中,要有相應(yīng)的數(shù)據(jù)結(jié)構(gòu)來登記空閑區(qū)信息,它包括空閑區(qū)的大小和位置。</p><p> 不同系統(tǒng)根據(jù)設(shè)計要求采用不同的結(jié)構(gòu)。常用的有表結(jié)構(gòu)和鏈結(jié)構(gòu)。</p><p> 系統(tǒng)還要設(shè)置了等待分區(qū)隊列,當(dāng)系統(tǒng)中無空閑區(qū)或無滿足要求的空閑區(qū)時,則把申請者送入等待隊列中,等待別的進(jìn)程釋放內(nèi)存之后再喚醒隊
138、列中的進(jìn)程。</p><p> 5.2 可變分區(qū)存儲管理分析:</p><p><b> 優(yōu)點:</b></p><p> 1.有助于多道程序設(shè)計</p><p> 2.不需過多硬件,僅需界地址寄存器用于存儲保護(hù)</p><p> 3.所采用的算法都比較簡單,易于實現(xiàn)</p>
139、;<p><b> 缺點:</b></p><p><b> 1.碎片問題</b></p><p> 由于空閑區(qū)的大小與申請內(nèi)存的大小相等的情況是很少的,絕大多數(shù)情況是從一個空閑區(qū)中切去一塊,剩下的部分作為一個空閑區(qū)仍留在空閑區(qū)表中,隨著時間的推移,空閑區(qū)的發(fā)展趨勢是越來越小,直至不能滿足任何用戶要求。</p>
140、<p> 這種不能被任何用戶使用的極小的空閑區(qū)稱為碎片。碎片的出現(xiàn)造成了存儲空間的浪費(fèi)。</p><p> 2.分區(qū)大小受主存容量限制,無法擴(kuò)充主存容量</p><p> 5.3 使用三種方法FIFO、OPI、LRU實現(xiàn)虛擬內(nèi)存頁面置換算法</p><p><b> 代碼實現(xiàn)如下:</b></p><p&
141、gt; //--------------- YeMianZhiHuan.cpp -----------------</p><p> #include "iostream.h"</p><p> const int DataMax=100;</p><p> const int BlockNum = 10;</p><
142、p> int DataShow[BlockNum][DataMax]; // 用于存儲要顯示的數(shù)組</p><p> bool DataShowEnable[BlockNum][DataMax]; // 用于存儲數(shù)組中的數(shù)據(jù)是否需要顯示</p><p> //int Data[DataMax]={4,3,2,1,4,3,5,4,3,2,1,5,6,2,3,7,1,2,6,1};
143、 // 測試數(shù)據(jù)</p><p> //int N = 20; // 輸入頁面?zhèn)€數(shù)</p><p> int Data[DataMax]; // 保存數(shù)據(jù)</p><p> int Block[BlockNum]; // 物理塊</p><p> int count[BlockNum]; // 計數(shù)器</p><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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(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)模擬進(jìn)程課程設(shè)計
- 操作系統(tǒng)課程設(shè)計-- 操作系統(tǒng)
- 操作系統(tǒng)課程設(shè)計---進(jìn)程調(diào)度子系統(tǒng)模擬實現(xiàn)
評論
0/150
提交評論