在分頁方式下,每個進程分配一個頁表會有什么問題?
不賣關子了,每個進程分配一個頁表會有空間上的缺陷,因為操作系統上可以運行非常多的進程,那不就意味著頁表數量非常多!
1B(Byte 字節)=8bit, 1KB (Kilobyte 千字節)=1024B, 1MB (Megabyte 兆字節簡稱“兆”)=1024KB, 1GB (Gigabyte 吉字節 又稱“千兆”)=1024MB
以32 位的環境為例,虛擬地址空間范圍共有 4GB,假設一個頁的大小是 4KB(2^12),那么就需要大約 100 萬 (2^20)個頁,每個「頁表項」需要 4 個字節大小來存儲,那么整個 4GB 空間范圍的映射就要有 4MB 的內存來存儲頁表。
4MB看起來不大,但是數量上來了就很恐怖了,假設 100 個進程的話,就需要 400MB 的內存來存儲頁表,這是非常大的內存了,更別說 64位的環境了。
為了解決空間上的問題,在對分頁方式的基礎上,進行優化,出現了多級頁表方式
多級頁表
在前面我們知道了,分頁方式在32位環境下,以每頁4KB來計算,一共有100萬頁,「頁表項」需要 4
個字節大小來存儲,一個頁表包含100萬個「頁表項」,那么每個進程的頁表需要占用4MB大小,多級頁表要如何解決這種問題呢?
在頁表的基礎上做一次二級分頁,把100萬「頁表項」分為一級頁表「1024個頁表項」,「一級頁表項」下又關聯二級頁表「1024個頁表項」,這樣一級頁表的1024個頁表項就覆蓋到了4GB的空間范圍映射,并且二級頁表按需加載,這樣頁表占用的空間就大大降低。
做個簡單的計算,假設只有 20% 的一級頁表項被用到了,那么頁表占用的內存空間就只有 4KB(一級頁表) + 20% * 4MB(二級頁表)=0.804MB,這對比單級頁表的 4MB 是不是一個巨大的節約?
接著思考,在二級的基礎上是不是又可以繼續分級呢,能分二級,必然也能分三級、四級,在64位操作系統是做了四級分頁,分為了四個目錄,分別是
全局頁目錄項
上層頁目錄項
中間頁目錄項
頁表項
TBL
多級頁表雖然解決了空間上的問題,但是我們發現這種方式需要走多道轉換才能找到映射的物理內存地址,經過的多道轉換造成了時間上的開銷。
程序是局部性的,即在一段時間內,整個程序的執行僅限于程序的某一部分。相應的,執行所訪問的存儲空間也局限于某個內存區域。
操作系統就利用這一特性,把最多使用的幾個頁表項放到TBL緩存, CPU 在尋址時,會先查 TLB,如果沒找到,才會繼續查常規的頁表,TLB的命中率其實很高的,因為程序最常訪問的頁就那么幾個。
-
內存
+關注
關注
8文章
3043瀏覽量
74194 -
操作系統
+關注
關注
37文章
6868瀏覽量
123548
發布評論請先 登錄
相關推薦
評論