1. 程式人生 > >作業系統之儲存器管理

作業系統之儲存器管理

儲存器的層次結構

儲存器的層次如下圖:

這裡寫圖片描述

上圖中,暫存器和主儲存器稱為可執行儲存器。快取記憶體的作用是緩和CPU與記憶體之間的速度差異,主要由硬體實現。磁碟快取的出現是由於記憶體容量不夠,需要引入磁碟,然而磁碟的I/O速度遠低於主存的訪問速度,為了緩和兩者之間在速度上的差異,設定了磁碟快取。磁碟快取與快取記憶體不同,它本身並不是實際存在的儲存器,是利用主存中的部分空間暫時存放從磁碟中讀出寫入的資訊。

程式的裝入與連結

使用者程式需要執行,必須先將它裝入記憶體,然後再將其轉變為一個可以執行的程式,通常要經歷一下幾個步驟:

  • 編譯:由編譯程式對使用者源程式進行編譯,形成若干個目標模組。
  • 連結:有連結程式將編譯後形成的一組目標模組以及他們所需要的庫函式連結在一起,形成一個完整的裝入模組。
  • 裝入:由裝入程式將裝入模組裝入記憶體。具體過程如下圖:
    這裡寫圖片描述

1. 程式的裝入

1) 地址空間
  • 程式編譯時還沒有裝入主存,還不能確定它在主存中的實際位置,所以都是從0開始。
  • 相對於0位置開始的地址稱為邏輯地址,也稱為相對地址。地址空間是指邏輯地址的集合。
2) 儲存空間
  • 一個程式在主存中的實際位置稱為實體地址。實體地址的集合就是儲存空間。

程式的裝入有三種方式:

1) 絕對裝入方式
  • 在編譯時,如果知道程式將駐留在記憶體的什麼位置,那麼,編譯程式將產生絕對地址的目的碼。絕對裝入程式按照裝入模組中的地址,將程式和資料裝入記憶體。
  • 裝入模組被裝入記憶體後,由於程式中的邏輯地址與實際記憶體中的地址完全相同,故不需對程式和資料的地址進行修改。
2) 可重定位裝入方式
  • 地址變換是在裝入時一次完成的,以後不再改變(靜態重定位)。
3) 動態執行時的裝入方式
  • 把裝入模組裝入記憶體後,並不立即把裝入模組中的相對地址轉換為絕對地址,而是把這種地址轉換推遲到程式真正要執行時才進行。
  • 因此, 裝入記憶體後的所有地址都仍是相對地址。

連續分配儲存管理方式

1) 單一連續分配

  • 把記憶體分為系統區和使用者區兩部分,系統區提供給OS使用,通常放在低地址部分,而在使用者區,僅裝有一道使用者程式,即整個記憶體的使用者空間由該程式獨佔 。
  • 只能用於單使用者、單任務的作業系統中。

2) 固定分割槽分配

  • 把記憶體的使用者空間劃分為若干個固定大小的區域,在每個分割槽中只裝入一道作業。
  • 最簡單的執行多道程式的儲存管理方式。

3) 動態分割槽分配

  • 事先不劃定分割槽的大小,根據程序的大小動態為整個程序分配一個連續的記憶體空間。
(1) 基於順序搜尋的動態分割槽演算法
  • 首次適應演算法(FF):
    • 空閒分割槽按地址遞增的次序連結
    • 從鏈首找第一個滿足大小的分割槽。
    • 劃出需要的記憶體,剩下的仍留在空閒鏈中。
    • 優點:保留了高址部分的大空閒區。
    • 缺點:低址部分會留下許多碎片。
  • 迴圈首次適應演算法(NF):
    • 從上次找到的空閒分割槽的下一個分割槽開始找,直至找到第一個滿足大小的分割槽。
    • 劃出需要的記憶體,剩下的仍留在空閒鏈中。
    • 優點:使空閒分割槽分佈得較均勻。
    • 缺點:缺乏大的空閒分割槽。
  • 最佳適應演算法(BF):
    • 把空閒分割槽按容量從小到大排序
    • 把滿足要求且最小的空閒分割槽分配為作業。
    • 優點:可以避免“大材小用”。
    • 缺點:會留下許多碎片。
  • 最壞適應演算法(WF)
    • 把空閒分割槽按容量從大到小排序
    • 查詢時只要看第一個分割槽能否滿足作業要求。
    • 優點:剩下的空閒區不至於太小。
    • 缺點:會使儲存器中缺乏大的空閒分割槽。
