1. 程式人生 > 其它 >作業系統(三)—— 記憶體管理

作業系統(三)—— 記憶體管理

三、記憶體管理

1. 記憶體管理的概念

1)記憶體的基礎知識

​ ① 記憶體:用於存放資料的硬體。程式執行前先放到記憶體中才會被CPU處理。

​ ② 程式執行過程:編譯 —— 連結 —— 裝入 --- CPU處理

​ a. 編譯:將高階程式語言轉換為機器語言。

​ b. 連結:給程式命令分配邏輯地址。

​ c. 裝入:將程式命令載入到記憶體中,分配實體地址。

​ ③ 連結的三種方式

​ a. 靜態連結

​ b. 裝入時動態連結

​ c. 執行時動態連結

​ ④ 裝入的三種方式

​ a. 絕對裝入:編譯時,生成絕對地址;只適用於單道程式環境。

​ b. 靜態重定位(可重定位裝入):編譯連結都是從0開始,裝入時將邏輯地址轉變為實體地址。這種方式裝入時必須分配全部地址,記憶體不夠就不能裝入,執行期間不能再移動。

​ c. 動態重定位(動態執行時裝入):編譯連結都是從0開始,裝入時也按照邏輯地址裝入,真正執行時,才轉換為實體地址。這種方式需要一個重定位暫存器的支援。現代作業系統幾乎都採用這種方式,優點:允許程式在記憶體中發生移動;可以將程式分配到不連續的儲存區;動態分配記憶體;便於程式段的共享。

2)記憶體管理的概念框架

3)記憶體空間的擴充——覆蓋與交換

​ ① 覆蓋技術 — 解決程式大小超過實體記憶體總和的問題

​ a. 原理:將程式分為多個段(模組),一個固定區和若干覆蓋區

​ b. 缺點:對使用者不透明。程式結果必須由程式設計師宣告覆蓋結構

​ ② 交換技術

​ a. 原理:記憶體空間緊張時,系統將記憶體中某些程序暫時換出外存,把外存中某些已具備執行條件的程序換入記憶體( 程序在記憶體和磁碟間動態排程)

​ b. 磁碟分為檔案區和對換區,換出的程序在對換區

​ 【區別】覆蓋是在同一個程式或程序中的,而交換是在不同程序(或作業)之間的

4)連續分配管理方式

① 三種方式:

​ 1 單一連續分配

​ a. 原理:系統分為系統區和使用者區,系統區存放作業系統相關資料,使用者區存放使用者程序相關資料,記憶體中只能有一道使用者程式,使用者程式獨佔整個使用者區。

​ b. 優點:實現簡單;無外部碎片,可以採用覆蓋技術擴充;可以不需要記憶體保護

​ c. 缺點:只適用於單使用者、單任務的作業系統;有內部碎片;儲存器利用率極低。

​ 2 固定分割槽分配

​ a. 原理:將使用者空間分為若干個固定大小(可以不相等)的分割槽,每個分割槽可以裝入一道作業,互不干擾。需要建立一個分割槽說明表

​ b. 優點:實現簡單,無外部碎片

​ c. 缺點:如果使用者程式太大,裝不下,只能採用覆蓋技術來解決,降低效能;可能產生內部碎片,記憶體利用率低;

​ 3 動態分割槽分配

​ a. 原理:在程序裝入記憶體時,根據程序的大小動態建立分割槽。

​ i. 系統用空閒分割槽表或空閒分割槽鏈來記錄記憶體的使用情況

​ ii. 動態分割槽分配演算法

​ iii. 空閒分割槽表 怎麼分配和回收空間

​ b. 優點:沒有內部碎片;

​ c. 缺點:有外部碎片;

② 動態分割槽分配演算法

​ a. 首次適應演算法:每次從低地址開始查詢,找到第一個能滿足大小的空閒分割槽。空閒分割槽按照地址遞增排序。

​ b. 最佳適應演算法:優先使用最小滿足大小的空閒分割槽。空閒分割槽按照容量遞增排序。(會產生很多外部碎片)

​ c. 最壞適應演算法:每次從低地址開始查詢,找到最大的空閒分割槽。空閒分割槽按照容量遞減排序。

​ d. 鄰近適應演算法(又叫迴圈首次適應演算法):在首次適應的基礎上,不再從投開始查詢,而是從上次查詢結束的位置開始查詢

5)非連續分頁管理方式

① 基本分頁儲存管理

​ a. 原理:把記憶體分為大小相等的小分割槽(頁框),把程序也分為與頁框大小相等的小塊(頁或頁面)。作業系統需要為每個程序建立一個頁表。

b. 過程:

