以下是我在看《現代作業系統》時的知識的記錄:
加速分頁過程:
1、32位虛擬位址,需要更大的頁面和頁表
由於頁面和頁表是相對應的;因此計算機為32位位址空間,而頁面大小為4kb,則需要頁面個數
此時頁表就得有100萬條表項,並且每個程序都需要自己的頁表,從而占用的儲存空間也很大;由於在訪問頁表時需要訪問記憶體,從而在啟動乙個程序時,作業系統把儲存在記憶體中的程序頁表的副本載入到暫存器中,在程序執行過程中,不必再為頁表而訪問記憶體。這個方法的優勢是簡單並且在對映過程中不需要訪問記憶體;
2、為什麼要加速分頁機制
現在計算機基本都採用分頁機制,假設一條1位元組指令要把乙個暫存器中的資料複製到另乙個暫存器。在不分頁的情況下,這條指令首先通過在主訪問指令,從而訪問記憶體一次,有了分頁機制後,會因為要多次訪問頁表而引起更多次記憶體訪問。由於執行速度通常被cpu從記憶體中取指令和資料的速度所限制,所以兩次訪問記憶體才能實現一次記憶體訪問會使效能下降一半。
優化辦法:
大所屬程式總是對少量的頁面進行訪問,從而設定乙個小型裝置,將虛擬位址直接對映到實體地址,而不必再訪問頁表,這種裝置稱為轉換檢測緩衝區(tlb),它通常包含少量的表項;(它通常在mmu中)
tlb是如何工作的:
這裡介紹多級頁表
為什麼要引入多級頁表
避免把全部頁表一直儲存在記憶體中,特別是那些從不需要的頁表就不應該保留。比如乙個需要12mb的程序,底端是4mb程式正文,後面是4mb資料,頂端是4mb堆疊,在資料頂端上方和堆疊之間是大量根本沒有使用的空閒區。
從圖中可以看出,這裡是乙個二級頁表,在左邊是頂級頁表,它有1024個表項,對應於10位的pt1域,然後頂級頁表的表項0指向正文的頁表,表項1指向資料的頁表,表項1023指向堆疊的頁表,其他的表項未用(用陰影表示),pt2域作為指向二級頁表的索引,以便找到該虛擬頁面的對應頁框號。offset代表的是偏移量。為了結合頁框號形成實體地址。
為什麼說針對大記憶體的頁表用分級頁表會好呢?
雖然由於32位的虛擬位址空間需要超過100萬個頁面,但是如果不分頁的話,則乙個頁面就需要乙個頁表,因此在記憶體中將會有同樣多的頁表,甚至在進行上下文的切換時,需要在記憶體中拷貝這麼大的頁表和頁面,但是就像剛才描述的,乙個12mb記憶體的程序,在資料頂端上方和堆疊之間是大量根本沒有使用的空閒區。因此這些都是不使用,從而浪費了大量的資源。因此採用在頂級頁表中將陰影部分(不使用的部分)在或不在位都設為0,當訪問他們時,強制產生乙個缺頁中斷。並採取適當行為。
從而頁表的大小就變為頂級頁表+正文段+資料段+堆疊段,只需要四個頁表,從而變的小的很多;
但由上圖a中可以看出,其可以提供
作業系統 頁儲存
為了能知道每個程序的每個頁面在記憶體中的存放位置,作業系統需要為每個程序建立一張頁表。如上圖所示頁表,記錄了頁面在記憶體中對應的記憶體塊號,頁表一般存放在記憶體中。在配置了頁表後,程序執行時,通過查詢該錶,即可找到每頁在記憶體中的記憶體塊號。可見頁表作用是實現從頁號到記憶體塊號的位址對映。這就是頁儲...
作業系統 頁式儲存方式,頁,頁表,頁表項
作業系統和計算機組成原理裡都講到記憶體管理的頁式管理,但是本人以及很多初次學習分頁的時候,都會迷茫頁表大小和頁表項大小之間的關係,本人仔細分析了後寫了這篇blog,僅當學習交流,個人理解之用,如果有錯或者分析不夠嚴謹,歡迎指正。按字 圖結合起來分析,相信還是比較容易看懂。頁 將程序劃分的塊,對應的大...
Linux作業系統 自動補全加速
向大個程式猿致敬 supertab用於簡化補全功能。安裝方法 將外掛程式放到 vim plugin資料夾中。使用下述命令檢視幫助文件 supertabhelp 在 vimrc檔案加入以下兩行 let g supertabretaincompletiontype 2 let g supertabdef...