理解作業系統之儲存管理

塗印發表於2018-10-17

本文是介紹作業系統儲存管理的入門級文章,旨在介紹作業系統中儲存管理的一般內容,本文主要圍繞以下話題展開。

  • 計算器系統中的儲存結構
  • 程式的連結和裝入的概念
  • 程式儲存空間的分配
    1. 連續儲存空間分配
    2. 離散儲存空間分配(分頁儲存,分段儲存,段頁式儲存)
  • 虛擬儲存器
    1. 請求分頁儲存
    2. 請求分段儲存
    3. 置換演算法

一丶計算機系統中的儲存結構

計算機系統中的儲存結構
上圖中描述了計算機系統中的一般儲存結構,從左往右儲存資源的價格越來越便宜,但是存取的速度越來越貴。本文研究的儲存管理指的主存管理以及少部分磁碟和主存之間的互動。

  • CPU暫存器,這是最昂貴的儲存資源,裡面一般快取了些極其重要且頻繁使用的資料。比如地址變換表的基地址等資訊。
  • 快取記憶體,是為了提高CPU資源利用率而設計的儲存結構,存放的時最近使用以及將來會使用的資料。越靠近CPU側存取速度越快,儲存價格越高。
  • 主存,這是最主要的儲存區域。執行中的程式(程式)都是被載入到主存中的。
  • 磁碟,這是生活中最接觸的存取區域,一般存放可執行檔案,資原始檔,配置檔案等。IO操作就是指對磁碟進行的讀寫操作。很多場景下IO操作是系統效能的瓶頸

二丶程式的連結和裝入

  1. 裝入

    這是一個比較容易理解的概念,將位於硬碟上的程式碼載入至記憶體中的過程即為裝入。在裝入的過程中,存在一個轉換的過程。該過程將程式程式碼中的邏輯地址轉換實體記憶體中絕對地址。不同的地址轉換方式對應三種不同裝入方式

  • 絕對裝入

    在程式程式碼編寫的過程就確定了儲存的實體地址。此時邏輯地址和實體地址保持一致。在現在作業系統中不會採用這種方式

  • 可重定位裝入

    在程式載入到記憶體地址中是,其可以儲存到記憶體的任意位置。實體地址 = 邏輯地址(相對地址) + 實體記憶體載入處的起始地址。 可重定位的裝入方式比絕對裝入靈活多了,但是其儲存地址在剛載入記憶體後就固定了,後續不可以移動儲存位置。在現在作業系統中也不使用這種方式

  • 執行時裝入

    目前主流的裝入方式,其在程式載入到記憶體時,不會將邏輯地址轉換實體地址,僅僅在程式程式碼被執行時,才將邏輯地址轉換為實體地址。 執行時裝入,允許程式在在讀記憶體後,依舊能夠在儲存空間中移動。能滿足記憶體整理等場景的要求。

  1. 連結

    連結也是一個比較易懂的概念,和裝入的過程頗為相似。程式在經過編譯之後,將形成多個目標模組,將這多個目標模組組合成一個整體的過程即為連結。根據這些目標模組組合的不同時機,連結分為以下三類

  • 靜態連結

    在程式執行之間,就將像目標模組以及庫函式合=連結成一個整體模組。

  • 裝入時連結

    在裝入目標模組的時候,一邊裝入一邊連結

  • 動態連結

    在使用到相關程式邏輯的時候,開始連結。

三丶程式儲存空間的分配