(2) 基於索引搜尋的動態分割槽演算法
  • 快速適應演算法:
    • 又稱為分類搜尋法,將空閒分割槽根據容量大小進行分類,對於每一類具有相同容量的所有空閒分割槽,單獨設立一個空閒分割槽連結串列。
    • 在記憶體中設立一張管理索引表,每一個表項對應了一種空閒分割槽型別,並記錄了空閒分割槽連結串列表頭的指標。
    • 空閒分割槽的分類是根據程序常用的空間大小進行劃分,如2 KB、4 KB、8 KB等,對於其它大小的分割槽,如7 KB這樣的空閒區,既可以放在8 KB的連結串列中,也可以放在一個特殊的空閒區連結串列中。
    • 優點:查詢效率高,不會產生碎片。
    • 缺點:分割槽歸還主存演算法複雜,系統開銷大。
  • 夥伴系統:
    • Linux對記憶體空閒空間的管理採用夥伴(Buddy)演算法。
    • Buddy演算法是把記憶體中的所有頁幀按照2n劃分,其中n=0~9。對記憶體空間按1個頁幀、2個頁幀、4個頁幀、8個頁幀、16個頁幀、32個頁幀、 …、512個頁幀進行劃分。 劃分後形成了大小不等的儲存塊,稱為頁幀塊,簡稱頁塊。包含1個頁幀的頁塊稱為1頁塊,包含2個頁幀的稱為2頁塊,依此類推。Linux把實體記憶體劃分成了1、2、4、8、…、512六種頁塊。
    • 假設要求分配的塊其大小為128個頁面(由多個頁面組成的塊我們就叫做頁面塊)。該演算法先在塊大小為128個頁面的連結串列中查詢,看是否有這樣一個空閒塊。如果有,就直接分配;如果沒有,該演算法會查詢下一個更大的塊,具體地說,就是在塊大小為256個頁面的連結串列中查詢一個空閒塊。如果存在這樣的空閒塊,核心就把這256個頁面分為兩等份,一份分配出去,另一份插入到塊大小為128個頁面的連結串列中。如果在塊大小為256個頁面的連結串列中也沒有找到空閒頁塊,就繼續找更大的塊,即512個頁面的塊。如果存在這樣的塊,核心就從512個頁面的塊中分出128個頁面滿足請求,然後從384個頁面中取出256個頁面插入到塊大小為256個頁面的連結串列中。然後把剩餘的128個頁面插入到塊大小為128個頁面的連結串列中。如果512個頁面的連結串列中還沒有空閒塊,該演算法就放棄分配,併發出出錯訊號。
    • 滿足以下條件的兩個塊稱為夥伴:
      • 兩個塊的大小相同
      • 兩個塊的實體地址連續
  • 雜湊演算法:
    • 雜湊演算法構造一張以空閒分割槽大小為關鍵字的雜湊表,該表的每一個表項記錄了一個對應的空閒分割槽連結串列表頭指標。
    • 當進行空閒分割槽分配時,根據所需空閒分割槽大小,通過雜湊函式計算,即得到在雜湊表中的位置,從中得到相應的空閒分割槽連結串列,實現最佳分配策略。

4) 動態可重定位分割槽分配

  • 重定位:就是將邏輯地址轉換為實體地址。
  • 靜態重定位:在程式被載入到記憶體之前已經知道了它將要載入到記憶體的開始地址,這樣就可以事先進行地址轉換,把相對地址轉換成絕對地址。
  • 動態重定位:作業裝入記憶體後所有的地址仍然是相對地址,將相對地址轉換成絕對地址的過程被推遲到程式指令要真正執行時進行。
