作業系統 記憶體管理 記憶體存儲管理方案
- 2019 年 12 月 23 日
- 筆記
基本思想:是把記憶體劃分成若干個連續的區域,稱為分區,每個分區裝入一個運行程式。
固定分區
基本思想
固定分區是指系統先把記憶體劃分為若干個大小固定的分區,一旦分配好,在系統運行期間便不再重新劃分。程式運行時必須提供對記憶體資源的最大申請量。
記憶體分配表與分區的分配、回收
用於固定分區管理的記憶體分配表是一張分區說明表,按順序每個分區說明表中對應一個表目。表目內容包括分區序號、分區大小、分區起始地址以及使用狀態(空閑或佔用)。一個程式在運行時,想要根據其對記憶體的需求量,按一定的分配策略在分區說明表中查找空閑分區。若找到合乎需要的分區,就將該分區分配給程式,並將該分區置為佔用狀態。當程式完成時釋放這塊分區記憶體,由系統回收,並在分區說明表中間回收的分區重新置為空閑狀態。

固定分區方案靈活性差,可接納程式的大小受到了分區大小的嚴格限制。
可變分區
基本思想
可變分區是指系統不預先劃分固定分區,而是在裝入程式時劃分記憶體分區,使為程式分配的分區的大小正好等於該程式的需求量,且分區的個數是可變的。可變分區有較大的靈活性,較之固定分區能更好的記憶體利用率。
系統初次啟動後,在記憶體中出作業系統區之外,其餘空間為一個完整的大空閑區,當有程式要求裝入記憶體運行時,系統從該空閑區中劃分出一塊與程式大小相同的區域進行分配。當系統運行一段時間後,隨一系列的記憶體分配與回收,原來的一整塊大空閑區形成了若干佔用區和空閑區相間的布局,若有上下相鄰的兩塊空閑區,系統應將他們合併成為一塊連續的大空閑區。

移動技術
記憶體經過一段時間的分配回收之後們會存在很多曉得空閑塊。它們每一塊都不足以滿足程式進一步分配記憶體的要求,但其總和卻可以滿足程式的分配要求,這些空閑塊稱之為碎片。
解決碎片的辦法:在適當時刻進行碎片整理,通過移動記憶體中的程式,把所有空閑碎片合成一個連續的大空閑區且放在記憶體的一端,而把所有程式佔用區放在記憶體的另一端,稱為「移動技術」或「緊湊技術」或「緊縮技術」。
提高記憶體的利用率,便於作業動態擴充記憶體。採用移動技術需要注意以下問題:
- 移動技術會增加系統的開銷。增大了系統運行時間。
- 移動是由條件的,不是任何在記憶體中的作業都能隨時移動。
採用移動技術是應該儘可能減少需要移動的作業數和資訊量。

可變分區的實現
採用可變分區方式管理時,要有硬體的地址轉換機構作為支援。硬體設置兩個專用的控制暫存器:基址暫存器和限長暫存器。
- 基址暫存器用來存放程式所佔用分區的起始地址。
- 限長暫存器用來存放程式所佔分區的長度。
但程式被裝到所分配的分區後,把分區的起始地址和長度作為現場資訊存入該作業進程的進程式控制制塊中。

為了實現可變分區的管理,必須設置某種數據結構用以記錄記憶體分配的情況,確定某種分配策略並且實施記憶體的分配與回收。
記憶體分配表由兩張表格組成:
- 已分配區表:記錄已裝入的程式在記憶體中佔用分區的起始地址和長度,用標誌位指出佔用分區的程式名。
- 空閑區表:記錄記憶體中可供分配的空閑區的起始地址和長度,用標誌位指出該分區是未分配的空閑區。

空閑分區的分配策略
最先適應演算法
最先適應演算法,又稱順序分配演算法,當接到記憶體申請是,順序查找分區說明表,找到第一個滿足申請長度的空閑區,將其分割並分配,可以快速做出分配決定。

