記憶體管理的目標:
-
實作記憶體的分配和回收
-
合理的分配記憶體空間,提高記憶體利用率,提高記憶體訪問速度
存盤器的層次結構
速度由快到慢,容量由小到大,價格由高到低
暫存器->L1高速快取 -> L2高速快取 -> 主存盤器 -> 本地二級存盤 -> 遠程二級存盤(web/ftp)
特點:每個層級的存盤器都保存來自下一級存盤器的資訊
分類:
-
其中位于CPU內部的是:暫存器->L1高速快取 -> L2高速快取
-
其中統稱為記憶體的是:暫存器->L1高速快取 -> L2高速快取 -> 主存盤器
-
其中統稱為外存/輔助存盤的是:本地二級存盤 -> 遠程二級存盤(web/ftp)
區域性原理
定義:在一段時間內,程式的執行僅限于某個部分,相應的,它所訪問的存盤空間也局限于某個區域
分類
-
時間區域性
- 程式的執行僅限于某個部分(某幾條指令)
- 某指令一旦被執行,不久之后該指令將再次被執行
-
空間區域性
- 程式所訪問的記憶體僅限于某個部分,
- 若某個單元的記憶體被訪問,則附近的單元將很快被訪問
程式的鏈接
靜態鏈接
含義: 程式被編譯后會變成一個一個的獨立模塊(比如用到的各種庫),在運行前,需要使用鏈接程式將目標模塊鏈接成一個完整的裝入模塊
特點:運行速度相對快,但占用記憶體更多
鏈接程式的具體任務
- 鏈接程式的任務
- 對邏輯地址進行修改
- 鏈接程式的任務2
- 變換外部呼叫符號
- 外部認為程式依然是整體的,所以使用的是Call,但是現在程式被分成不同模塊,所以鏈接程式需要將外部的call變換為JSR(跳轉至子程式)
動態鏈接
含義:可將目標模塊的鏈接推遲到這這寫模塊中的函式被呼叫時才進行;
特點:運行速度相對慢,但是可以節省記憶體
程式的裝入
連接程式完成連接后得到一個裝入模塊,裝入程式負責將這個裝入模塊裝入到記憶體中
絕對裝入方式
編譯時產生物理地址的目標代碼
重定位裝入方式
- 可重定位裝入方式(靜態重定位) ,編譯時地址是邏輯地址, 裝入時通過重定位轉換為物理地址
- 動態運行時裝入(動態重定位),程式執行時通過重定位轉為物理地址
實際地址 = 邏輯地址 + 物理其實地址
連續分配存盤管理方式
單一連續分配
任何時刻主存盤器最多只有一個作業
固定磁區分配
- 將記憶體分為固定大小的若干個磁區,每個磁區可以且僅可以裝入一個作業
- 根據系統不同,磁區大小可以是相等也可以是相等的
- 每個磁區有上限暫存器和下限暫存器,統稱為界限暫存器,用于保護記憶體
- 維護一個
固定磁區說明表用于記錄磁區的使用情況

動態磁區分配
- 磁區大小不是預先固定的,而是按照作業的實際需求來劃分的
- 磁區的個數也不是預先固定的,而是由能裝入的作業數決定的
- 維護一個
空閑磁區表,用于記錄當前可用的磁區資訊

-
與空閑磁區表功能相同的還有另一種叫做
空閑磁區鏈-
本質是一個雙向鏈表,每個節點包含一個指向前一個和一個指向后一個磁區的指標,以及一個保存可用磁區起始地址和長度的資料域;

-
動態磁區分配演算法
首次適應演算法
- 空閑磁區鏈以地址遞增的順序鏈接,從鏈首開始查找直至找到第一個滿足條件的磁區
- 從該磁區中劃出一塊記憶體給行程,剩下的磁區資訊仍然留在空閑鏈中
- 該方式的不足
- 外部碎片,分配后剩下的一點點留在磁區鏈中,由于空間較小,無法被有效利用
- 內部碎片已經分配個某個行程的空間,但行程不需要那么多,空閑了一部分
回圈首次適應演算法
- 唯一與首次適應演算法不同的就是,維護了一個磁區指標,每次分配完成,該指標往后移動一個位置;
- 該方式可使得空閑區分布較均勻,但是依然會產生碎片
最佳適應發
- 每次分配前需將磁區鏈節點按照空閑空間大小從小到大排序
- 遍歷磁區鏈,查找第一個滿足條件的磁區分配給行程,
- 該方式可使得每次分配都能盡可能找到與行程需求最接近的磁區,減少碎片產生,提高利用率
動態磁區分配流程
設使用最佳適應演算法,流程已經介紹不在啰嗦
- 對磁區鏈按照大小升序排序
- 遍歷磁區鏈在找到可用磁區后,從磁區中劃出區域給行程
- 更新磁區鏈資訊
例:設找到的磁區起始位置為S,長度為L, 行程需要的大小為N
-
分配完成后,新的起始位置為:S + N, 長度為L - N
-
重新對磁區鏈按空間大小升序排序
動態磁區回收流程
- 釋放一塊連續的記憶體區域
- 如果被釋放的區域與其他空閑區域前后相鄰則將前后相鄰的磁區合并,無論在前在后
- 如果沒有相鄰的,則創建新節點存盤磁區資訊
- 修改磁區鏈資訊
例:
-
設釋放的區域起始地址為A,長度為L
-
判斷否相鄰:設已有空閑磁區起始位置為X,長度為Y
- 若 X+Y == A ,則表示前面有相鄰, 則合并后空閑磁區起始地址為X,長度為Y + L
- 若 A+L == X,則表示后面有相鄰,則合并后空閑磁區起始地址為A,長度為L + Y
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/20605.html
標籤:Linux
下一篇:在Arch上使用Fcitx5
