內存管理學習筆記 :
操作系統---內存管理(上) 概念 覆蓋交換技術 連續分配管理方式
操作系統---內存管理(下) 分段存儲 段頁式存儲 虛擬內存 請求分頁管理方式
基本分段存儲管理方式
分段 : 進程的地址空間會按照自身的邏輯關系划分為若干個段, 每個段都有一個段名, 每段從0開始編址
內存分配規則 : 以段為單位進行分配, 每個段在內存中占據連續空間, 但各段之間可以不相鄰
分段系統的組成:
- 段號------ 段號的位數決定了每個進程最多可以分為幾個段
- 段內地址------段內地址的位數決定了每個段的最大長度是多少
段表
程序分為多個段, 各個段離散地裝入內存, 為了保證程序能正常運行, 就必須能從物理內存中找到各個邏輯段的存放位置. 為此, 需為每個進程建立一張段映射表, 簡稱 " 段表 " .
關於段表 :
- 每個段對應一個段表項, 記錄着該段在內存中的起始位置 ( 基址 ) 和 段長
- 各個段表項的長度是相同的, 因此和頁號一樣, 段號是" 隱含 "的, 不占據存儲空間
查找過程
分段和分頁的對比
-
頁是信息的物理單位, 分頁的主要目的是為了實現離散分配, 提高內存利用率. 分頁僅僅是系統管理上的需要, 完全是系統行為, 對用戶是不可見的
-
段是信息的邏輯單位, 分段的主要目的是更好地滿足用戶需求. 一個段通常包含着一組屬於一個邏輯模塊的信息, 分段對用戶是可見的, 用戶編程時需要顯式地給出段名
-
頁的大小是固定且由系統決定, 段的長度卻不固定, 決定於用戶編寫的程序
-
分頁的用戶進程地址空間是一維的, 分段的用戶進程是二維的.
- 分段比分頁更容易實現信息的共享和保護
段頁式內存管理方式
分頁, 分段管理的優缺點分析
優點 | 缺點 | |
---|---|---|
分頁管理 | 內存空間利用率高. 不會產生外部碎片, 只有少量的內部碎片 | 不方便邏輯模塊實現信息的共享與保護 |
分段管理 | 方便實現邏輯模塊信息的共享與保護 | 如果段長過大, 為其分配很大的連續空間會很不方便, 並且段式管理會產生外部碎片 |
段頁式管理的結構
先分段 , 再分頁
段頁式管理的邏輯地址結構 :
由段號, 頁號, 頁內偏移 組成
- 段號的位數決定了每個進程最多可以分為幾個段
- 頁號位數決定了每個段最大有多少頁
- 頁內偏移量決定了頁面大小和內存塊的大小
注意 :
"分段"對用戶是可見的, 而將各段"分頁"對用戶是不可見的, 系統會根據段內地址自動划分頁號和段內偏移量, 因此段頁式管理的地址結構是"二維"的.
段表, 頁表
每一個進程對應一個段表, 每一個段又對應一個頁表, 因此一個進程可能對應多個頁表.
查找過程
- 由邏輯地址得到段號, 頁號, 頁內偏移
- 段號與段表寄存器的段長度比較, 檢查是否越界
- 由段表始址, 段號找到對應段表項 ---- ( 一次訪存)
- 根據段表中記錄的頁表長度, 檢查頁號是否越界
- 由段表中的頁表地址, 頁號得到查詢頁表, 找到相應頁表項 ---- ( 二次訪存)
- 由頁面存放的內存塊號, 頁內偏移得到最終的物理地址
- 訪問目標單元 ---- ( 三次訪存)
虛擬內存
傳統存儲管理方式的特征, 缺點
- 一次性 : 作業必須一次性全部裝入內存才能開始運行
- 作業很大時, 無法裝入導致大作業無法運行
- 大量作業要求運行時內存無法容納所有作業, 導致多道程序並發度下降
- 駐留性 : 一旦作業被裝入內存, 就會一直駐留在內存中, 直到作業運行結束, 這樣會導致內存中駐留大量的, 暫時用不到的數據, 浪費內存資源
虛擬內存---基於局部性原理
-
在程序裝入時, 將程序中很快會用到的部分裝入內存, 暫時用不到的部分留在外存, 就可以讓程序開始執行.
-
在程序執行過程中, 當所訪問的信息不在內存時, 由操作系統負責將所需信息由外存調入內存, 然后繼續執行程序.
-
內存空間不夠時, 操作系統負責將內存中暫時用不到的信息換出到外存
-
在用戶看來, 就有一個比實際內存大很多的內存, 這就叫虛擬內存
注意 :
虛擬內存的最大容量是由計算機的地址結構 ( CPU的尋址范圍 ) 確定的, 虛擬內存的實際容量 = $ min( 內存容量 + 外存容量, CPU尋址范圍) $
虛擬內存的實現 :
-
請求分頁存儲管理
-
請求分段存儲管理
-
請求段頁式存儲管理
操作系統需要提供的功能 :
- 請求調頁 ( 段 )
- 頁面置換 ( 段置換 )
缺頁時請求掉頁不一定頁面置換, 若還有可用的內存塊, 就不用進行頁面置換
請求分頁管理方式
頁表機制
缺頁中斷機構
在請求分頁操作系統中, 每當要訪問的頁面不在內存時, 便產生一個缺頁中斷, 然后由操作系統的缺頁中斷處理程序處理中斷
此時缺頁的進程阻塞, 放入阻塞隊列, 調頁完成后再將其喚醒, 放回就緒隊列
-
如果內存中有空閑塊, 則為進程分配一個空閑塊, 將所缺頁面裝入該塊, 並修改頁表中相應的頁表項
-
如果內存中沒有空閑塊, 則由頁面置換算法選擇一個頁面淘汰, 若該頁面在內存期間被修改過, 則要將其寫回外存, 未修改過的頁面不用寫回外存
缺頁中斷是因為當前執行的指令想要訪問目標頁面未調入內存而產生的, 因此屬於內中斷 :
頁面置換算法
最佳置換算法OPT
每次選擇淘汰的頁面是以后永不使用或者在最長時間內不會使用的頁面, 保證最低的缺頁率 . 但是操作系統無法預判頁面訪問序列, 這種算法是無法實現的
先進先出置換算法 FIFO
每次淘汰的頁面是最早進入內存的頁面
實現 : 將調入內存的頁面根據調入的先后順序排成一個隊列, 需要置換頁面的時候選擇隊首的頁面.
實現簡單, 算法性能差, 不適應進程實際運行時的規律
最近最久未使用算法 LRU
當需要淘汰一個頁面的時候, 選擇現有頁面中t值最大的, 即最近最久未使用的頁面.
做題時的方法 : 需要淘汰頁面時, 逆向檢查此時在內存中的幾個頁面號, 最后一個出現的頁號就是需要被淘汰的
LRU算法的特點 : 性能好, 但實現起來需要專門的硬件支持, 算法開銷大
時鍾置換算法 ( CLOCK ) / 最近未用算法 ( NRU )
他們是同一種算法.
簡單的CLOCK算法的實現方法 :
簡單的時鍾置換算法僅考慮到了一個頁面最近是否被訪問過, 但是事實上, 如果被淘汰的頁面沒有被修改過, 就不需要執行I/O操作寫回外存. 只有被淘汰的頁面被修改過時, 才需要寫回外存------因此, 除了考慮一個頁面最近有沒有被訪問過之外, 操作系統還應該考慮頁面有沒有被修改過. 在其他條件都相同時, 應該優先淘汰沒有修改過的頁面, 避免I/O操作, 這就是改進型的時鍾置換算法的思想.
利用 (訪問位, 修改位) 的形式表示各頁面狀態
對應頁面 | |
---|---|
第一輪 : 找第一個 (0, 0)的幀用於替換 ( 不修改標志位 ) | 最近沒訪問且沒修改 |
第二輪 : 找第一個 (0, 1)的幀用於替換 ( 將所有掃描過的幀訪問位設為0) | 最近沒訪問但修改過 |
第三輪 : 找第一個 (0, 0)的幀用於替換 ( 不修改標志位 ) | 最近訪問過但沒修改 |
第四輪 : 找第一個 (0, 1)的幀用於替換 | 最近訪問過也修改過 |
特點 : 開銷小, 性能也不錯
頁面分配策略
駐留集
請求分頁存儲管理器中給進程分配的物理塊的集合. ( 系統給進程分配了n各物理塊 ----的另一種表述 : 駐留集大小為n)
在采用虛擬存儲技術的系統中, 駐留集的大小一般小於進程的總大小
- 如果駐留集太小, 會導致缺頁頻繁, 系統要花大量的時間來處理缺頁, 實際用於進程推進的時間很少
- 如果駐留集太大, 會導致多道程序並發度下降, 資源利用率降低
幾種分配策略
固定分配全局置換不存在, 因為進程物理塊固定后不會再分配給別人
- 可變分配全局置換 : 只要缺頁就給分配新物理塊
- 可變分配局部置換 : 根據發生缺頁的頻率來動態地增加或減少進程的物理塊
何時調入頁面
-
預調頁策略
-
請求調頁策略
何處調入頁面
文件區用於調入不會被修改的數據, 對換區用用於調入可能被修改的數據
抖動現象
工作集
- 一般來說 駐留集的大小不能小於工作集的大小, 否則進程運行過程中將頻繁缺頁.