加速頁表過程管理

虛擬內存的思想:每個進程都擁有自己的虛擬地址空間,這個空間被分割成多個塊,每個塊被稱爲一個頁或者頁面,每一頁有連續的地址範圍。這些也被映射到物理內存,但並不是所有的頁面都在內存中,才能運行程序的,當程序引用到一部分在物理內存中地址空間時,有硬件執行必要的映射,當程序引用到一部分不在物理內存中的地址空間的時候,由操作系統負責將缺失的部分裝入到內存並重新執行失敗的指令。

加速分頁過程
在任何分頁系統中,需要考慮以下兩個問題:
1)虛擬地址到物理地址的映射必須非常快。
2)如果虛擬地址空間很大,頁表也會非常大。
第一個問題是由於每次訪問內存的,都需要進行虛擬地址到物理地址的映射。
所有的指令最終都來自於內存,而且很多指令也會訪問內存中的操作數,因此,每條指令進行一兩次或者更多頁表訪問是必要的。

轉換檢測緩衝區:
微計算機設置一個小型的設備,將虛擬地址直接映射到物理地址,而不必訪問頁表,這種設備被稱爲轉換檢測緩衝區(TLB),有時也成爲相聯存儲器,他通常在MMU中,包含少量的表項,最多不超過64個,每個表項記錄了一個頁面相關信息,包括虛擬頁號,頁面的修改位,保護碼,和所對應的物理頁框,除了虛擬頁號,這些域與頁表中的域一一對應。
TLB是如何讓工作的?
將一個虛擬地址放入MMU進行轉換的時候,硬件首先通過將該虛擬頁號與TLB中所有表項同時進行匹配,判斷虛擬頁面是否在其中,要是在並且進行訪問位並不太違反保護位,則將頁框號直接從TLB中取出。而不必訪問頁表,如果虛擬頁面號確實在TLB中,但是指令試圖在一個只讀頁面上進行寫操作,則會產生一個保護錯誤,就像對頁表進行非法訪問一樣。

當虛擬頁號不在TLB中的時候,如果MMU檢測到內有有效位匹配的時候就會進行正常的也表查詢,接着從TLB中淘汰一個表項,然後用找到的頁表項代替他,這樣,如果這一頁表很快再次被訪問,第二次訪問TLB時自然將會命中,而不是不命中,當一個表項被清除出TLB時,將修改複製到內存中的頁表項,而除了訪問位,其他值不變。當頁表項中從頁表裝入到TLB中時,所有的值就都來自內存。

軟件TLB管理?
到目前爲止,已經開發了多種不同的策略來改善使用軟件TLB管理機器性能。一種是有時候操作系統能用“直覺”指出哪些頁面下一步可能會被用到,並預先裝載到TLB中,例如:當一個進程發送一條消息給同一臺機器上的服務器進程,很可能服務器進程將不得不立即運行,瞭解到這一點,當執行send的時候,系統也可能找到服務器進程代碼頁,數據頁以及堆棧頁。並有可能導致TLB失效前把他們裝載到TLB中。
當使用軟件TLB管理時,一個基本的要求是要理解兩種不同的TLB失效區別在哪裏,當一個頁面訪問在內存中,而不在TLB的時候,將產生軟失效,那此時所要做的就是更新一下TLB,不需要產生磁盤IO,當頁面本身不在磁盤中的時候,將產生硬失效,此時需要一次磁盤存取以裝入該頁面,這個過程大概需要幾毫秒。硬失效的處理時間往往是軟失效的百萬倍。

針對大內存的頁面?
多級頁表
32位的虛擬地址被劃分成10位的PT1域、10位的PT2域,12位的Offset域,因爲偏移量是12位,所以頁面長度是4KB,共有2的20次方頁面。
引入多級頁表的原因是:避免將所有頁表一直保存在內存中,特別是不需要的頁表就不應該保留。

倒排頁表:
倒排頁表是解決64位機器虛擬內存的組織問題的一種新技術。
在設計中,每一個頁框有一個表項,而不是每一個虛擬頁面有一個表項,例如:對於64位虛擬地址,4KB的頁面,1GB的RAM,一個倒排頁表只需要記錄262144個頁表項,表項記錄那一個(進程,虛擬頁面)對定位於該頁框,雖然倒排頁表節省了大量的空間,但它還有嚴重的不足,從虛擬地址到物理地址的轉換變的困難,當進程n訪問虛擬頁面的p時候,硬件不載通過把p當做指向頁表的一個索引來查找物理頁框,他必須查找整個倒排頁表,來查找表項(n,p),此外,該搜索的必須對每一個內存訪問操作都要執行一次,而不僅僅是缺頁中斷中執行,每一次訪問操作都要查找256k的表。

爲了提高查找速率,使用TLB,如果TLB能夠記錄所有頻繁使用的頁面,地址轉換就可能變的像通常的頁表一樣快,但是,當發生TLB失效的時候,需要軟件搜索整個倒排頁表,一個可行的實現該搜索的方法是建立一張散列表,用虛擬內存散列,當前所有在內存中的具有相同的散列值的虛擬頁面被連接在一起,如果散列表中的槽數和機器中物理頁面一樣多的話,散列表中的衝突鏈的平均長度將會是1個表項,這將會大大提高映射速度。一旦頁框號被找到,新的(虛擬頁號,物理頁框)對就會被轉載到TLB。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章