基礎知識
什么是內存?
內存是用於存放數據的硬件,程序執行前需要先放到內存中才能被cpu處理
如何區分各個程序的數據是放在什么地方的呢?
對內存的存儲單元編地址
內存中的一個一個的房間,就是存儲單元
按字節編址,每個存儲單元為1字節,即1b,即8個二進制位
字節位16的計算機按字編址,則每個存儲單元的大小位1個字,每個字的大小為16個二進制位
常用的數量單位
相對地址又稱邏輯地址
絕對地址又稱物理地址
裝入的三種方式
完成邏輯地址到物理地址的轉換
絕對裝入
靜態重定位
動態重定位
絕對裝入
在編譯時,如果知道程序將放到內存中的哪個位置,編譯程序將產生絕對地址的目標代碼。裝入程序按照裝入模塊中的地址,將程序和數據裝入內存。
只適用於單道程序環境
因為單道只能運行一個程序
程序中使用的絕對地址,可在編譯或匯編時給出,也可由程序員直接賦予。通常情況下都是編譯或匯編時再轉換為絕對地址。
靜態重定位
又稱可重定位裝入。編譯、鏈接后的裝入模塊的地址都是從0開始的,指令中使用的地址、數據存放的地址都是相對於起始地址而言的邏輯地址。可根據內存的當前情況,將裝入模塊裝入到內存的適當位置。裝入時對地址進行“重定位”,將邏輯地址變換為物理地址(地址變換是在裝入時一次完成的)。
動態重定位
采用動態重定位允許程序在內存中發生移動
並且可將程序分配到不連續的存儲區中;在程序運行前只需裝入它的部分代碼即可投入運行,然后在程序運行期間,根據需要動態申請分配內存;便於程序段的共享,可以向用戶提供一個比存儲空間大得多的地址空間。
鏈接的三種方式
靜態鏈接
在程序運行之前,先將各目標模塊及它們所需的庫函數連接成一個完整的可執行文件(裝入模塊),之后不再拆開。
要把獨立的邏輯地址合成完整的邏輯地址
裝入時動態鏈接
將各目標模塊裝入內存時,邊裝入邊鏈接的鏈接方式。
運行時動態鏈接
在程序執行中需要該自標模塊時,才對它進行鏈接。其優點是便於修改和更新,便於實現對目標模塊的共享。
內存管理
操作系統負責內存空間的分配與回收
需要提供某種技術從邏輯上對內存空間進行擴充
操作系統需要提供地址轉換功能,負責程序的邏輯地址與物理地址的轉換
操作系統需要提供內存保護功能。保證各進程在各自存儲空間內運行,互不干擾
覆蓋和交換
覆蓋技術
就是解決程序大小超過物理內存總和的問題
覆蓋技術的思想:將程序分為多個段(多個模塊)。常用的段常駐內存,不常用的段在需要時調入內存。
內存中分為一個“固定區”和若干個“覆蓋區”。
需要常駐內存的段放在“固定區”中,調入后就不再調出(除非運行結束)
不常用的段放在覆蓋區”,需要用到時調入內存,用不到時調出內存
必須由程序員聲明覆蓋結構,操作系統完成自動覆蓋。缺點:對用戶不透明,增加了用戶編程負擔。
只用於早期的操作系統
交換技術
交換(對換)技術的設計思想:內存空間緊張時,系統將內存中某些進程暫時換出外存,把外存中某些已具備運行條件的進程換入內存(進程在內存與磁盤間動態調度)
中級調度(內存調度),就是要決定將哪個處於掛起狀態的進程重新調入內存
暫時換出外存等待的進程狀態為掛起狀態(掛起態, suspend)
掛起態又可以進一步細分為就緒掛起、阻塞掛起兩種狀態
連續分配管理方式
連續分配:指用戶進程分配的必須是一個連續的內存空間
單一連續分配方式
固定分區分配方式
操作系統怎樣將記錄內存空閑的分布情況
動態分區分配
動態分區分配又稱為可變分區分配。這種分配方式不會預先划分內存分區,而是在進程裝入內存時,根據進程的大小動態地建立分區,並使分區的大小正好適合進程的需要。因此系統分區的大小和數目是可變的。(eg:假設某計算機內存大小為64MB,系統區8MB,用戶區共56MB.)
系統要用什么的數據結構記錄內存的使用情況
兩種常用的數據結構
空閑分區鏈
空閑分區表
如何對分區的分配和回收操作
回收問題
動態分區分配沒有內部碎片,但由外部碎片
內部碎片:分配給進程的內存區域中,如果沒用上
外部碎片:是指內存中的某些空間分區由於太小而難以利用
如果內存中空閑空間的總和本來可以滿足某進程的要求,
但由於進程需要的是一整塊連續的內存空間,因此這些
“碎片”不能滿足進程的需求。
可以通過緊湊(拼湊, Compaction)技術來解決外部碎片。
動態分區分配算法
如果有很多空閑分區都能滿足,選擇哪個進行分配
首次適應算法
算法思想:每次都從低地址開始査找,找到第一個能滿足大小的空閑分區
如何實現:空閑分區以地址遞增的次序排列。每次分配內存時順序査找空閑分區鏈(或空閑分區表),找到大小能滿足要求的第一個空閑分區
最佳使用算法
算法思想:由於動態分區分配是一種連續分配方式,為各進程分配的空間必須是連續的一整片區域。因此為了保證當“大進程”到來時能有連續的大片空間,可以盡可能多地留下大片的家閑區,即,優先使用更小的空閑區。
如何實現:空閑分區按容量遞增次序鏈接。每次分配內存時順序查找空閑分區鏈(或空閑分區表),找到大小能滿足要求的第一個空閑分區
最壞適應算法
又稱最大適應算法( Largest Fit)
算法思想:為了解決最佳適應算法的問題ー一即留下太多難以利用的小碎片,可以在每次分配時優先使用最大的連續空閑區,這樣分配后剩余的空閑區就不會太小,更方便使用
如何實現:空閑分區按容量遞減次序鏈接。每次分配內存時順序查找空閑分區鏈(或空閑分區表),找到大小能滿足要求的第一個空閑分區。
鄰近適應算法
算法思想:首次適應算法每次都從鏈頭開始査找的。這可能會導致低地址部分出現很多小的空閑分區,而每次分配査找時,都要經過這些分區,因此也增加了査找的開銷。如果每次都從上次査找結束的位置開始檢索,就能解決上述問題
如何實現:空閑分區以地址遞增的順序排列(可排成一個循環鏈表)。每次分配內存時從上次査找結東的位置開始査找空閑分區鏈(或空閑分區表),找到大小能滿足要求的第一個空閑分區。
基本分頁存儲管理的概念
連續分配:為用戶進程分配的必須是一個連續的內存空間。
非連續分配:為用戶進程分配的可以是一些分散的內存空間。
頁表
為什么每個頁表項的長度是相同的,頁號是隱藏的?
基本地址變換機構
基本地址變換機構可以借助進程的頁表將邏輯地址轉換為物理地址。
通常會在系統中設置一個頁表寄存器(PTR),存放頁表在內存中的起始地址F和頁表長度M。進程未執行時,頁表的始址和頁表長度放在進程控制塊(PCB)中,當進程被調度時,操作系統內核會把它們放到頁表寄存器中
每個頁表項的長度是相同的,頁號是“隱含”的
進程頁通常是裝在連續的內存塊中的
具有快表的地址變換機構
是對基本地址變化的改進版本
快表,又稱聯想寄存器(TLB),是一種訪問速度比內存快很多的高速緩沖存儲器,用來存放當前訪問的若干頁表項,以加速地址變換的過程。與此對應,內存中的頁表常稱為慢表。
引入快表,地址變化過程
兩級頁表
基本分段存儲管理方式
分段
進程的地址空間:按照程序自身的邏輯關系划分為若干個段,每個段都有一個段名(在低級語言中,程序員使用段名來編程),每段從0開始編址