- 虛擬存儲器(VM)
- 主存也可以成爲磁盤的cache,這項技術叫做虛擬存儲器
- 每個程序有自己獨立的內存空間
- 主存只要存放程序中活躍的那一部分即可,這也是局部性原理
- VM和cache的原理是一樣的,不過VM中塊被叫做頁
- 採用全相聯的方式組織
- 降低了缺失率
- 可以使用複雜的替換機制優化
- 由於使用了頁表,不需要進行查找
- 和直接映射組織法很像,主要區別是多了一個額外的頁表,同時可以在任意位置替換,而不是一一對應
- 構造動機
- 允許在多個程序之間同時安全地共享存儲器
- 消除有限的主存容量對程序設計的限制
- 虛擬地址
- 虛擬地址可以比物理地址長
- 虛擬地址由處理器產生,再由頁錶轉換成物理地址(即主存中的地址)
- 連續的虛擬地址可以被映射到不連續的物理地址
- 這種重定位允許我們將程序加載到主存的任意位置
- 多個虛擬地址可以映射到同一個物理地址
- 這使得不同的程序可以共享一部分代碼
- 虛擬地址分割爲虛擬頁號和頁內偏移
- 物理頁和虛擬頁一樣大
- 虛擬頁號轉換爲物理頁號,偏移不變
-
頁表
-
存放在主存中
-
以虛擬頁號爲索引,存放物理頁號
-
每個程序都有私有的頁表
- 每個程序都有一個頁表寄存器指向相對的頁表開頭
- 只保存寄存器,並不保存整個頁表
-
更新頁表由操作系統負責
-
頁表不需要tag,因爲包含了每個可能的虛擬頁的映射
-
減少頁表大小
- 使用多級頁表,未被使用的虛擬內存段在第二級即以上不分配頁表項
- 將未使用的頁表放入磁盤中
-
-
缺頁
- 操作系統在創建一個進程(程序)的時候會在磁盤上單獨分配一部分空間來儲存物理頁
- 這個區域被稱作交換區
- 同時會創建一個數據結構(新頁表)來儲蓄物理頁到磁盤頁的映射,這個結構可能是頁表的一部分,也可能單獨存放在主存上
- 缺頁後被換出的物理頁被寫入交換區
- 由於寫的時間很長,因此最好採用回寫法
- 由於對於磁盤訪問時間傳輸數據的時間要少很多,因此把整個頁通過寫回法放入磁盤中更好
- 操作系統在創建一個進程(程序)的時候會在磁盤上單獨分配一部分空間來儲存物理頁
-
快表(TLB)
- 由於頁表儲存在主存中,每次訪問虛擬地址需要訪問兩次主存
- 第一次獲得物理地址
- 第二次獲得數據
- 對於頁項的使用也具有局部性
- 通過一個特殊的cache(TLB)存儲最近使用過的頁表項
- 全相聯組織
- 由於頁表儲存在主存中,每次訪問虛擬地址需要訪問兩次主存
-
結合主存的cache和頁表的cache(TLB)
- cache採用物理地址
- 先要訪問TLB再訪問cache,如下1圖
- cache採用虛擬地址
- 直接通過虛擬地址訪問cache,當cache缺失時轉成物理地址,如下2圖
- 問題是可能不同程序將不同的虛擬地址映射到同一個物理地址,於是同一個物理地址中的數據可能存在於cache中不同的位置,兩個程序不知道相互間的數據變化
- 如果頁表發生缺頁,那麼cache不可能命中.如下3圖
- cache採用物理地址
- 虛擬存儲器中的保護
- 用戶進程不能更改自己的頁表,操作系統負責修改頁表。
- 頁表放在保護地址空間
- 當從進程A切換到進程B時,不僅需要切換頁表寄存器指向,還要清空TLB中屬於A的表項
- 或者可以通過增加一個進程標識符來避免清空