摘要:作業系統的記憶體究竟是怎么一回事?帶你完整復習一遍《作業系統》一書中有關記憶體的所有知識點
本文分享自華為云社區《作業系統的記憶體究竟是怎么一回事?帶你完整復習一遍《作業系統》一書中有關記憶體的所有知識點》,作者:breakDawn ,
1 記憶體管理的概念
記憶體管理指作業系統對記憶體的劃分和動態分配
地址空間:
邏輯地址空間: 相對地址, 從0開始編址
物理地址空間: 地址轉換的最終地址
程式運行時:
編譯: 把源代碼編譯成目標模塊
鏈接: 把目標模塊、庫函式鏈接成1個裝入模塊
鏈接屬于形成行程邏輯地址的程序
裝入:
絕對裝入: 編譯時就確定了裝入地址
可重定位裝入: 根據記憶體情況, 把程式裝到適當位置
運行時動態裝入:運行前才真正把程式裝起來(前面2個都是先分配,再裝,再運行)
2 記憶體防溢位機制
即怎么防止記憶體越界
設定上下限暫存器:
存放記憶體中該行程的上下限地址
每次訪問時,判斷是否越界
重定位+界地址:
重定位暫存器——存放物理地址的最小地址
界地址暫存器——存放邏輯地址的最大值
先把訪問地址(相對地址) 與界地址比較是否越界
再加到重定位暫存器上,作為物理地址
min + x, 且x <max, 這樣保證地址在min到min+max之內
3 記憶體分配機制
3.1 連續分配記憶體
連續分配指 為用戶程式分配的記憶體空間一定是連續的
3.1.1 單一連續:
記憶體分為系統區和用戶區2個區
每次用戶區只能放1個程式, 這樣可確保不會越界
3.1.2 固定磁區分配
用戶區分成若干個大小的磁區, 每個磁區只能裝一個作業,
程式如果大了會裝不下
程式小了則有記憶體碎片
3.1.3 動態磁區分配
程式裝入記憶體時,按照所需大小動態生成1個磁區, 有多少碎片空間就給多少
可能會存在碎片, 比如中間的行程結束了, 于是中間就空出來一個記憶體碎片,而可能因為太小,其他行程帆布進來,
動態分配策略:
- 首次適應: 從上往下找第一個滿足的磁區——最簡單也最好
- 最佳適應: 找一個大小差距最小的磁區——最爛,碎片最多
- 最壞適應: 直接找最大的磁區轉入
- 鄰近適應: 從上次查找位置開始找,而不是從第一個碎片位置開始找,——末尾碎片會很多
3.2 非連續記憶體分配
非連續指行程記憶體可以 分成不同地址存放,不一定全部集中在一起,
3.2.1 分頁
把記憶體劃分成固定大小的塊, 行程以塊為單位申請多個不同位置的塊作為空間,
- 頁表:
每個行程PCB中會有一個頁面暫存器PRT, 告知頁表的起始位置和起始長度
找到頁表后, 頁面中會告知你所持有的頁號和偏移,
通過 頁號 * 塊大小 + 偏移, 可知道這段記憶體的起始位置,
行程每次想通過虛擬地址去定位物理地址時,都需要先去頁表中找到虛擬地址對應的頁,然后再得到物理地址,
- 快表TBL(Translation Lookaside Buffer )):
為了避免每次都取頁表換算地址, 快表會快取 虛擬地址->物理地址的直接映射,加快速度
- 多級頁表
地址空間超級大, 1頁裝不下怎么辦?
用多級
一級頁表指明二級頁表的地址
二級頁表再去實際地址
這樣就可以有多頁了,