(1) 緊湊
  • “緊湊”而使程式移動時,只需用新的起始地址置換原來的起始地址。
(2) 動態重定位
  • 重定位暫存器,用它來存放程式資料在記憶體中的起始地址。
  • 系統對記憶體進行了緊湊之後,不需要對程式做任何的修改,只需要用該程式在記憶體中的新起始地址去置換原來的起始地址即可。
  • 動態重定位如下:

這裡寫圖片描述

(2) 動態重定位分割槽的演算法
  • 在動態分割槽分配演算法的基礎上增加了“緊湊”的功能,流程圖如下:

    這裡寫圖片描述

離散分配記憶體管理方式

連續分配方式會形成許多“碎片”,雖然通過緊湊可以將許多碎片連線成可用的大塊空間,但是緊湊的代價太大。將一個程序直接分散的裝入到許多不相鄰的分割槽中,便可充分利用記憶體空間。

1) 分頁儲存管理方式

將使用者程式的地址空間分成若干個固定大小的區域,稱為頁或頁面。具體的頁的大小有系統規定,相應的,也將記憶體空間分為若干個物理塊或頁框,頁和塊的大小相同。這樣可將使用者程式的任一頁放入任一物理塊中,實現離散分配。

  • 頁面。在為程序分配記憶體時,以塊為單位將程序中的若干個頁分別裝入到多個可以不相鄰接的物理塊中。由於程序的最後一頁經常裝不滿一塊而形成了不可利用的碎片,稱之為“頁內碎片”。
  • 邏輯地址結構如下圖:
    這裡寫圖片描述
  • 頁表。通常存放在記憶體中,頁表的作用是實現頁號到物理塊號的地址對映。
(1) 基本的地址變換機構
  • 在系統中設定一個頁表暫存器,其中存放頁表在記憶體的起始地址和頁表的長度。程序為執行時,頁表的起始地址和頁表的長度存放於程序的PCB中。當排程程式排程到某程序時,才將這兩個資料裝入頁表暫存器中。
  • 需要訪問兩次記憶體,一次獲取物理塊號得到實體地址,第二次根據實體地址獲得所需資料。
  • 地址變換機構如下:
    這裡寫圖片描述
(2) 具有快表的地址變換機構
  • 每次都要訪問兩次記憶體速度太慢,為提高地址變換速度,增添一個高速緩衝暫存器,又稱快表。
  • CPU給出有效地址後,有地址變換機構自動的將頁號P送入高速緩衝暫存器,並將此頁號與快表中的所有頁號進行比較。
  • 變換機構如下:
    這裡寫圖片描述

2) 分段儲存管理方式

  • 分頁儲存是為了提高記憶體利用率。
  • 分段儲存則是為了滿足使用者在程式設計和使用上多方面的要求。方便程式設計,資訊共享,資訊保護,動態增長,動態連結。
  • 分段:每個段定義了一組邏輯資訊。
  • 分段地址具有以下的邏輯結構:
    這裡寫圖片描述
(1) 地址轉換機構
  • 地址變換機構:
    這裡寫圖片描述

  • 要訪問兩次記憶體。

(2) 分頁和分段的主要區別
  • 頁是資訊的物理單位,段則是資訊的邏輯單位。分頁是為消減記憶體的外零頭,提高記憶體的利用率,是系統管理的需要。分段的目的是為了能更好地滿足使用者的需要。
  • 頁的大小固定且由系統決定,而段的長度卻不固定,決定於使用者所編寫的程式。
  • 分頁的作業地址空間是一維的,而分段的作業地址空間則是二維的(段號+段基址)。

3) 段頁儲存管理方式

  • 是分段和分頁的結合:先將使用者程式分成若干個段,再把段分成若干個頁。
  • 作業邏輯地址結構如下:
    這裡寫圖片描述

  • 地址變換過程:
    這裡寫圖片描述

  • 需要訪問三次記憶體。