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