在程式執行完連結和裝入過程後,位於硬碟上的程式碼就將載入記憶體中。此處必須要為程式分配其所需要的儲存空間。依據分配儲存空間是否連續這一特點,可將儲存空間的分配分為連續分配以及離散分配

  1. 連續儲存空間分配

    • 單一連續儲存分配

      該種方法適用於單使用者,單任務的作業系統。其將主記憶體分為系統記憶體和工作記憶體。系統記憶體負責載入作業系統等內容。工作記憶體僅載入需執行的任務,每個被載入的任務將獨佔記憶體。系統記憶體和工作記憶體之間相互獨立。

    • 固定儲存分配

      該方法適用於適用於多工作業系統。其將主記憶體分為多個大小相等的子記憶體區域,當存在任務載入需求的時候,將任務載入去子記憶體區域。該方法採用的固定分割槽,靈活性不夠。不能解決分割槽過大導致的記憶體碎片的問題,也不能解決分割槽過小導致無法載入大作業的問題。(也可以將記憶體固定劃分為不等的子記憶體區域,又稱為不等分割槽固定分配)

    • 動態儲存空間分配

      在任務載入進記憶體時,依據任務所需記憶體大小實現按需分配。動態儲存空間分配,看似解決了記憶體碎片問題,實際上並不是這樣的。在動態儲存空間分配時,多次記憶體分配操作,會產生一系列地址不聯絡,大小各異的記憶體空間。當這些記憶體空間被回收後,將退化成不等分割槽的固定儲存分配。

    • 可重定位的分割槽分配

      該儲存方式,在動態儲存空間分配上新增了記憶體整理功能。若當前記憶體空間不能滿足任務所需記憶體空間時,其會將已分配的記憶體空間全部移動,使未分配的記憶體空間形成一片連續的地址空間。該種方法則要求程式的裝入方式是動態裝入

    上述介紹的四種儲存空間分配方法被稱為連續的分配是因為其不能分割作業儲存。只能將作業儲存在一塊連續記憶體空間中,並不能將作為劃分成更小的單位進行分塊儲存。

  2. 離散儲存空間分配

    離散儲存空間分配是指,其能將任務分割成更小的儲存單位。分割後的儲存單位連續儲存,而儲存單位與儲存單位之間並不要求連續。通過將任務拆分進行儲存的方法,能極大的提高儲存空間的利用率。

    • 頁式儲存空間分配

      這裡將定義為一個固定大小的儲存單位。在將任務載入記憶體時,一個完整的任務可以被劃分成多頁。每頁獨立的儲存到記憶體空間中,記憶體空間中儲存位置可用物理頁號描述。每頁的儲存是連續,頁與頁之間的儲存並不是連續的,而是離散儲存的。 為了建立任務的地址與物理空間地址之間的聯絡。在記憶體表中將建立頁表,完成頁號到物理號的對映

    頁表

    • 段式儲存空間分配

      段式儲存的方法和頁式儲存的方法手段都是一致。將任務以**段為儲存單位,將任務分成多段進而離散儲存。**在記憶體中同樣維護了一張段表。段表和頁表結構是一致的。

      段表
      那麼頁式儲存和段式儲存這兩者的差別究竟何在呢? 以下是頁式儲存和段式儲存的差別

      • 頁是資訊的物理單位,分頁式為了減少記憶體碎片,提高記憶體利用率而提出的。段是資訊的邏輯單位,它包含一組完成的邏輯意義,其不僅能提高記憶體利用率,而且在方便程式設計,資訊共享,資訊保護等方面均有好處。
      • 頁的大小是有作業系統固定設計的,在系統中頁的大小是固定且唯一的。段長度並不是固定的,取決於使用者所編寫的程式,通常由編譯程式在對源程式進行編譯時,根據資訊的性質決定。
    • 段頁式儲存空間分配

      該儲存方式實際上是,分頁儲存和分段儲存的組合。先將任務按照段進行劃分,然後每段按照分頁的方式進行儲存,即為段頁式儲存。下文將比較分頁儲存,分段儲存,以及段頁式儲存記憶體地址的變化

      • 分頁儲存地址(頁號:頁內偏移地址)
      • 分段儲存地址(段號:段內偏移地址)
      • 段頁式儲存(段號段內偏移頁號:頁內偏移地址)

四丶虛擬儲存器

虛擬儲存器是現在作業系統廣泛使用的一種儲存方式,虛擬儲存能在不對實體記憶體擴容的基礎上,保證能夠執行更多更大的記憶體任務。虛擬儲存器和常規儲存器的不同之處在於,虛擬儲存器不要求你任務一次性全部載入記憶體,而是按需載入記憶體。並且能在記憶體空間受限時,將閒置的記憶體作業調出記憶體,這種將記憶體作業調出記憶體的過程稱為置換,完成置換過程的方式則稱為置換演算法。在上述過程中,不將作業一次性完全載入記憶體,顯然是建立在分頁儲存或者分段儲存的基礎上,下文對這兩種情況分別介紹

  • 請求分頁儲存

    請求分頁儲存具有兩點內容需要理解:

    1. 分頁載入,按需載入

      請求分頁儲存將任務以頁為單位進行劃分,在載入記憶體時,並不將全部頁面載入。而是將部分必須的頁面載入記憶體,其他的頁面在程式執行中,若使用則按需載入記憶體。

    2. 分頁置換

      在記憶體空間緊張時,會將程式中某些使用或者近期不在使用的頁面,從記憶體置換到磁碟中去。

    在請求分頁儲存中,記憶體中維護的頁表不再是簡單的頁號到記憶體物理號之間的對映了。其頁表結構一般如下:

    理解作業系統之儲存管理

    • 頁號,這個欄位代表分頁順序
    • 物理塊號,這個欄位代表,該頁在記憶體中的位置
    • 狀態位P,該狀態位用來標識該頁是否載入記憶體,true代表載入記憶體,false代表未載入記憶體
    • 訪問欄位,該狀態位是統計狀態位,可以用來記錄該頁最近被訪問的次數
    • 修改位,該位用來標識,該頁載入到記憶體後是否被修改過了。若記憶體中修改過後,其置換到外存時,需要回寫回去。如果沒有修改過,那麼其置換到外存時,無須回寫回去。
    • 外存地址,該位儲存該也在外存中的地址。一般來說,在載入記憶體後,外存上依舊會留有一一份拷貝資訊。
  • 請求分段儲存

    請求分段儲存與請求分頁儲存及其相似。唯一的區別便是,載入和置換的單位從轉換到了

  • 置換演算法

    置換演算法,在虛擬儲存器中是非常重要的內容。在虛擬儲存器設計理念中,當記憶體資源緊張的時候,會依據置換演算法將記憶體中的頁面置換到外存中。此處介紹兩種置換演算法

    1. LRU(Least Recently used,最近最久使用演算法)

      最近最久未使用演算法,在頁面項中新增了訪問時間欄位T,記錄最近一次訪問到目前過去的時間。在需要進行頁面置換時候,將T最大的頁面置換出去。

    2. LFU(Least Frequently used,最少使用演算法)

      最少使用演算法,在頁面項中新增了訪問頻率欄位F,計算最近一段時間內該頁面被訪問的頻率。在需要進行頁面置換時候,將F最小的頁面置換出去

相關文章