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