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