六、操作系统——内存管理的概念(空间的分配与回收、空间的扩充、地址转换、存储保护)
一、概述
二、操作系統(tǒng)作為系統(tǒng)資源的管理者,當(dāng)然也需要對內(nèi)存進(jìn)行管理,要管些什么呢?
1. 內(nèi)存空間的分配與回收
連續(xù)分配:指為用戶進(jìn)程分配的必須是一個連續(xù)的內(nèi)存空間。
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ù)。
內(nèi)存中只能有一道用戶程序,用戶程序獨(dú)占整個用戶區(qū)空間。
優(yōu)點(diǎn):實(shí)現(xiàn)簡單;無外部碎片;可以采用覆蓋技術(shù)擴(kuò)充內(nèi)存;不一定需要采取內(nèi)存保護(hù)(eg:早期的PC操作系統(tǒng)MS-DOS)。
缺點(diǎn):只能用于單用戶、單任務(wù)的操作系統(tǒng)中;有內(nèi)部碎片;存儲器利用率極低。
(分配給某進(jìn)程的內(nèi)存區(qū)域中,如果有些部分沒有用上,這部分就是“內(nèi)部碎片”)
2. 固定分區(qū)分配
20世紀(jì)60年代出現(xiàn)了支持多道程序的系統(tǒng),為了能在內(nèi)存中裝入多道程序,且這些程序之間又不會相互干擾,于是將整個用戶空間劃分為若干個固定大小的分區(qū),在每個分區(qū)中只裝入一道作業(yè),這樣就形成了最早的、最簡單的一種可運(yùn)行多道程序的內(nèi)存管理方式。
1)分區(qū)大小相等:缺乏靈活性,但是很適合用于用一臺計算機(jī)控制多個相同對象的場合(比如:鋼鐵廠有n個相同的煉鋼爐,就可把內(nèi)存分為n個大小相等的區(qū)域存放n個煉鋼爐控制程序)
2)分區(qū)大小不等:增加了靈活性,可以滿足不同大小的進(jìn)程需求。根據(jù)常在系統(tǒng)中運(yùn)行的作業(yè)大小情況進(jìn)行劃分(比如:劃分多個小分區(qū)、適量中等分區(qū)、少量大分區(qū))
操作系統(tǒng)需要建立一個數(shù)據(jù)結(jié)構(gòu)——分區(qū)說明表,來實(shí)現(xiàn)各個分區(qū)的分配與回收。每個表項(xiàng)對應(yīng)一個分區(qū),通常按分區(qū)大小排列。每個表項(xiàng)包括對應(yīng)分區(qū)的大小、起始地址、狀態(tài)(是否已分配)。
當(dāng)某用戶程序要裝入內(nèi)存時,由操作系統(tǒng)內(nèi)核程序根據(jù)用戶程序大小檢索該表,從中找到一個能滿足大小的、未分配的分區(qū),將之分配給該程序,然后修改狀態(tài)為“已分配”。
優(yōu)點(diǎn):實(shí)現(xiàn)簡單,無外部碎片。
缺點(diǎn):
a.當(dāng)用戶程序太大時,可能所有的分區(qū)都不能滿足需求,此時不得不采用覆蓋技術(shù)來解決,但這又會降低性能;
b.會產(chǎn)生內(nèi)部碎片,內(nèi)存利用率低。
3. 動態(tài)分區(qū)分配
動態(tài)分區(qū)分配又稱為可變分區(qū)分配。這種分配方式不會預(yù)先劃分內(nèi)存分區(qū),而是在進(jìn)程裝入內(nèi)存時,根據(jù)進(jìn)程的大小動態(tài)地建立分區(qū),并使分區(qū)的大小正好適合進(jìn)程的需要。因此系統(tǒng)分區(qū)的大小和數(shù)目是可變的。(eg:假設(shè)某計算機(jī)內(nèi)存大小為64MB,系統(tǒng)區(qū)8MB,用戶區(qū)共56MB…)
問題:
1.系統(tǒng)要用什么樣的數(shù)據(jù)結(jié)構(gòu)記錄內(nèi)存的使用情況?
2.當(dāng)很多個空閑分區(qū)都能滿足需求時,應(yīng)該選擇哪個分區(qū)進(jìn)行分配?
3.如何進(jìn)行分區(qū)的分配與回收操作?
- 情況一:回收區(qū)的后面有一個相鄰的空閑分區(qū):兩個相鄰的空閑分區(qū)合并為一個
- 情況二:回收區(qū)的前面有一個相鄰的空閑分區(qū):兩個相鄰的空閑分區(qū)合并為一個
- 情況三:回收區(qū)的前、后各有一個相鄰的空閑分區(qū):三個相鄰的空閑分區(qū)合并為一個
- 情況四:回收區(qū)的前、后都沒有相鄰的空閑分區(qū):新增一個表項(xiàng)
動態(tài)分區(qū)分配沒有內(nèi)部碎片,但是有外部碎片。
內(nèi)部碎片:分配給某進(jìn)程的內(nèi)存區(qū)域中,存在有些部分沒有用上。
外部碎片:是指內(nèi)存中的某些空閑分區(qū)由于太小而難以被利用。
如上圖,如果內(nèi)存中空閑空間的總和本來可以滿足某進(jìn)程的要求,但由于進(jìn)程需要的是一整塊連續(xù)的內(nèi)存空間,因此這些“碎片”不能滿足進(jìn)程的需求。可以通過緊湊(拼湊,Compaction)技術(shù)來解決外部碎片。
問題:
答:
內(nèi)存空間緊張時,系統(tǒng)將內(nèi)存中某些進(jìn)程暫時換出外存,把外存中某些已具備運(yùn)行條件的進(jìn)程換入內(nèi)存(進(jìn)程在內(nèi)存與磁盤間動態(tài)調(diào)度)
中級調(diào)度(內(nèi)存調(diào)度),就是要決定將哪個處于掛起狀態(tài)的進(jìn)程重新調(diào)入內(nèi)存。
答:
a. 裝入方式應(yīng)選擇動態(tài)重定位(動態(tài)運(yùn)行時裝入)。動態(tài)重定位 編譯、鏈接后的裝入模塊的地址都是從0開始的。裝入程序把裝入模塊裝入內(nèi)存后,并不會立即把邏輯地址轉(zhuǎn)換為物理地址,而是把地址轉(zhuǎn)換推遲到程序真正要執(zhí)行時才進(jìn)行。因此裝入內(nèi)存后所有的地址依然是邏輯地址。這種方式需要一個重定位寄存器的支持。
b. “緊湊”之后我們需要把各個進(jìn)程的起始地址進(jìn)行修改,(進(jìn)程對應(yīng)的起始地址信息存放在進(jìn)程的PCB當(dāng)中)當(dāng)進(jìn)程要上CPU運(yùn)行之前,會把進(jìn)程的起始地址信息放到重定位寄存器(基址寄存器)里,然后再將指令中的相對地址的數(shù)值(80)+ 進(jìn)程的起始地址數(shù)值(100)得到其絕對地址。如下圖所示:
小結(jié):
2. 內(nèi)存空間的擴(kuò)充:利用操作系統(tǒng)的虛擬性
早期的計算機(jī)內(nèi)存很小,比如IBM推出的第一臺PC機(jī)最大只支持1MB大小的內(nèi)存。因此經(jīng)常會出現(xiàn)內(nèi)存大小不夠的情況。
后來人們引入了覆蓋技術(shù),用來解決“程序大小超過物理內(nèi)存總和”的問題。
覆蓋技術(shù)的思想:將程序分為多個段(多個模塊)。常用的段常駐內(nèi)存,不常用的段在需要時調(diào)入內(nèi)存。內(nèi)存中分為一個“固定區(qū)”和若干個“覆蓋區(qū)”。需要常駐內(nèi)存的段放在“固定區(qū)”中,調(diào)入后就不再調(diào)出(除非運(yùn)行結(jié)束)不常用的段放在“覆蓋區(qū)”,需要用到時調(diào)入內(nèi)存,用不到時調(diào)出內(nèi)存。
這種覆蓋技術(shù)的實(shí)現(xiàn)必須由程序員聲明覆蓋結(jié)構(gòu),操作系統(tǒng)完成自動覆蓋。
缺點(diǎn):對用戶不透明,增加了用戶編程負(fù)擔(dān)。
覆蓋技術(shù)只用于早期的操作系統(tǒng)中,現(xiàn)在已成為歷史。
交換(對換)技術(shù)的設(shè)計思想:內(nèi)存空間緊張時,系統(tǒng)將內(nèi)存中某些進(jìn)程暫時換出外存,把外存中某些已具備運(yùn)行條件的進(jìn)程換入內(nèi)存(進(jìn)程在內(nèi)存與磁盤間動態(tài)調(diào)度)
中級調(diào)度(內(nèi)存調(diào)度),就是要決定將哪個處于掛起狀態(tài)的進(jìn)程重新調(diào)入內(nèi)存。
暫時換出外存等待的進(jìn)程狀態(tài)為掛起狀態(tài)(掛起態(tài),suspend)
掛起態(tài)又可以進(jìn)一步細(xì)分為就緒掛起、阻塞掛起兩種狀態(tài)。
問題?
1.應(yīng)該在外存(磁盤)的什么位置保存被換出的進(jìn)程?
2.什么時候應(yīng)該交換?
3.應(yīng)該換出哪些進(jìn)程?
答:
(注意:將進(jìn)程換成內(nèi)存中時,并不是把這個進(jìn)程相關(guān)的所有數(shù)據(jù)都換出到外存中,操作系統(tǒng)為了保持對這些換出到外存中的進(jìn)程的管理,而且PCB中記錄了換出進(jìn)程在外存中的位置信息,所以PCB會常駐內(nèi)存,不會被換出外存)
3. 地址轉(zhuǎn)換:負(fù)責(zé)程序的邏輯地址與物理地址的轉(zhuǎn)換
4. 內(nèi)存保護(hù):保證各進(jìn)程在各自存儲空間內(nèi)運(yùn)行,互不干擾
內(nèi)存保護(hù)可采取兩種方法:
- 方法一:在CPU中設(shè)置一對上、下限寄存器,存放進(jìn)程的上、下限地址。進(jìn)程的指令要訪問某個地址時,CPU檢查是否越界。
- 方法二:采用重定位寄存器(又稱基址寄存器)和界地址寄存器(又稱限長寄存器)進(jìn)行越界檢查。重定位寄存器中存放的是進(jìn)程的起始物理地址。界地址寄存器中存放的是進(jìn)程的最大邏輯地址。
三、總結(jié)
總結(jié)
以上是生活随笔為你收集整理的六、操作系统——内存管理的概念(空间的分配与回收、空间的扩充、地址转换、存储保护)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 二、uniapp项目(分段器的使用、sc
- 下一篇: 一、操作系统——处理机(作业)调度算法: