1. 程式人生 > 其它 >分頁儲存管理

分頁儲存管理

一、基本分頁儲存管理

1.1、分頁思想

  • 分頁思想
    • 記憶體空間劃分為一個個大小相等的分割槽,每個分割槽就是一個“頁框”,或稱“頁幀”、“記憶體塊”、“物理塊” 。每個頁框有一個編號,即“頁框號”(或者“記憶體塊號”、“頁幀號” 、“物理塊號” )頁框號從0開始。
    • 使用者程序的地址空間也分為與頁框大小相等的一個個區域,稱為“”或“頁面”。每個頁面也有一個編號,即“頁號”,頁號也是從0開始。
      (注:程序的最後一個頁面可能沒有一個頁框那麼大。因此,頁框不能太大,否則可能產生過大的內部碎片)
    • 作業系統以頁框為單位為各個程序分配記憶體空間。程序的每個頁面分別放入一個頁框(離散)中。也就是說,程序的頁面與記憶體的頁框有一一對應的關係
  • 無外部碎片,會產生內部碎片,如果頁面大小確定,那麼只需要知道邏輯地址就可以自動計算其他資訊,因此頁式管理的地址是一維的。

1.2、地址轉換和計算

  • 如何實現地址的轉換

    • 動態重定向,需要重定向暫存器存放裝入模組(頁)的起始位置

    • 使用者程序的每個頁裝入前的邏輯地址經動態重定向轉為各個實體地址

  • 地址轉換的計算

    • 結論:如果每個頁面大小為\(2^KB\),用二進位制數表示邏輯地址,則末尾K位即為頁內偏移量,其餘部分就是頁號
    • 地址結構包含兩個部分:前一部分為頁號,後- 部分為頁內偏移量W。在上圖所示的例子中,地址長度為32位,其中0~11位為“頁內偏移量”,或稱“頁內地址”; 12~31 位為“頁號”。
    • 如果有K位表示“頁內偏移量”,則說明該系統中一個頁面的大小是\(2^K\)個記憶體單元
    • 如果有M位表示“頁號”,則說明在該系統中一個程序最多允許有\(2^M\)個頁面

1.3、頁表資料結構

  • 資料結構:頁表

    • 一個程序一張頁表

    • 每一頁對應一個頁表項(頁號+塊號)

    • 頁表記錄程序頁面和實際存放記憶體塊之間的對應關係:程序-頁表-記憶體


二、基本地址變換機構

  • 基本地址變換機構可以藉助程序的頁表將邏輯地址轉換為實體地址。

  • 通常會在系統中設定一個頁表暫存器(PTR),存放頁表在記憶體中的起始地址F頁表長度M

    • 程序未執行時,頁表的始址和頁表長度放在程序控制塊(PCB)中
    • 當程序被排程時,作業系統核心會把它們放到頁表暫存器(PTR)中
    • 設頁面大小為L,邏輯地址A到實體地址E的變換過程如下:
      • ①計算頁號P頁內偏移量W (如果用十進位制數手算,則P=A/L, W=A%L)
      • ②比較頁號P和頁表長度M,若\(P>M\),則產生越界中斷,否則繼續執行。(注意: 頁號是從0開始的,而頁表長度至少是1,因此P=M時也會越界)
      • ③頁表中頁號P對應的頁表項地址=頁表起始地址F+頁號P頁表項長度,取出該頁表項內容b,即為記憶體塊號。(頁表長度:總共有幾個頁:頁表項長度:每個頁表項佔多大的儲存空間;頁面大小:一個頁面佔多大的儲存空間)
    • ④計算E=b*L + w,用得到的實體地址E去訪存。( 如果記憶體塊號、頁面偏移量是用二進位制表示的,那麼把二者拼接起來就是最終的實體地址了)

三、具有快表結構的變化機構

3.1、區域性性原理

  • 時間區域性性
    • 如果執行了程式中的某條指令,那麼不久後這條指令很有可能再次執行;
    • 如果某個資料被訪問過,不久之後該資料很可能再存放程式中定次被訪問。(迴圈)
  • 空間區域性性
    • 一旦程式訪問了某個儲存單元,在不久之後,其附近的儲存單元也很有可能被訪問。(因為很多資料在記憶體中都是連續存放的)
    • 如存放變數的儲存單元和計算變數的儲存單元

3.2、快表

  • 快表
    • 又稱聯想暫存器(TLB),是一種訪問速度比記憶體快很多的高速緩衝儲存器(不在記憶體),用來存放當前訪問的若干頁表項,以加速地址變換的過程。與此對應,記憶體中的頁表常稱為慢表。
    • 由於查詢快表的速度比查詢頁表的速度快很多,因此只要快表命中,就可以節省很多時間。因為區域性性原理,一般來說快表的命中率可以達到90%以上。
  • 地址查詢
    • ①CPU給出邏輯地址,由某個硬體算得頁號、頁內偏移量,將頁號與快表中的所有頁號進行比較。
    • 如果找到匹配的頁號(快表+對應儲存單元)
      • 說明要訪問的頁表項在快表中有副本,則直接從中取出該頁對應的記憶體塊號,再將記憶體塊號與頁內偏移量拼接形成實體地址,最後,訪問該實體地址對應的記憶體單元。因此,若快表命中,則訪問某個邏輯地址僅需一次訪存即可。
    • 如果沒有找到匹配的頁號(快表+頁表+對應儲存單元)
      • 需要訪問記憶體中的頁表,找到對應頁表項,得到頁面存放的記憶體塊號,再將記憶體塊號與頁內偏移量拼接形成實體地址,再訪問該實體地址對應的記憶體單元。因此,若快表未命中,則訪問某個邏輯地址需要兩次訪存
      • 注意:在找到頁表項後,應同時將其存入快表,以便後面可能的再次訪問。但若快表已滿,則必須按照一定的演算法對舊的頁表項進行替換
  • 訪問一個邏輯地址的平均耗時T
    • 查詢快表的時間\(t_1\),訪問一次記憶體的時間\(t_2\),快表命中率m
    • 不支援快慢表同時查詢的系統(預設):\(T=(t_1+t_2)*m+(t_1+2*t_2)*(1-m)\)
    • 支援快慢表同時查詢的系統:\(T=(t_1+t_2)*m+2*t_2*(1-m)\)
    • 不支援快表的系統:\(T=2*t_2\)

四、兩級頁表

4.1、單級頁表存在的問題

  • 問題一:頁表必須連續存放,因此當頁表很大時,需要佔用記憶體中很多個連續的頁框
  • 問題二:沒有必要讓整個頁表常駐記憶體(虛擬儲存技術),因為程序在一段時間內可能只需要訪問某幾個特定的頁面。

4.2、兩級頁表

  • 將長長的頁表進行分組,使每個記憶體塊剛好可以放入一一個分組

    • 如圖:32位邏輯儲存空間,頁面地址\(4kB=2^{12}\),佔12位,頁面為20位,共\(2^{20}\)個頁面,每個頁面長度是\(\frac{4KB}{4B}=2^{10}=1024\)
    • \(2^{20}\)的長頁表分組為\(2^{10}\)個長度為\(2^{10}\)的小頁表
  • 為離散分配的頁表(得到的小頁表)再建立一張頁表,稱為頁目錄表,或稱外層頁表,或稱頂層頁表

兩級頁表查詢實體地址

  • ①按照地址結構將邏輯地址拆分成三部分
  • ②從PCB中讀出頁目錄表始址,再根據一級頁號查頁目錄表,找到下一-級頁表在記憶體中的存放位置
  • ③根據二級頁號查表,找到最終想訪問的記憶體塊號
  • ④結合頁內偏移量得到實體地址