1. 程式人生 > >深入理解計算機系統--第九章虛擬儲存器

深入理解計算機系統--第九章虛擬儲存器

9.虛擬儲存器

為了更加有效地管理儲存器且少出錯,現代系統提供了對主存的抽象概念,叫做虛擬儲存器(VM)
  • 虛擬儲存器是硬體異常,硬體地址翻譯,主存,磁碟檔案和核心軟體的完美互動。
  • 為每個程序提供一個大的一致的和 私有的地址空間。
  • 提供了3個重要能力。
    • 將主存看成磁碟地址空間的快取記憶體
      • 只保留了活動區域,並根據需要在磁碟和主存間來回傳送資料,高效使用主存。
    • 為每個程序提供一致的地址空間
      • 簡化儲存器管理
    • 保護了每個程序的地址空間不被其他程序破壞。
  • 程式設計師為什麼要理解它?
    • 虛擬儲存器是中心的。
      • 遍佈在計算機系統所有層次,硬體異常,彙編器,聯結器,載入器,共享物件,檔案和程序中扮演重要角色。
    • 虛擬儲存器是強大的。
      • 可以建立和銷燬儲存器片(chunk)
      • 將儲存器片對映到磁碟檔案的某個部分。
      • 其他程序共享儲存器。
      • 例子
        • 能讀寫儲存器位置來修改磁碟檔案內容。
        • 載入檔案到儲存器不需要顯式的拷貝。
    • 虛擬儲存器是危險的
      • 引用變數,間接引用指正,呼叫malloc動態分配程式,就會和虛擬儲存器互動。
      • 如果使用不當,將遇到複雜危險的與儲存器有關的錯誤。
      • 例子
        • 一個帶有錯誤指標的程式可以立即崩潰於段錯誤或者保護錯誤
        • 執行完成,卻不產生正確結果。
  • 本章從兩個角度分析。
    • 虛擬儲存器如何工作。
    • 應用程式如何使用和管理虛擬儲存器

9.1 物理與虛擬定址

  • 實體地址(Physical Address,PA)

    :計算機系統的主存被組織為M個連續的位元組大小的單元組成的陣列。每個位元組的地址叫實體地址.

  • CPU訪問儲存器的最自然的方式使用實體地址,這種方式稱為物理定址
    - 早期的PC,數字訊號處理器,嵌入式微控制器以及Cray超級計算機使用物理定址

  • 現代處理器使用的是虛擬定址(virtual addressing)的定址形式。

    • CPU通過生成一個虛擬地址(Virtual address,VA)來訪問主存。
      • 虛擬地址轉換為實體地址叫做地址翻譯(address translation)
    • 地址翻譯也需要CPU硬體和作業系統之間的緊密結合。
      • CPU晶片上有叫做儲存器管理單元(Memory Management Unit,MMU)
        的專用硬體。
        • 利用儲存在主存中的查詢表來動態翻譯虛擬地址。
        • 查詢表由作業系統管理。

9.2 地址空間

地址空間(address space)是一個非負整數地址的有序集合。

  • 如果地址空間中整數是連續的,我們說它是線性地址空間(linear address space)
    • 為了簡化討論,我們總是假設使用線性地址空間。
  • 在一個帶虛擬儲存器的系統中,CPU從一個有N=2^n個地址的地址空間中生成虛擬地址,這個地址空間稱為虛擬地址空間(virtual address space)

  • 一個地址空間大小是由表示最大地址所需要的位數來描述的。
    • N=2^n個地址的虛擬地址空間叫做n位地址空間。
    • 現在作業系統支援32位64位
  • 一個系統還有實體地址空間,它與系統中物理儲存器的M=2^m(假設為2的冪)個位元組相對應。

地址空間的概念很重要,因為它區分了資料物件(位元組)和 它們的屬性(地址)

  • 每個位元組(資料物件)一般有多個 獨立的地址(屬性)。每個地址都選自不同的地址空間。
    • 比如一般來說。
      • 位元組 有一個在虛擬地址空間虛擬地址
      • 還有一個在實體地址空間的 實體地址
      • 兩個地址都能訪問到這個位元組
    • 類似現實世界的門牌號, 和經緯度

9.3 虛擬儲存器作為快取的工具

感悟

在講述這一小章之前,必須交代一下我對虛擬儲存器概念的存疑

原本我以為虛擬儲存器=虛擬記憶體

以下是虛擬記憶體的定義

虛擬記憶體是計算機系統記憶體管理的一種技術。它使得應用程式認為它擁有連續的可用的記憶體(一個連續完整的地址空間),而實際上,它通常是被分隔成多個物理記憶體碎片,還有部分暫時儲存在外部磁碟儲存器上,在需要時進行資料交換

而在下面的定義我們可以看到CSAPP中認為虛擬儲存器是存放在磁碟上的。

在此,我們姑且當做兩者是不同的東西,以後有更深刻的理解,再思考。

虛擬儲存器(VM)被組織為一個存放在磁碟上的N個連續位元組大小的單元組成的陣列。

  • 每個位元組都有一個唯一的虛擬地址,這個虛擬地址作為到陣列的索引。
  • 磁碟上陣列的內容被快取到主存中。
    • 同儲存器層次結構其他快取一樣,磁碟上的資料被分割稱
      • 這些作為磁碟和主存之間的傳輸單元。
      • 虛擬頁(Virtual Page,VP)就是這個
        • 每個虛擬頁大小為P=2^p位元組。
    • 物理儲存器被分割為物理頁,大小也為P位元組
      • 也被稱為頁幀(page frame)
  • 任何時候,虛擬頁的集合都被分為3個不相交的子集
    • 未分配的:VM系統還未分配(或者建立)的頁。未分配的沒有任何資料與之相關聯。
      • 不佔用磁碟空間
      • 通過malloc來分配
    • 快取的:當前快取在物理儲存器的已分配頁。
    • 未快取的:沒有快取在物理頁面儲存器中的已分配頁。

