11 操作系统第三章 内存管理 内存的基本知识 内存管理 内存空间扩充 连续分配管理方式
文章目錄
- 1 內(nèi)存概念
- 1.1 內(nèi)存作用
- 1.2 邏輯地址VS物理地址
- 1.3 裝入的三種方式
- 1.3.1 絕對(duì)裝入
- 1.3.2 可重定位裝入
- 1.3.3 動(dòng)態(tài)重定位裝入
- 1.4 鏈接的三種方式
- 1.4.1 靜態(tài)鏈接
- 1.4.2 裝入時(shí)動(dòng)態(tài)鏈接
- 1.4.3 運(yùn)行時(shí)動(dòng)態(tài)鏈接
- 1.5 內(nèi)存的基礎(chǔ)知識(shí)小結(jié)
- 2 內(nèi)存管理
- 2.1 內(nèi)存管理的任務(wù)
- 2.2 內(nèi)存保護(hù)的兩種方法
- 2.3 內(nèi)存管理小結(jié)
- 3 內(nèi)存空間擴(kuò)充
- 3.1 內(nèi)存空間擴(kuò)充之覆蓋技術(shù)
- 3.2 內(nèi)存空間擴(kuò)充之交換技術(shù)
- 3.3 覆蓋與交換技術(shù)小結(jié)
- 4 內(nèi)存空間分配
- 4.1 單一連續(xù)分配
- 4.2 固定分區(qū)分配
- 4.3 動(dòng)態(tài)分區(qū)分配
- 4.4 連續(xù)分配管理小結(jié)
- 4.5 動(dòng)態(tài)分區(qū)分配算法
- 4.5.1 首次適應(yīng)算法
- 4.5.2 最佳適應(yīng)算法
- 4.5.3 最壞(大)適應(yīng)算法
- 4.5.4 鄰近適應(yīng)算法
- 4.5.5 動(dòng)態(tài)分區(qū)分配算法小結(jié)
1 內(nèi)存概念
1.1 內(nèi)存作用
內(nèi)存可存放數(shù)據(jù)。程序執(zhí)行前需要先放到內(nèi)存中才能被CPU處理一一緩和CPU與硬盤(pán)之間的速度矛盾
思考:在多道程序環(huán)境下,系統(tǒng)中會(huì)有多個(gè)程序并發(fā)執(zhí)行,也就是說(shuō)會(huì)有多個(gè)程序的數(shù)據(jù)需要同時(shí)放到內(nèi)存中。那么,如何區(qū)分各個(gè)程序的數(shù)據(jù)是放在什么地方的呢?
方案:給內(nèi)存的存儲(chǔ)單元編地址
內(nèi)存地址相當(dāng)于酒店旅館中的小房間,酒店管理者為了便于管理每個(gè)房間,采取給每個(gè)房間編號(hào)
內(nèi)存中也有一個(gè)一個(gè)的“小房間”,每個(gè)小房間就是一 個(gè)“存儲(chǔ)單元”
如果計(jì)算機(jī)“按字節(jié)編址”, 則每個(gè)存儲(chǔ)單元大小為1字節(jié),即1B,即8個(gè)二進(jìn)制位
如果字長(zhǎng)為16位的計(jì)算機(jī) “按字編址”,則每個(gè)存儲(chǔ)單元大小為1個(gè)字;每個(gè)字的大小為16個(gè)二進(jìn)制位
存儲(chǔ)單元大小由計(jì)算機(jī)按字編址還是按字節(jié)編址來(lái)確定
一臺(tái)手機(jī)/電腦有4GB內(nèi)存,是指該內(nèi)存中可以存放4X2 30個(gè)字節(jié)。
如果是按字節(jié)編址的 話,也就是有4X2 30=232個(gè)“小房間”
這么多“小房間”,需要232個(gè)地址才能一一標(biāo)識(shí),所以地址需要用32個(gè)二進(jìn)制位來(lái)表示(0~232-1)
210=1K (千)
220=1M (兆,百萬(wàn))
230=1G (十億,千兆)
可以通過(guò)內(nèi)存的大小,讓我們確定地址長(zhǎng)度應(yīng)該是多少(即要多少個(gè)二進(jìn)制位才能表示相應(yīng)數(shù)目的存儲(chǔ)單元)
1.2 邏輯地址VS物理地址
實(shí)際生活中的例子:
宿舍四個(gè)人一起出去旅行,四個(gè)人的學(xué)號(hào)尾號(hào)分別是0、1、2、3。
住酒店時(shí)酒店給你們安排了4個(gè)房號(hào)相連的房間。四個(gè)人按學(xué)號(hào)遞增次序入住房間。比如0、1、2、3號(hào)同學(xué)分別入住了5、6、7、8號(hào)房間。
四個(gè)人的編號(hào)0、1、2、3其實(shí)是一個(gè)“相對(duì)位置”,而各自入住的房間號(hào)是一個(gè)“絕對(duì)位置”。
只要知道0號(hào)同學(xué)住的是房號(hào)為N的房間,那么M號(hào)同學(xué)的房號(hào)一定是N+M。
指令中的地址也可以采用這種思想。編譯時(shí)產(chǎn)生的指令只關(guān)心“相對(duì)地址”,實(shí)際放入內(nèi)存中時(shí)再想辦法根據(jù)起始位置得到“絕對(duì)地址”。
相對(duì)地址又稱邏輯地址,絕對(duì)地址又稱物理地址。
從寫(xiě)程序到程序運(yùn)行:
程序經(jīng)過(guò)編譯、鏈接后生成的指令中指明的是邏輯地址(相對(duì)地址),即:相對(duì)于進(jìn)程的起始地址而言的地址
如何將指令中的邏輯地址轉(zhuǎn)換為物理地址?
策略:三種裝入方式
1.3 裝入的三種方式
1.3.1 絕對(duì)裝入
絕對(duì)裝入:在編譯時(shí),如果知道程序?qū)⒎诺絻?nèi)存中的哪個(gè)位置,編譯程序?qū)a(chǎn)生絕對(duì)地址的目標(biāo)代碼。 裝入程序按照裝入模塊中的地址,將程序和數(shù)據(jù)裝入內(nèi)存。
編譯、鏈接后得到的裝入模塊的指令直接就使用了絕對(duì)地址。
絕對(duì)裝入只適用于單道程序環(huán)境。 程序中使用的絕對(duì)地址,可在編譯或匯編時(shí)給出,也可由程序 員直接賦予。通常情況下都是編譯或匯編時(shí)再轉(zhuǎn)換為絕對(duì)地址。
1.3.2 可重定位裝入
靜態(tài)重定位:又稱可重定位裝入。編譯、鏈接后的裝入模塊的地址都是從0開(kāi)始的,指令中使用的地址、數(shù)據(jù)存放的地址都是相對(duì)于起始地址而言的邏輯地址。可根據(jù)內(nèi)存的當(dāng)前情況,將裝入模塊裝入到內(nèi)存的適當(dāng)位置。裝入時(shí)對(duì)地址進(jìn)行“重定位”,將邏輯地址變換為物理地址(地址變換是在裝入時(shí)一次完成的)。
靜態(tài)重定位的特點(diǎn)是在一個(gè)作業(yè)裝入內(nèi)存時(shí),必須分配其要求的全部?jī)?nèi)存空間,如果沒(méi)有足夠的內(nèi)存,就不能裝入該作業(yè)。 作業(yè)一旦進(jìn)入內(nèi)存后,在運(yùn)行期間就不能再移動(dòng),也不能再申請(qǐng)內(nèi)存空間。
1.3.3 動(dòng)態(tài)重定位裝入
動(dòng)態(tài)重定位:又稱動(dòng)態(tài)運(yùn)行時(shí)裝入。編譯、鏈接后的裝入模塊的地址都是從0開(kāi)始的。裝入程序把裝 入模塊裝入內(nèi)存后,并不會(huì)立即把邏輯地址轉(zhuǎn)換為物理地址,而是把地址轉(zhuǎn)換推遲到程序真正要執(zhí)行 時(shí)才進(jìn)行。因此裝入內(nèi)存后所有的地址依然是邏輯地址。這種方式需要一個(gè)重定位寄存器的支持。
1.4 鏈接的三種方式
1.4.1 靜態(tài)鏈接
1.4.2 裝入時(shí)動(dòng)態(tài)鏈接
1.4.3 運(yùn)行時(shí)動(dòng)態(tài)鏈接
1.5 內(nèi)存的基礎(chǔ)知識(shí)小結(jié)
2 內(nèi)存管理
2.1 內(nèi)存管理的任務(wù)
操作系統(tǒng)作為系統(tǒng)資源的管理者,當(dāng)然也需要對(duì)內(nèi)存進(jìn)行管理,要管些什么呢?
1.操作系統(tǒng)負(fù)責(zé)內(nèi)存空間的分配與回收
游戲GTA的大小超過(guò)60GB,按理來(lái)說(shuō)這個(gè)游戲程序運(yùn)行之前需要把60GB數(shù)據(jù)全部放入內(nèi)存。然而,實(shí)際我的電腦內(nèi)存才12GB,但為什么這個(gè)游戲可以順利運(yùn)行呢?
——虛擬技術(shù)(操作系統(tǒng)的虛擬性)
為了使編程更方便,程序員寫(xiě)程序時(shí)應(yīng)該只需要關(guān)注指令、數(shù)據(jù)的邏輯地址。而邏輯地址到物理地址的轉(zhuǎn)換(這個(gè)過(guò)程稱為地址重定位)應(yīng)該由操作系統(tǒng)負(fù)責(zé),這樣就保證了程序員寫(xiě)程序時(shí)不需要關(guān)注物理內(nèi)存的實(shí)際情況。
三種裝入方式實(shí)現(xiàn)邏輯地址與物理地址的轉(zhuǎn)換:
使得各個(gè)進(jìn)程只能訪問(wèn)自己的內(nèi)存空間
2.2 內(nèi)存保護(hù)的兩種方法
方法一:在CPU中設(shè)置一對(duì)上、下限寄存器,存放進(jìn)程的上、下限地址。進(jìn)程的指令要訪問(wèn)某個(gè)地址時(shí),CPU檢查是否越界。
方法二:采用重定位寄存器(又稱基址寄存器)和界地址寄存器(又稱限長(zhǎng)寄存器)進(jìn)行越界檢查。
重定位寄存器中存放的是進(jìn)程的起始物理地址。界地址寄存器中存放的是進(jìn)程的最大邏輯地址。
2.3 內(nèi)存管理小結(jié)
3 內(nèi)存空間擴(kuò)充
3.1 內(nèi)存空間擴(kuò)充之覆蓋技術(shù)
引入覆蓋技術(shù),用來(lái)解決“程序大小超過(guò)物理內(nèi)存總和”的問(wèn)題
覆蓋技術(shù)的思想:
將程序分為多個(gè)段(多個(gè)模塊)。 常用的段常駐內(nèi)存,不常用的段在需要時(shí)調(diào)入內(nèi)存。
內(nèi)存中分為一個(gè)“固定區(qū)”和若干個(gè)“覆蓋區(qū)”。
需要常駐內(nèi)存的段放在“固定區(qū)”中,調(diào)入后就不再調(diào)出(除非運(yùn)行結(jié)束)
不常用的段放在“覆蓋區(qū)”,需要用到時(shí)調(diào)入內(nèi)存, 用不到時(shí)調(diào)出內(nèi)存
由圖可見(jiàn),未使用覆蓋技術(shù)時(shí),程序執(zhí)行需要使用8K+8K+10K+12K+4K+10K=52K的內(nèi)存空間
采用覆蓋技術(shù)后,需要8K+10K+12K=30K的內(nèi)存空間
必須由程序員聲明覆蓋結(jié)構(gòu),操作系統(tǒng)完成自動(dòng)覆蓋。
缺點(diǎn):對(duì)用戶不透明,增加了用戶編程負(fù)擔(dān)。 覆蓋技術(shù)只用于早期的操作系統(tǒng)中,現(xiàn)在已成為歷史。
3.2 內(nèi)存空間擴(kuò)充之交換技術(shù)
交換(對(duì)換)技術(shù)的設(shè)計(jì)思想:內(nèi)存空間緊張時(shí),系統(tǒng)將內(nèi)存中某些進(jìn)程暫時(shí)換出外存,把外存中某些已具備運(yùn)行條件的進(jìn)程換入內(nèi)存(進(jìn)程在內(nèi)存與磁盤(pán)間動(dòng)態(tài)調(diào)度)
暫時(shí)換出外存等待的進(jìn)程狀態(tài)為掛起狀態(tài)(掛起態(tài),suspend)
掛起態(tài)又可以進(jìn)一步細(xì)分為就緒掛起、阻塞掛起兩種狀態(tài)
.
中級(jí)調(diào)度(內(nèi)存調(diào)度),就是要決定將哪個(gè)處于掛起狀態(tài)的進(jìn)程重新調(diào)入內(nèi)存。
交換技術(shù)面臨的問(wèn)題:
(1)文件區(qū)主要用于存放文件,主要追求存儲(chǔ)空間的利用率,因此對(duì)文件區(qū)空間的管理采用離散分配方式;
(2)對(duì)換區(qū)空間只占磁盤(pán)空間的小部分,被換出的進(jìn)程數(shù)據(jù)就存放在對(duì)換區(qū)。由于對(duì)換的速度直接影響到系統(tǒng)的整體速度,因此對(duì)換區(qū)空間的管理主要追求換入換出速度,因此通常對(duì)換區(qū)采用連續(xù)分配方式。
(3)總之,對(duì)換區(qū)的I/O速度比文件區(qū)的更快。
例如:在發(fā)現(xiàn)許多進(jìn)程運(yùn)行時(shí)經(jīng)常發(fā)生缺頁(yè),就說(shuō)明內(nèi)存緊張,此時(shí)可以換出一些進(jìn)程; 如果缺頁(yè)率明顯下降,就可以暫停換出。
注意:雖然交換技術(shù)會(huì)將內(nèi)存中某些進(jìn)程暫時(shí)換出外存,但進(jìn)程的PCB會(huì)常駐內(nèi)存,不會(huì)被換出外存
3.3 覆蓋與交換技術(shù)小結(jié)
4 內(nèi)存空間分配
內(nèi)存空間分配可分為連續(xù)分配管理方式和非連續(xù)分配管理方式
連續(xù)分配:指為用戶進(jìn)程分配的必須是一個(gè)連續(xù)的內(nèi)存空間
4.1 單一連續(xù)分配
在單一連續(xù)分配方式中,內(nèi)存被分為系統(tǒng)區(qū)和用戶區(qū)。
系統(tǒng)區(qū)通常位于內(nèi)存的低地址部分,用于存放操作系統(tǒng)相關(guān)數(shù)據(jù);用戶區(qū)用于存放用戶進(jìn)程相關(guān)數(shù)據(jù)。
單一連續(xù)分配 內(nèi)存中只能有一道用戶程序,用戶程序獨(dú)占整個(gè)用戶區(qū)空間。
優(yōu)點(diǎn):實(shí)現(xiàn)簡(jiǎn)單;無(wú)外部碎片;可以采用覆蓋技術(shù)擴(kuò)充 內(nèi)存;不一定需要采取內(nèi)存保護(hù)(eg:早期的PC操作系統(tǒng)MS-DOS)。
缺點(diǎn):只能用于單用戶、單任務(wù)的操作系統(tǒng)中;有內(nèi)部碎片;存儲(chǔ)器利用率極低。
4.2 固定分區(qū)分配
20世紀(jì)60年代出現(xiàn)了支持多道程序的系統(tǒng),為了能在內(nèi)存中裝入多道程序,且這些程序之間又不會(huì)相互干擾,于是將整個(gè)用戶空間劃分為若干個(gè)固定大小的分區(qū),在 每個(gè)分區(qū)中只裝入一道作業(yè),這樣就形成了最早的、最 簡(jiǎn)單的一種可運(yùn)行多道程序的內(nèi)存管理方式。
固定分區(qū)分配可分為分區(qū)大小相等、分區(qū).大小不等兩種類(lèi)型
分區(qū)大小相等:缺乏靈活性,但是很適合用于用一臺(tái)計(jì) 算機(jī)控制多個(gè)相同對(duì)象的場(chǎng)合(比如:鋼鐵廠有n個(gè)相 同的煉鋼爐,就可把內(nèi)存分為n個(gè)大小相等的區(qū)域存放 n個(gè)煉鋼爐控制程序)
分區(qū)大小不等:增加了靈活性,可以滿足不同大小的進(jìn) 程需求。根據(jù)常在系統(tǒng)中運(yùn)行的作業(yè)大小情況進(jìn)行劃分 (比如:劃分多個(gè)小分區(qū)、適量中等分區(qū)、少量大分區(qū))
操作系統(tǒng)需要建立一個(gè)數(shù)據(jù)結(jié)構(gòu)——分區(qū)說(shuō)明表,來(lái)實(shí)現(xiàn)各個(gè)分區(qū)的分配與回收。每個(gè)表項(xiàng)對(duì)應(yīng)一個(gè)分區(qū),通常按分區(qū)大小排列。每個(gè)表項(xiàng)包括對(duì)應(yīng)分區(qū)的 大小、起始地址、狀態(tài)(是否已分配)。
| 1 | 2 | 8 | 未分配 |
| 2 | 2 | 10 | 未分配 |
| 3 | 4 | 12 | 已分配 |
| ······· | ······· | ······· | ······· |
當(dāng)某用戶程序要裝入內(nèi)存時(shí),由操作系統(tǒng)內(nèi)核程序根據(jù)用戶程序大小檢索該表, 從中找到一個(gè)能滿足大小的、未分配的分區(qū),將之分配給該程序,然后修改狀 態(tài)為“已分配”。
優(yōu)點(diǎn):實(shí)現(xiàn)簡(jiǎn)單,無(wú)外部碎片。
缺點(diǎn):a.當(dāng)用戶程序太大時(shí),可能所有的分區(qū)都不能滿足需求,此時(shí)不得不采用覆蓋技術(shù)來(lái)解決,但這又會(huì)降低性能; b.會(huì)產(chǎn)生內(nèi)部碎片,內(nèi)存利用率低。
4.3 動(dòng)態(tài)分區(qū)分配
動(dòng)態(tài)分區(qū)分配又稱為可變分區(qū)分配。這種分配方式不會(huì)預(yù)先劃分內(nèi)存分區(qū),而是在進(jìn)程裝入內(nèi)存時(shí), 根據(jù)進(jìn)程的大小動(dòng)態(tài)地建立分區(qū),并使分區(qū)的大小正好適合進(jìn)程的需要。因此系統(tǒng)分區(qū)的大小和數(shù)目是可變的。
動(dòng)態(tài)分區(qū)分配核心問(wèn)題:
1.系統(tǒng)要用什么樣的數(shù)據(jù)結(jié)構(gòu)記錄內(nèi)存的使用情況?
2.當(dāng)很多個(gè)空閑分區(qū)都能滿足需求時(shí),應(yīng)該選擇哪個(gè)分區(qū)進(jìn)行分配?
3.如何進(jìn)行分區(qū)的分配與回收操作?
兩種常用的數(shù)據(jù)結(jié)構(gòu):空閑分區(qū)表和空閑分區(qū)鏈
每一時(shí)刻系統(tǒng)分配如下:
采用空閑分區(qū)表:
空閑分區(qū)表:每 個(gè)空閑分區(qū)對(duì)應(yīng) 一個(gè)表項(xiàng)。表項(xiàng) 中包含分區(qū)號(hào)、 分區(qū)大小、分區(qū) 起始地址等信息
| 1 | 20 | 8 | 空閑 |
| 2 | 10 | 32 | 空閑 |
| 3 | 4 | 60 | 空閑 |
空閑分區(qū)鏈:
空閑分區(qū)鏈:每個(gè)分區(qū)的起始部分和末尾部分分別設(shè)置前向指 針和后向指針。起始部分處還可記錄分區(qū)大小等信息
現(xiàn)有進(jìn)程5(4MB)調(diào)入內(nèi)存,應(yīng)該用最大的分區(qū)進(jìn)行分配?還是用最小的分區(qū)進(jìn)行分配?又或是用地址最低的部分進(jìn)行分配?
把一個(gè)新作業(yè)裝入內(nèi)存時(shí),須按照一定的動(dòng)態(tài)分區(qū)分配算法,從空閑分區(qū)表(或空閑分區(qū)鏈)中選出一個(gè)分區(qū)分配給該作業(yè)。
情況一:回收區(qū)的后面有一個(gè)相鄰的空閑分區(qū)
此時(shí)分區(qū)表是
| 1 | 10 | 32 | 空閑 |
| 2 | 4 | 60 | 空閑 |
假設(shè)此時(shí)進(jìn)程4運(yùn)行結(jié)束,將進(jìn)程4占用的4M內(nèi)存空間回收,而后面有一塊10M的相鄰空閑區(qū)
此時(shí)空閑分區(qū)表:
| 1 | 14 | 28 | 空閑 |
| 2 | 4 | 60 | 空閑 |
兩個(gè)相鄰的空閑分區(qū)合并為一個(gè)
情況二:回收區(qū)的前面有一個(gè)相鄰的空閑分區(qū)
此時(shí)空閑分區(qū)表:
| 1 | 20 | 8 | 空閑 |
| 2 | 10 | 32 | 空閑 |
假設(shè)此時(shí)進(jìn)程3運(yùn)行結(jié)束,將進(jìn)程3占用的18M內(nèi)存空間回收,而前面有一塊10M的相鄰空閑區(qū)
此時(shí)空閑分區(qū)表:
| 1 | 20 | 8 | 空閑 |
| 2 | 28 | 32 | 空閑 |
兩個(gè)相鄰的空閑分區(qū)合并為一個(gè)
情況三:回收區(qū)的前、后各有一個(gè)相鄰的空閑分區(qū)
此時(shí)空閑分區(qū)表:
| 1 | 20 | 8 | 空閑 |
| 2 | 10 | 32 | 空閑 |
| 3 | 4 | 60 | 空閑 |
假設(shè)此時(shí)進(jìn)程4運(yùn)行結(jié)束,將進(jìn)程4占用的4M內(nèi)存空間回收,而后面有一塊10M的相鄰空閑區(qū),前面有一塊20M的內(nèi)存空間
| 1 | 34 | 8 | 空閑 |
| 2 | 4 | 60 | 空閑 |
三個(gè)相鄰的空閑分區(qū)合并為一個(gè)
情況四:回收區(qū)的前、后都沒(méi)有相鄰的空閑分區(qū)
此時(shí)空閑分區(qū)表:
| 1 | 4 | 60 | 空閑 |
假設(shè)此時(shí)進(jìn)程2運(yùn)行結(jié)束,將進(jìn)程2占用的14M內(nèi)存空間回收,而后面有一塊4M的不相鄰空閑區(qū)
此時(shí)空閑分區(qū)表:
| 1 | 14 | 28 | 空閑 |
| 2 | 4 | 60 | 空閑 |
注:各表項(xiàng)的順序不一定按照地址遞增順序排列,具體的排列方式需要依據(jù)動(dòng)態(tài)分區(qū)分配算法來(lái)確定。
動(dòng)態(tài)分區(qū)分配又稱為可變分區(qū)分配。這種分配方式不會(huì)預(yù)先劃分內(nèi)存分區(qū),而是在進(jìn)程裝入內(nèi)存時(shí), 根據(jù)進(jìn)程的大小動(dòng)態(tài)地建立分區(qū),并使分區(qū)的大小正好適合進(jìn)程的需要。因此系統(tǒng)分區(qū)的大小和數(shù)目是可變的。
動(dòng)態(tài)分區(qū)分配沒(méi)有內(nèi)部碎片,但是有外部碎片。
內(nèi)部碎片,分配給某進(jìn)程的內(nèi)存區(qū)域中,如果有些部分沒(méi)有用上。 外部碎片,是指內(nèi)存中的某些空閑分區(qū)由于太小而難以利用。
如果內(nèi)存中空閑空間的總和本來(lái)可以滿足某進(jìn)程的要求, 但由于進(jìn)程需要的是一整塊連續(xù)的內(nèi)存空間,因此這些 “碎片”不能滿足進(jìn)程的需求。 可以通過(guò)緊湊(拼湊,Compaction)技術(shù)來(lái)解決外部碎片。
進(jìn)程1如何分配內(nèi)存空間?
緊湊法挪位
從而就可以將進(jìn)程1調(diào)入內(nèi)存
4.4 連續(xù)分配管理小結(jié)
4.5 動(dòng)態(tài)分區(qū)分配算法
動(dòng)態(tài)分區(qū)分配算法解決的問(wèn)題:
在動(dòng)態(tài)分區(qū)分配方式中, 當(dāng)很多個(gè)空閑分區(qū)都能滿足需求時(shí),應(yīng)該選擇哪個(gè)分區(qū)進(jìn)行分配?
4.5.1 首次適應(yīng)算法
算法思想:每次都從低地址開(kāi)始查找,找到第一個(gè)能滿足大小的空閑分區(qū)。
如何實(shí)現(xiàn):空閑分區(qū)以地址遞增的次序排列。每次分配內(nèi)存時(shí)順序查找空閑分區(qū)鏈(或空閑分區(qū) 表),找到大小能滿足要求的第一個(gè)空閑分區(qū)。
4.5.2 最佳適應(yīng)算法
算法思想:由于動(dòng)態(tài)分區(qū)分配是一種連續(xù)分配方式,為各進(jìn)程分配的空間必須是連續(xù)的一整片區(qū)域。因此為了保證當(dāng)“大進(jìn)程”到來(lái)時(shí)能有連續(xù)的大片空間,可以盡可能多地留下大片的空閑區(qū), 即,優(yōu)先使用更小的空閑區(qū)。
如何實(shí)現(xiàn):空閑分區(qū)按容量遞增次序鏈接。每次分配內(nèi)存時(shí)順序查找空閑分區(qū)鏈(或空閑分區(qū) 表),找到大小能滿足要求的第一個(gè)空閑分區(qū)。
缺點(diǎn):每次都選最小的分區(qū)進(jìn)行分配,會(huì)留下越來(lái)越多的、很小的、難以利用的內(nèi)存塊。因此這種方法會(huì)產(chǎn)生很多的外部碎片
4.5.3 最壞(大)適應(yīng)算法
算法思想:為了解決最佳適應(yīng)算法的問(wèn)題——即留下太多難以利用的小碎片,可以在每次分配時(shí)優(yōu)先使用最大的連續(xù)空閑區(qū),這樣分配后剩余的空閑區(qū)就不會(huì)太小,更方便使用。
如何實(shí)現(xiàn):空閑分區(qū)=按容量遞減次序鏈接。每次分配內(nèi)存時(shí)順序查找空閑分區(qū)鏈(或空閑分區(qū) 表),找到大小能滿足要求的第一個(gè)空閑分區(qū)。
缺點(diǎn):每次都選最大的分區(qū)進(jìn)行分配,雖然可以讓分配后留下的 空閑區(qū)更大,更可用,但是這種方式會(huì)導(dǎo)致較大的連續(xù)空閑區(qū)被 迅速用完。如果之后有“大進(jìn)程”到達(dá),就沒(méi)有內(nèi)存分區(qū)可用了。
4.5.4 鄰近適應(yīng)算法
算法思想:首次適應(yīng)算法每次都從鏈頭開(kāi)始查找的。這可能會(huì)導(dǎo)致低地址部分出現(xiàn)很多小的空閑分區(qū),而每次分配查找時(shí),都要經(jīng)過(guò)這些分區(qū),因此也增加了查找的開(kāi)銷(xiāo)。如果每次都從上次查找結(jié)束的位置開(kāi)始檢索,就能解決上述問(wèn)題。
如何實(shí)現(xiàn):空閑分區(qū)以地址遞增的順序排列(可排成一個(gè)循環(huán)鏈表)。每次分配內(nèi)存時(shí)從上次查找結(jié)束的位置開(kāi)始查找空閑分區(qū)鏈(或空閑分區(qū)表),找到大小能滿足要求的第一個(gè)空閑分區(qū)。
首次適應(yīng)算法每次都要從頭查找,每次都需要檢索低地址的小分區(qū)。 但是這種規(guī)則也決定了當(dāng)?shù)偷刂凡糠钟懈〉姆謪^(qū)可以滿足需求時(shí), 會(huì)更有可能用到低地址部分的小分區(qū),也會(huì)更有可能把高地址部分的大分區(qū)保留下來(lái)(最佳適應(yīng)算法的優(yōu)點(diǎn))
鄰近適應(yīng)算法的規(guī)則可能會(huì)導(dǎo)致無(wú)論低地址、高地址部分的空閑分區(qū)都有相同的概率被使用,也就導(dǎo)致了高地址部分的大分區(qū)更可能被使用,劃分為小分區(qū),最后導(dǎo)致無(wú)大分區(qū)可用(最大適應(yīng)算法的缺點(diǎn))
綜合來(lái)看,四種算法中,首次適應(yīng)算法的效果反而更好
4.5.5 動(dòng)態(tài)分區(qū)分配算法小結(jié)
總結(jié)
以上是生活随笔為你收集整理的11 操作系统第三章 内存管理 内存的基本知识 内存管理 内存空间扩充 连续分配管理方式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 图的知识点总结-数据结构
- 下一篇: 在Windows平台下使用Gitblit