i. 計算出邏輯地址對應的頁號

ii. 找到對應頁面在記憶體中的存放位置(不加快表就直接去記憶體找,有快表就先從快表中查詢,沒找到再去記憶體中查詢)

iii. 計算出邏輯地址對應的頁內偏移量

iv. 實體地址 = 頁面地址 + 頁內偏移量

​ c. 基本地址變換機構

​ i. 作用:基本地址變換機構可以藉助程序的頁表將邏輯地址轉換為實體地址

​ d. 具有快表的地址變換機構

​ i. 區域性性原理:

​ 時間區域性性

​ 空間區域性性

​ ii. 什麼是快表(TLB):訪問速度比記憶體快很多的高速緩衝儲存器,用於存放當前訪問的若干頁表專案,加快地址變換。

​ iii. 引入快表後,地址的變換過程:多了一個從快表中獲取的過程,沒命中再去記憶體中的頁表查詢。

​ e. 多級頁表

​ i. 目的:頁表必須連續存放,因此當頁表很大時,需要佔用很多連續的頁框,分頁儲存就失去了意義,故推出了多級頁表。

​ f. 【注】

​ i. 頁表是一個一維表:頁表號 —— 實體地址

​ ii. 不引入快表:兩次訪存;引入快表:一次訪存。

② 基本分段儲存管理

​ a. 原理:根據程式自身的邏輯關係劃分為若干個段(類似於方法,不同的方法不同的段),每一段都有一個段名,每段從0開始編址。記憶體中以段為單位分配,每個段連續空間,但各段之間可以不相鄰。

​ b. 訪問過程

​ c. 【注】

​ i. 段表是一個二維表:段號 —— 段長 + 段的起始地址(基址)

​ ii. 不引入快表:兩次訪存;引入快表:一次訪存。

​ d. 分段和分頁的對比

③ 段頁式儲存管理

​ a. 分頁分段的優缺點

​ b. 原理:先分段,再把每段分頁,這樣就避免了兩者的缺點。

​ c. 與單獨的段表、頁表的區別:段表存放的地址不同,單獨的段表存放的是實體地址的長度和起始位置,而這裡是存放的頁表長度和頁表存放地址;頁表是一樣的。

​ d. 地址變換過程

​ 【注】不引入快表:三次訪存;引入快表:一次訪存。

2. 虛擬記憶體管理

1)傳統儲存管理方式的特徵、缺點

​ 一次性:作業必須一次性全部裝入記憶體。導致大作業不能執行;作業太多也不能執行,多道程式併發度下降。

​ 駐留性:一但作業裝入記憶體,會一直駐留在記憶體中,用不上的也會駐留,浪費資源。

2)區域性性原理

① 時間區域性性

​ 如果執行了程式中的某條指令,那麼不久後這條指令很可能再次執行,資料也是,訪問了,後面也可能大量訪問(迴圈)。

② 空間區域性性

​ 一但程式訪問了某個儲存單元,那麼不久後,其附近的儲存單元也可能被訪問(因為很多資料都是連續儲存,指令也是順序存放的。

3)虛擬記憶體的定義和特徵

​ ① 定義

​ 基於區域性性原理,在程式裝入時,可以將程式中很快就會用到的部分裝入記憶體,暫時用不到的部分留在外存,就可以讓程式開始執行了。程式執行過程中,當訪問的資訊不存在時,由作業系統負責將所需資訊從外存調入記憶體,然後繼續。若記憶體空間不夠時,由作業系統負責將記憶體中暫時用不到的資訊換出記憶體。在作業系統的管理下,記憶體好像看起來比實際記憶體大得多,這就是虛擬記憶體。

​ ② 特徵

​ a. 多次性:無需在作業開始前一次性全部裝入記憶體

​ b. 對換性:作業執行時無需一直常駐

​ c. 虛擬性:從邏輯上擴充了記憶體的容量,看起來好像遠大於實際容量,物理上不變

4)如何實現虛擬記憶體技術

​ ① 建立在離散分配的記憶體管理方式基礎上

​ ② 實現方式

​ a. 請求分頁儲存管理

​ b. 請求分段儲存管理

​ c. 請求段頁式儲存管理

5)請求分頁管理方式

​ ① 與 基本分頁儲存管理 的區別

​ 執行過程中,所訪問的資訊不在記憶體中,由作業系統負責從外存中調入記憶體;如果記憶體不足,由作業系統負責將暫時不用的置換出去。

​ ② 頁表機制

​ 請求頁表,相比於基本頁表,增加了 狀態位、訪問欄位、修改位、外存地址

​ ③ 缺頁中斷機構