3.2.2 分段
分頁的話, 頁的長度是固定的, 所以偏移量的最大值是固定的
分段的話不限制偏移量最大值,即可以很長一段,
分段屬于二維地址空間, 因為他除了給出邏輯地址,還得給出段長
有利于做動態鏈接: 程式動態修改
3.2.3 段頁結合
作業先分成若干段, 再把段分頁, 每個段可以找到一個也變
段號S 頁號P 頁內偏移
Q: 遍歷二維陣列的時候, 行遍歷優先和列遍歷優先的效率差別, 為什么會這樣
A: 按行遍歷比按列遍歷的效率高體現在這些方面:
- CPU高速快取
- CPU快取從記憶體中抓取一般都是整個資料塊,所以它的物理記憶體是連續的,幾乎都是同行不同列的,而如果內回圈以列的方式進行遍歷的話,將會使整個快取塊無法被利用,而不得不從記憶體中讀取資料,而從記憶體讀取速度是遠遠小于從快取中讀取資料的,隨著陣列元素越來越多,按列讀取速度也會越來越慢,
4 虛擬記憶體
4.1 概念
虛擬地址可以讓行程獲得比實際記憶體要大的記憶體
特征:
- 多次性——作業可分多次裝入記憶體
- 對換性——可在運行時對記憶體做兌換處理
- 虛擬性——邏輯上可充分擴充容量
要求:
必須使用非連續分配方式——分頁、分段、段頁
硬體需要支持 頁表、中斷、地址變換機構
理論依據:
時間區域性—— 指令和資料總是會在一段時間內被連續訪問
空間區域性——某單元被訪問,那么他附件的單元也很大概率會被訪問
4.2 請求分頁機制
再分頁的基礎上, 增加了2個功能:
請求調頁——當頁面不在記憶體中時,從外村申請調入
頁面置換——把暫時不用的記憶體換出去,給其他需要進來的頁騰出空間
頁表項:
頁號、物理塊號
狀態位P:是否已經調入記憶體
訪問欄位A: 記錄訪問次數或者訪問標記,用于置換策略判斷
修改維 M: 記錄是否被修改過
外村地址——當頁被換出去時,指明這個頁在外存的何處
缺頁中斷機構: 當頁面不存在時, 負責產生缺頁中斷,進行頁面置換操作,
缺頁只能高端和系統中斷不同, 屬于指令中的操作,在執行期產生多次
地址變換機構:
1.先檢索塊表,如果能找到,則直接修改頁表項的訪問位,
2.塊表中沒有,則去 再檢索記憶體中的頁表,通過狀態為P確認是否在記憶體中
如果不在,則產生缺頁中斷,
4.3 作業集概念
駐留集:指系統給每個行程分配的記憶體中實際頁面集合
但是可能分配了10個, 卻只有5個經常在用
作業集: 某時間段內,這個行程訪問和使用的頁面集合
通過作業集, 系統可以評估這個駐留集是否需要做刪減,以及哪些頁應該持續保留,
這樣可以減少抖動,即減少內外村之間頻繁的交換頁
4.4 頁面置換演算法
- 最佳置換演算法:
選未來最長時間不會被用到的頁
這個要基于預測,比較難 - 先進先出FIFO
可能引發bleady例外:
較早調入的頁往往是經常被訪問的頁,這些頁在FIFO演算法下被反復調入和調出,并且有Belady現象,所謂Belady現象是指:采用FIFO演算法時,如果對一個行程未分配它所要求的全部頁面,有時就會出現分配的頁面數增多但缺頁率反而提高的例外現象,
- 最近最久未使用(LRU)
選之前最長時間沒訪問的, 引入優先佇列(最大堆)
需要設定訪問時間欄位 - 簡單時鐘clock(最近未使用NRU)
每個頁有個標記,
付訓入記憶體或者被訪問時,都會置1
如果需要換頁時,步驟如下:
- 掃描圍成換的頁鏈表
- 如果標記為1,則改成0,繼續往下掃
- 如果位0, 則替換,并讓指標指向下一頁,
改進的clock
把標記為改成 訪問位u和修改維m
- 1類(A =0, M = 0):表示該頁面最近既未被訪問,又未被修改,是最佳淘汰頁,
- 2類(A =0, M = 1):表示該頁面最近未被訪問,但已被修改,并不是很好的淘汰頁,
- 3類(A =1, M = 0):表示該頁面最近已被訪問,但未被修改,該頁有可能再被訪問,
- 4類(A =1, M = 1):表示該頁最近已被訪問且被修改,該頁可能再被訪問,
- 先優先找u=0和m=0的頁,有就直接替換
- 沒有,則找 u = 0 且m=1的頁( 沒訪問的最優先替換), 做替換
- 如果中間遇到U=1的, 則都會置0, 如果m=1的也會置0
- 如果一圈都沒有,則下一圈肯定有01或者00的,
4.5 頁面分配量策略
- 固定分配,區域替換
每個行程分配固定的物理塊, 且只能自己的塊之間做替換 - 可變分配,全域替換
缺頁時,可以從全域佇列的頁替換 - 可變分配,區域置換
自己替換自己,但是不夠的時候可以加塊
分配來源:
對換區:頻繁切換的區
檔案區:補怎么會變動和修改的
點擊關注,第一時間了解華為云新鮮技術~
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/536027.html
標籤:其他
