基本概念:地址重定位relocation(地址轉換、地址映射、地址翻譯)
已經了解的:
程序裝載到內存才可以運行。通常,程序以可執行文件格式保存在磁盤上
多道程序設計模型
允許多個程序同時進入內存
每個進程有自己的地址空間
- 一個進程執行時不能訪問另一個進程的地址空間
- 進程不能執行不適合的操作
討論:
- 進程中的地址不是最終的物理地址
- 在進程運行前無法計算出物理地址,因為不能確定進程被加載到內存什么地方
需要地址重定位的支持(地址轉換、地址變換、地址翻譯、地址映射)Translation Mapping
地址重定位
邏輯地址(相對地址,虛擬地址)
用戶程序經過編譯、匯編后形成目標代碼,目標代碼通常采用相對地址的形式,其首地址為0,其余地址都相對于首地址而編址。
不能用邏輯地址在內存中讀取信息
物理地址(絕對地址,實地址)
內存中存儲單元的地址 可直接尋址
為了保證CPU執行指令時可正確訪問內存單元,需要將用戶程序中的邏輯地址轉換為運行時可由機器直接尋址的物理地址,這一過程稱為地址重定位。
晶態重定位和動態重定位
靜態重定位:當用戶程序加載到內存時,一次性實現邏輯地址到物理地址的轉換,一般可以由軟件完成
動態重定位:在進程執行過程中進行地址變換,即逐條指令執行時完成地址轉換
需要硬件部件支持
物理內存管理(位圖法、空閑區表、空閑區鏈表)
空閑內存管理
數據結構:
- 位圖: 每個分配單元對應于位圖中的一位,0表示空閑,1表示占用(或者相反)
- 空閑區表、已分配區表:表中每一項記錄了空閑區(或已分配區)的起始地址、長度、標志
- 空閑塊鏈表
內存分配算法:
- 首次適配 first fit:在空閑區表中找到第一個滿足進程要求的空閑區
- 下次適配next fit:從上次找到的空閑區處接著查找
- 最佳適配best fit:查找整個空閑區表,找到能夠滿足的進程要求的最小空閑區
- 最差適配 worst fit:總是分配滿足進程要求的最大空閑區
將該空閑區分為兩部分,一部分供進程使用,另一部分形成新的空閑區
回收問題:
內存回收算法:當某一塊歸還后,前后空閑空間合并,修改內存空閑區表
四種情況:上相鄰、下相鄰、上下都相鄰、上下都不相鄰
伙伴系統 BUDDY SYSTEM
一種經典的內存分配方案,主要思想:將內存按2的冪進行劃分,組成若干空閑塊鏈表;查找該鏈表找到能滿足進程需求的最佳匹配塊
Linux底層內存管理采用,一種特殊的分離適配算法
算法:
- 首先將整個可用空間看作一塊:2^U
假設進程申請的空間大小為s,如果滿足2^u-1 <s<= 2^u 則分配整個塊,否則,將塊劃分為兩個大小相等的伙伴,大小為2^u-1
一直劃分下去直到產生大于或等于s的最小塊
基本內存管理方案1:整個進程進入內存中一片連續區域
固定分區:
- 把內存空間分割成若干區域,稱為分區
- 每個分區的大小可以相同也可以不同
- 分區大小固定不變
- 每個分區裝一個且只能裝一個進程
碎片問題解決
碎片:很小的,不易利用的空閑區,導致內存利用率下降
解決方案:緊縮技術(memory compaction)
在內存移動程序,將所有小的空閑區合并為較大的空閑區
又稱:壓縮技術、緊致技術、搬家技術
緊縮時要考慮的問題:系統開銷,移動時機
基本內存管理方案2:一個進程進入內存中若干片不連續的區域
頁式存儲管理方案
設計思想
- 用戶進程地址空間被劃分為大小相等的部分,稱為頁(page)或頁面,從0開始編號
- 內存空間按同樣大小劃分為大小相等的區域,稱為頁框(page frame),從0開始編號,也成為物理頁面,頁幀,內存塊
- 內存分配(規則):以頁尾單位進行分配,并按進程需要的頁數來分配;邏輯上相鄰的頁,物理上不一定相鄰
- 典型頁面尺寸:4K或4M
相關數據結構及地址轉換:
頁表
- 頁表項:記錄了邏輯頁號與頁框號的對應關系
- 每個進程一個頁表,存放在內存
- 頁表起始地址保存在何處?(寄存器)
空閑內存管理
地址轉換(硬件支持)
CPU渠道邏輯地址,自動劃分為頁號和頁內地址;用頁號查頁表,得到頁框號,再與頁內偏移拼接成為物理地址
段式存儲管理方案
設計思想:
- 用戶進程地址空間:按程序自身的邏輯關系劃分為若干個程序段,每個程序段都有一個段名
- 內存空間被動態劃分為若干長度不相同的區域,稱為物理段,每個物理段由起始地址和長度確定
-
內存分配(規則):以段位單位進行分配,每段在內存中占據連續空間,但各段之間可以不相鄰
Paste_Image.png
交換技術SWAPPING
內存不足時如何管理?
內存擴充技術:內存緊縮技術(例如可變分區)
覆蓋技術 overlaying 交換技術 swapping 虛擬存儲技術virtual memory
覆蓋技術OVERLAYING
解決的問題:程序大小超過物理內存總和
程序執行過程中,程序的不同部分在內存中相互替代,按照其自身的邏輯結構,將那些不會同時執行的程序段共享同一塊內存區域
要求程序各模塊之間有明確的調用結構
程序員聲明覆蓋結構,操作系統完成自動覆蓋
主要用于早期的操作系統