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