深入理解計算機系統--第九章虛擬儲存器
9.虛擬儲存器
為了更加有效地管理儲存器且少出錯,現代系統提供了對主存的抽象概念,叫做虛擬儲存器(VM)
。
虛擬儲存器
是硬體異常,硬體地址翻譯,主存,磁碟檔案和核心軟體的完美互動。- 為每個程序提供一個大的,一致的和 私有的地址空間。
- 提供了3個重要能力。
- 將主存看成磁碟地址空間的快取記憶體。
- 只保留了活動區域,並根據需要在磁碟和主存間來回傳送資料,高效使用主存。
- 為每個程序提供一致的地址空間
- 簡化儲存器管理
- 保護了每個程序的地址空間不被其他程序破壞。
- 將主存看成磁碟地址空間的快取記憶體。
- 程式設計師為什麼要理解它?
虛擬儲存器
是中心的。- 遍佈在計算機系統所有層次,硬體異常,彙編器,聯結器,載入器,共享物件,檔案和程序中扮演重要角色。
虛擬儲存器
是強大的。- 可以建立和銷燬儲存器片(chunk)
- 將儲存器片對映到磁碟檔案的某個部分。
- 其他程序共享儲存器。
- 例子
- 能讀寫儲存器位置來修改磁碟檔案內容。
- 載入檔案到儲存器不需要顯式的拷貝。
虛擬儲存器
是危險的- 引用變數,間接引用指正,呼叫
malloc
動態分配程式,就會和虛擬儲存器互動。 - 如果使用不當,將遇到複雜危險的與儲存器有關的錯誤。
- 例子
- 一個帶有錯誤指標的程式可以立即崩潰於段錯誤或者保護錯誤。
- 執行完成,卻不產生正確結果。
- 引用變數,間接引用指正,呼叫
- 本章從兩個角度分析。
虛擬儲存器
如何工作。- 應用程式如何使用和管理
虛擬儲存器
。
9.1 物理與虛擬定址
-
實體地址(Physical Address,PA)
實體地址
. -
CPU訪問儲存器的最自然的方式使用
實體地址
,這種方式稱為物理定址
。
- 早期的PC,數字訊號處理器,嵌入式微控制器以及Cray超級計算機使用物理定址
。 -
現代處理器使用的是
虛擬定址(virtual addressing)
的定址形式。- CPU通過生成一個
虛擬地址(Virtual address,VA)
來訪問主存。- 將
虛擬地址
轉換為實體地址
叫做地址翻譯(address translation)
。
- 將
地址翻譯
也需要CPU硬體和作業系統之間的緊密結合。- CPU晶片上有叫做
儲存器管理單元(Memory Management Unit,MMU)
- 利用儲存在主存中的查詢表來動態翻譯虛擬地址。
- 查詢表由作業系統管理。
- CPU晶片上有叫做
- CPU通過生成一個
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
來分配
- 快取的:當前快取在物理儲存器的已分配頁。
- 未快取的:沒有快取在物理頁面儲存器中的已分配頁。
- 未分配的:VM系統還未分配(或者建立)的頁。未分配的
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詳細講解。
-
簡化共享
- 獨立地址空間為作業系統提供了一個管理使用者程序和作業系統自身之間的一致
共享
機制. - 例子
- 操作相同的作業系統核心程式碼
- 獨立地址空間為作業系統提供了一個管理使用者程序和作業系統自身之間的一致