最優適應演算法
當接到記憶體申請時,查找分區說明表,找到第一個能滿足申請長度的最小空閑區,將其分割並分配。
優點:最節約空間,因為它盡量不分割大的空閑區。 缺點:可能會形成很多很小的空閑區域,稱為碎片。
最壞適應演算法
當接到記憶體申請時,查找分區說明表,找到能滿足申請要求的最大的空閑區。
基本思想:在大空閑區中裝入資訊後,分割剩下的空閑區相對也很大,還能用於裝入其他程式。
優點:是可以避免形成碎片。
缺點:分割了大的空閑區後,如果在遇到較大的程式申請記憶體時,無法滿足要求的可能性越大。
下次適應演算法
當接到記憶體申請時,查找分區說明表,從上一次分配的位置開始掃描記憶體,選擇下一個大小足夠的可用塊。
分區的回收
當用戶程式執行接受後,系統要回收已經使用完畢的分區,將其記錄在空閑區表中。在回收空間時,應首先檢查是否有與回收區相鄰的空閑區,即檢查相鄰的空閑區表中標誌為「未分配」的欄目,以確定是否有相鄰空閑區,若有,則應合併成一個空閑區登記。
假定作業歸還的分區起始地址為S,長度為L。
(1)回收區的上鄰分區是空閑的,需要將兩個空閑區合併成一個更大的空閑區,然後修改空閑區表。
如果空閑區表中第i個登記欄中的「起始地址+長度」正好等於S,則說明回收區有一個上鄰空閑區。
長度 = 原長度 + L

(2)回收分區的下鄰分區是空閑的,需要將兩個空閑區合併成一個更大的空閑區,然後修改空閑區表。
如果S+L正好等於空閑區表中某個登記的欄目(假定為第i欄)所示分區的起始地址表明回收區有一個下鄰空閑區。
起始地址 = S 長度 = 原長度 + L
第i欄指示的空閑區是回收區與下鄰空閑區合併之後的一個大空閑區。
(3)回收區的上鄰分區和下鄰分區都是空閑的,需要將三個空閑區合併成一個更大的空閑區,然後修改空閑區表。
S = 第i欄起始地址 + 長度 S + L = 第k欄起始地址
表明回收區既有上鄰空閑區,又有下鄰空閑區。必須把這三個區合併為一個空閑區。
- 第i欄起始地址不變。
- 第i藍長度為「i欄中原長度+k欄中長度+L」。
- 第k欄目的標誌應修改為「空」狀態。
(4)回收分區的上鄰分區和下鄰分區都不是空閑的,則直接將空閑分區記錄在空閑區表中。
應找一個標誌為「空」的登記欄,把回收區的起始地址和長度登記入表,且把該欄目中的標誌位修改成「未分配」,表示該登記欄中指示了一個空閑區。
分區的保護
(1)系統設置界限暫存器,界限暫存器是可以上下界暫存器或基址、限長暫存器。

(2)保護鍵發:即為每個分區分配一個保護鍵,相當於一把鎖。同時為每個進程分配一個相應的保護鍵,相當於一把鑰匙,存放在程式狀態字中。美方訪問記憶體時,都要檢查鑰匙和鎖是否匹配,若不匹配,將發出保護性中斷。
分區管理方案的優缺點
優點:分區管理是實現多道程式設計中一種簡單易行的存儲管理技術。通過分區管理,記憶體真正成了共享資源,有效地利用了處理機和I/O設備,從而提高了系統的吞吐量和縮短了周轉時間。在記憶體利用率方面,可變分區的記憶體利用率比固定分區高。
缺點:記憶體使用不充分,並且存在較為嚴重的碎片問題,雖然可以解決碎片問題,但需要移動大量資訊,浪費了處理機時間。收到物理存儲器實際存儲容量的限制。
本文鏈接:https://www.debuginn.cn/260.html
本文採用CC BY-NC-SA 3.0 Unported協議進行許可,轉載請保留此文章鏈接