1. 程式人生 > >第四章 儲存器管理(一)

第四章 儲存器管理(一)

4.1 儲存器的層次結構

1.計算機的儲存層次:最高層為CPU暫存器,中間為主存,最底層是輔存。

2.根據功能劃分:暫存器、快取記憶體、主儲存器、磁碟快取、固定磁碟、可移動儲存介質等6層。

暫存器、快取記憶體、主儲存器和磁碟快取均屬於作業系統儲存管理的管轄範疇,掉電後儲存的資訊不存在;低層的固定磁碟和可移動儲存介質則屬於裝置管理的管轄範疇,儲存的資訊將被長期儲存。

4.2 程式的裝入和連結

1.程式裝入記憶體的步驟:

  • 編譯,由編譯程式對使用者源程式進行編譯,形成若干個目標模組;
  • 連結,由連結程式將編譯後形成的一組目標模組以及它們所需要的庫函式連結在一起,形成一個完整的裝入模組;
  • 裝入,由裝入程式將裝入模組裝入記憶體:構造PCB,形成程序,開始執行。

2.實體地址(絕對地址、實地址):記憶體中儲存單元的地址。實體地址可直接定址被執行。

3.邏輯地址(相對地址、虛地址):使用者的程式經過彙編或編譯後形成目的碼,目的碼中的指令地址是相對地址。不能用邏輯地址在記憶體中讀取資訊0。

4.絕對裝入方式:一般首地址為0,其餘指令中的地址都相對於首地址來編址。

5.可重定位裝入方式:邏輯地址->重定位->實體地址

6.動態執行時的裝入方式:更適合部分裝入。

  • 裝入完成後,程式作為整體連續裝在一塊記憶體中,記錄下基地址即可。
  • 程式離散裝入在不同記憶體位置的,需記錄下多個偏移用的基地址。
  • 動態重定向的這些被記錄的基地址不一定固定不變,可能會根據記憶體使用情況變化更新。

4.3 連續分配儲存管理方式

1.要解決的問題:

  • 尋找足夠的儲存空間
  • 地址對映問題

2.程式設計師瞭解的是相對地址,PCB中儲存的是對映關係,得到邏輯地址。

3.連續分配方式:

  • 單一連續分配
  • 固定分割槽分配
  • 動態分割槽分配
  • 動態可重定位分割槽分配

4.單一連續分配:

記憶體分為系統區和使用者區兩部分:系統區僅提供給OS使用,通常放在記憶體的低址部分;使用者記憶體區中,僅裝有一道使用者程式,即整個記憶體的使用者空間都由該程式獨佔。

5.固定分割槽分配:

  • 使用者空間劃分為若干個固定大小的分割槽,每個分割槽分配給一個程式,作業系統佔一個分割槽。
  • 劃分為幾個分割槽,便只允許幾道作業併發。

5_1 固定分割槽分配的具體實現:

  • 如何劃分分割槽大小
  • 需要的資料結構
  • 分配回收操作

5_2 劃分分割槽的方法:

  • 分割槽大小相等(所有的記憶體分割槽大小相等),只適用於多個相同的程式的併發執行,缺乏靈活性。
  • 分割槽大小不相等。

5_3 記憶體分配:

  • 將分割槽按其大小進行排隊,併為之建立一張分割槽使用表。
  • 可以將分割槽表劃分為兩個表格:分割槽使用表、空閒分割槽表
  • 空閒分割槽表的排序規則:按空間大小排序、按地址高低排序
  • 過程:檢索空閒分割槽表,找出一個滿足要求且尚未分配的分割槽,分配給請求程式;若未找到大小足夠的分割槽,則拒絕為該使用者程式分配記憶體。
  • 缺點:
    ①內碎片(已分配未使用),產生儲存空間的浪費;
    ②分割槽總數固定,限制併發執行的程式數目。

6.動態分割槽分配:需要多少劃多少

6_1 具體實現:

  • 分割槽分配中的資料結構:空閒分割槽表(從1項->n項)、空閒分割槽鏈
  • 分割槽分配操作
  • 分割槽分配演算法

6_2 優缺點

優點:併發程序數沒有固定數的限制,不產生內碎片。
缺點:外碎片(使用後不可再使用),空閒大小不夠程式執行。

6_3 分配記憶體

系統應利用某種分配演算法,從空閒分割槽鏈(表)中找到所需大小的分割槽。若m.size-u.size≤size,說明多餘部分太小,可不再切割,將整個分割槽分配給請求者,否則,便從該分割槽中按請求的大小劃分出一塊記憶體空間分配出去,餘下的部分仍留在空閒分割槽鏈(表)中。然後,將分配區的首地址返給呼叫者。

6_4 回收記憶體

  • 回收區與插入點的前一個空閒分割槽F1相鄰接。此時應將回收區和插入點的前一分割槽合併,只需修改其前一分割槽F1的大小;
  • 回收分割槽與插入點的後一空閒分割槽F2相鄰接。此時也可將兩分割槽合併,形成新的空閒分割槽。用回收區的首址作為新空閒區的首址,大小為兩者之和。
  • 回收區同時與插入點的前、後兩個分割槽鄰接。此時將三個分割槽合併。
  • 回收區既不與F1鄰接,又不與F2鄰接。為回收區單獨建立一個新表項。