​ a. 當訪問的頁面不再記憶體時,會產生一個缺頁中斷,然後由作業系統的缺頁中斷處理程式處理中斷。此時缺頁的程序阻塞,調頁完成後,再將其喚醒。

​ b. 當記憶體中有空閒時,分配一個空閒塊,將所缺頁面裝入,並修改也表中相應的頁表項。如果沒有空閒塊,則由頁面置換演算法選擇一個淘汰,若被淘汰的頁面在儲存期間被修改過,則將其寫回外存,沒改就不寫。

​ 【注】缺頁中斷是因為當前執行的指令想要訪問的目標頁面未調入記憶體而產生的,故屬於 內中斷(訊號來源於CPU內部)

​ ④ 地址變換機構

6)頁面置換演算法

① 最佳置換演算法(OPT)

​ a. 原理:淘汰的頁面將是以後永不使用或者在最長時間內不再被訪問的頁面。

​ b. 缺陷:不能實現,因為不知道哪一個頁面是未來最長時間內不再被使用

② 先進先出置換演算法(FIFO)

​ a. 原理:淘汰的頁面是最早進入記憶體的頁面

​ b. 缺陷:與程序實際執行時的規律不適應,因為程序中有的頁面先進去但是經常被使用,效能差。

​ 【Belady異常】當為程序分配的物理快增大時,缺頁次數不減反增的現象(只有FIFO會出現)

③ 最近最久未使用置換演算法(LRU)

​ a. 原理:淘汰最近最久未使用的頁面。用頁表中的訪問欄位記錄該頁面自上次被訪問以來經歷的時間t,用於判斷是否要淘汰。

​ b. 缺陷:雖然效能好,但是實現困難,需要硬體支援,開銷大

④ 時鐘置換演算法(CLOCK、最近未使用演算法、BRU)

​ a. 原理:用頁表中的訪問位記錄是否被訪問過,再將頁面都通過連結串列指標連結成一個迴圈佇列,執行頁面置換的時候,遍歷連結串列,如果訪問位為0,則置換,如果為1,則標記為0,最多迴圈完一輪,肯定找到一個位置用於置換。

⑤ 改進型的時鐘置換演算法

​ a. 原理:在時鐘置換演算法的基礎上,增加一個修改位,優先置換近期未被訪問過且未被修改過的頁面。

​ i. 第一輪:找(0, 0)且不修改任何標誌位,找不到再找第二輪; (淘汰最近沒訪問且沒修改)

​ ii. 第二輪:找(0,1),找的過程中將訪問位置為0,找不到再第三輪。(淘汰最近沒訪問但修改過)

​ iii. 第三輪:找(0, 0)且不修改任何標誌位,找不到再找第四輪; (淘汰最近訪問過但沒修改)

​ iiii. 第四輪:找(0, 1)。因為第二輪已經將訪問位全部置為0了,這是找(0, 1)肯定能找到。(淘汰訪問過也修改過的)

⑥ 總結比較

7)頁面分配策略

① 駐留集大小

​ a. 駐留集:請求分頁儲存管理方式中,給程序分配的物理塊集合。一般駐留集大小小於程序的總大小。

​ b. 固定分配區域性置換:一開始分配好物理塊,頁面置換時也只換當前程序自己的。

​ c. 可變分配全域性置換:執行中可以更改駐留集大小,缺頁時給分配一個新的,沒有新的就發生頁面置換,置換可以換任何未鎖定的。

​ d. 可變分配區域性置換:執行中可以更改駐留集大小,缺頁時優先頁面置換,只能換當前程序自己的,頻繁換的話就多分配幾個新的。

② 調入頁面的時機

​ a. 預調頁策略:預測 -> 調入 (執行前)

​ b. 請求調頁策略:執行時發現缺頁時才調入。(執行時)

③ 從何處調入頁面

​ a. 對換區空間足夠:頁面調入調出都是記憶體與對換區之間進行。(在程序執行前會將相關資料從檔案去複製到對換區)

​ b. 對換區空間不足:凡是不會被修改的資料之間從檔案區調入,其他還是在記憶體和對換區之間進行。

​ c. UNIX方式:執行前程序的相關資料全部在檔案區,使用時從檔案區調入,不用了調出到對換區,下次再用就從對換區調入。

④ 抖動(顛簸)

​ a. 現象:剛剛換入記憶體的又要換出,剛剛換出的又要換入。

​ b. 原因:程序頻繁訪問的頁面數目高於可用的物理塊數(物理塊不夠)

⑤ 工作集

​ 某段時間間隔裡,程序實際訪問頁面的集合。

​ 一般來說駐留集大小不能小於工作集合,否則可能發生抖動。