9.3.1 DRAM快取的組織結構

DRAM表示虛擬儲存器系統的快取,在主存中快取虛擬頁,有兩個特點。

  • DRAM快取不命中處罰十分嚴重。
    • 因為磁碟DRAM慢100000多倍。
  • 訪問一位元組開銷
    • :從一個磁碟的一個扇區讀取第一個位元組的時間開銷要比從該扇區中讀連續的位元組慢大約100000倍

DRAM快取的組織結構由這種巨大的不命中開銷驅動。因此有以下特點。
(有些地方不是特別懂,之後看完第六章應該會好點)

  • 虛擬頁往往很大。
    • 4KB~2MB
    • 訪問一位元組開銷的原因才要這麼大。
  • DRAM快取是全相聯
    • 也就是: 任何虛擬頁都能放在任何物理頁中。
    • 原因在於大的不命中懲罰
  • 更精密的替換演算法
    • 替換錯了虛擬頁的懲罰很高。
  • DRAM快取總是寫回
    • 因為對磁碟的訪問時間很長
    • 而不用直寫

9.3.2 頁表

判斷命中替換又多種軟硬體聯合提供。

  • 作業系統軟體,MMU中的地址翻譯硬體和頁表(page table)
    • 頁表是存放在物理儲存器的資料結構。
      • 頁表將虛擬頁對映到物理頁。
      • 地址翻譯硬體將虛擬地址轉換為實體地址都會讀取頁表
    • 作業系統負責維護頁表的內容,以及磁碟及DRAM之間來回傳送頁。

  • 頁表就是一個頁表條目(Page Table Entry,PTE)的陣列.
    • 虛擬地址空間 中每個頁在頁表的固定偏移量處都有一個PTE.
    • 每個PTE由一個有效位n位地址欄位
      • 有效位表明虛擬頁是否被快取。
        • 如果有效位存在,那麼地址欄位指向對應的物理儲存器。
        • 如果有效位不存在。
          • 地址欄位要麼為NULL
          • 要麼指向虛擬頁在磁碟所在的位置。

9.3.3 頁命中

  • 一個頁命中的過程
  • 一個虛擬地址轉換為實體地址的過程。

9.3.4 缺頁

在虛擬儲存器的習慣說法中,DRAM快取不命中稱為缺頁

處理過程如下:

  • 讀取虛擬地址所指向的PT
  • 讀取PTE有效位,發現未被快取,觸發缺頁異常
  • 呼叫缺頁異常處理程式
    • 選擇犧牲頁。
    • 如果犧牲頁發生了改變,將其拷貝回磁碟(因為是寫回)
    • 需要讀取的頁代替了犧牲頁的位置。
    • 結果:犧牲也不被快取,需要讀取的頁被快取。
  • 中斷結束,重新執行最開始的指令。
  • DRAM中讀取成功。

虛擬儲存器是20世紀60年代發明的,因此即使與SRAM快取使用了不同的術語。

  • 被稱為
  • 磁碟DRAM之間傳送的活動叫做交換(swapping)或者頁面排程(paging)
  • 不命中發生時,才換入頁面,這種策略叫做按需頁面排程(demand paging)
    • 現代系統基本都是用這個。

9.3.5 分配頁面

比如某個頁面所指向地址為NULL,將這個地址指向磁碟某處,那麼這就叫分配頁面

此時虛擬頁未分配狀態 變為 未快取

9.3.6 又是區域性性拯救了我們

虛擬儲存器工作的相當好,主要歸功於老朋友區域性性(locality)

儘管從頭到尾的活動頁面數量大於物理儲存器大小。

但是在區域性內,程式往往在一個較小的活動頁面集合工作

  • 這個集合叫做工作集(working set)或者叫常駐集(resident set)
    • 初始載入開銷比較大。
  • 程式有良好的時間區域性性虛擬儲存器都工作的相當好。
  • 如果程式實在很爛,或者物理空間很小,工作集大於物理儲存器大小。這種狀態叫顛簸(thrashing).
    • 這時,頁面不斷換進換出。效能十分低。

統計缺頁次數

可以利用Unix的getrusage函式檢測缺頁數量。

9.4 虛擬儲存器作為儲存器的管理工具

實際上,作業系統為每個程序提供一個獨立的頁表

因此,VM簡化了連結載入,程式碼資料共享,以及應用程式的儲存器分配。

  • 簡化連結
    • 獨立的空間地址意味著每個程序的儲存器映像使用相同的格式。
      • 文字節總是從0x08048000(32位)處或0x400000(64位)處開始。
      • 然後是資料,bss節,棧。
    • 一致性極大簡化了連結器的設計和實現。
  • 簡化載入

    • 載入器可以從不實際拷貝任何資料從磁碟到儲存器。
    • 基本都是虛擬儲存系統完成。

      將一組連續的虛擬頁對映到任意一個檔案中的任意位置的表示法稱作儲存器對映。Unix提供一個稱為mmap的系統呼叫,允許程式自己做儲存器對映。在9.8詳細講解。

  • 簡化共享

    • 獨立地址空間為作業系統提供了一個管理使用者程序和作業系統自身之間的一致共享機制.
    • 例子
      • 操作相同的作業系統核心程式碼