6_4 動態分割槽分配演算法:

6_4_1 首次適應(FF)演算法:空閒分割槽鏈以地址遞增的次序連結。

  • 從鏈首開始順序查詢,直至找到一個大小能滿足要求的空閒分割槽為止。然後按照作業大小,從該分割槽中劃出一塊記憶體空間,分配給請求者,餘下的空閒分割槽仍留在空閒鏈中。若從鏈首直至鏈尾都不能找到應該能滿足要求的分割槽,記憶體分配失敗。
  • 優點:優先利用記憶體中低址部分的空閒分割槽,從而保留了高址部分的大空閒區。
  • 缺點:
    ①低址部分不斷被劃分,會留下許多難以利用的、很小的空閒分割槽,稱為碎片。
    ②每次查詢又都是從低址部分開始的,增加查詢可用空間分割槽時的開銷。

6_4_2 迴圈首次適應(NF)演算法:空閒分割槽按地址排序

  • 迴圈首次適應演算法在為程序分配記憶體空間時,從上次找到的空閒分割槽的下一個空閒分割槽開始查詢,直至找到一個能滿足要求的分割槽的空閒分割槽,從中劃出一塊與請求大小相等的記憶體空間分配給作業。
  • 優點:空間分割槽分佈得更均勻,減少了查詢的開銷。
  • 缺點:缺乏大的空閒分割槽。

6_4_3 最佳適應(BF)演算法:所有的空閒分割槽按其容量以從小到大的順序形成一空閒分割槽鏈。

  • 把能滿足要求、又是最小的空閒分割槽分配給作業,避免“大材小用”。從表或鏈首開始,找到的第一個滿足的分割槽就分配。
  • 缺點:每次分配後所切割下來的剩餘部分總是最小的,留下許多難以利用的碎片(外碎片)。

6_4_4 最壞適應(WF)演算法:從大到小排序

  • 挑選一個最大的空閒區,從中分割一部分儲存空間給作業使用,以至於儲存器中缺乏大的空閒分割槽。
  • 剩下的空閒區不至於太小,但會出現缺乏較大的空閒分割槽的情況。

6_4_5 快速適應演算法:將空閒分割槽根據其容量大小進行分類

  • 相同容量的分割槽,設立一個空閒分割槽連結串列,系統中存在多個空閒分割槽連結串列。
  • 空閒分割槽的分類是根據程序常用的空間大小進行劃分的。
  • 分配過程:根據程序的長度,尋找能容納它的最小空閒區連結串列,取下第一塊進行分配。
  • 缺點:連結串列指標過多,以空間換時間。

7.動態可重定位分割槽分配——有緊湊功能的動態分割槽分配

  • 通過移動記憶體中作業的位置,把原來多個分散的小分割槽拼接成一個大分割槽的方法,稱為“拼接”或“緊湊”。
  • 地址變換過程(相對地址與重定位暫存器中的地址相加)是在程式執行期間,隨著對每條指令或資料的訪問自動進行的,故稱為動態重定位。
  • 動態重定位分割槽分配演算法與動態分割槽分配演算法基本相同,差別在於增加了緊湊的功能。

8.夥伴系統

  • 無論已分配還是空閒分割槽,大小都為2的k次冪(k為整數,1≤k≤m)。
  • 通常整個可分配空間大小為2的m次方,也就是最大分割槽的大小。
  • 系統開始執行的時候,整個記憶體區是一個大小為2的m次方的空閒分割槽。隨著系統執行,記憶體被不斷劃分,形成若干不連續的空閒分割槽。對每一類具有相同大小的空閒分割槽設定一雙向連結串列。不同大小的空閒分割槽形成了k個空閒分割槽連結串列。
  • 程序申請長度為n的儲存空間時,計算2的(i-1)次方≤n≤2的i次方,則找空閒分割槽大小為2的i次方的連結串列。若2的i次方大小的連結串列沒有,則找2的(i+1)次方的連結串列。找到的分割槽對半劃分後,一半用於分配,一半連結到較小一級的連結串列裡去。若再沒有,則再找2的(i+2)次方的連結串列,以此類推,直至找到或找遍。
  • 一次分配和回收都可能對應多次的劃分和合並。
  • 怎麼找到合適的鏈?——雜湊演算法

4.4 對換

1.對換:把記憶體中暫時不能執行、或暫時不用的程式和資料調到外存上,以騰出足夠的記憶體,再把已具備執行條件的程序和程序所需要的程式和資料,調入記憶體。

2.對換的分類(按對換單位分類):

  • 整體對換(或程序對換):以整個程序為單位(連續分配)
  • 頁面對換或分段對換:以頁或段為單位(離散分配)

3.實現程序對換,系統必須具備的功能:

  • 對換空間的管理
  • 程序的換出、換入操作

4.對換空間的管理

在這裡插入圖片描述

5.在系統中設定相應的資料結構以記錄對換區的使用情況

6.對換空間的分配與回收是連續方式,與動態分割槽方式時的記憶體分配與回收雷同。