怎么做自己的電影網(wǎng)站廣告投放代理商加盟
承接上文我們講完了頁式管理和段式管理,接下來讓我們深入講解一下快表和二級頁表
快表
快表和計算機組成原理講的Cache原理如出一轍。為了減少訪存的次數(shù),OS在訪問頁面的時候創(chuàng)建了快表(Translation Lookaside Buffer ,簡稱TLB),包含最近使用過的頁表表項,避免了反復查詢處于內(nèi)存中的頁表。
如圖所示,OS會先根據(jù)TLB是否命中決定是否訪問在內(nèi)存中的頁表,如果命中就直接拿著快表表項組合已有的偏移量構(gòu)成物理地址。反之,OS會繼續(xù)訪問頁表找到對應的頁表項,得到物理地址,然后將該頁表項加入到快表中以備下次查詢。如果快表和頁表都沒有找到,就會引發(fā)缺頁中斷,有關(guān)內(nèi)容我們下一章節(jié)會詳細敘述。
二級頁表
首先,我們先思考一個問題,假設的是32位邏輯地址,頁面大小為4kb,并且假設頁表項大小為4B,那么一個進程最多有多少頁,需要分配的頁框占據(jù)多少空間?
頁面大小是4KB,也就是需要12位表示業(yè)內(nèi)偏移量,總共有32位邏輯地址,剩余20位組成頁號,也就是一個進程最多有220個頁,每個頁對應一個頁號,而一個頁號對應一個頁表項,則至少需要220 *4 = 2^22個字節(jié)的空間存放,即4GB的空間。
實際上,我們普通電腦的內(nèi)存不過8GB、16GB,如果光是一個進程就干掉4GB,那顯然是捉襟見肘的。同時,由于一個進程的頁面是連續(xù)存放的,那么一個進程就要連續(xù)分配4GB/4Kb = 1024個頁面,顯然一次性給一個進程分配這么多頁面也是不合理的。
實際上,進程不會一次訪問所有的頁面,而是只會訪問特定的頁面,所以我們不需要一次性分配所有的頁面。為了解決進程頁面必須連續(xù)存放的問題,我們采用解決進程在內(nèi)存中連續(xù)存放的思路,使用二級頁表,把頁面存放離散化。
如圖所示,我們已知頁表是一種索引結(jié)構(gòu),進程有2^20個頁也就是有0~1048575的頁號,我們在此基礎上分組,每1024個為一組,總共就是1024組,然后在每一組中的頁號對1024取余,統(tǒng)一成0~1023。然后再在這1024組上建一層索引,也就構(gòu)成了我們的頁目錄。
奇妙的是,按照1024劃分,每一個二級頁表剛好對應一個頁框,而頁目錄表也是一個頁框(1024*4B = 4KB)。也就是說,我們將原先連續(xù)的頁面按照頁框大小分組,然后在分組上建索引得到了一個新的頁表——頁目錄表。
現(xiàn)在,我們查詢就要分為兩次:先查頁目錄表,對應的內(nèi)存塊號是存二級頁表的內(nèi)存位置,然后再查二級頁表,二級頁表中的內(nèi)存塊號就是實際訪存的內(nèi)存塊號了。
與之對應,二級頁表的邏輯地址結(jié)構(gòu)部分,原先的前20位頁號就要拆成一級頁號和二級頁號。
其中,查頁目錄表就是查一級頁號對應的內(nèi)存塊號,然后根據(jù)該內(nèi)存塊號找到內(nèi)存中對應的二級頁表,然后根據(jù)二級頁號查二級頁表找到對應的內(nèi)存塊號,就是實際訪存的內(nèi)存塊。
而一級頁號總共是10位,因為總共有1024個二級頁表,二級頁號也有10位,因為每個二級頁表有1024個頁表項。
建立多級頁表本質(zhì)上就是建立多重索引。二級頁表就是借助二重索引的迭代查詢來實現(xiàn)對于一重索引的離散化。
舉一個更具體的例子
假設我們的32位的邏輯地址如圖所示,根據(jù)10+10+12的原則,一級頁號就是0,二級頁號就是1,頁內(nèi)偏移就是1023.
我們先在頁目錄表中查一級頁號對應的內(nèi)存塊號3,再到與之對應的二級頁表中查詢二級頁號1,得知內(nèi)存塊號4是最終需要訪問的內(nèi)存塊,結(jié)合頁面大小4KB,最終的訪問地址是4*4K+1023 = 17407。
幾個細節(jié)
一般來說,各級頁表大小不能超過一個頁面,不然就又會出現(xiàn)頁面連續(xù)存放的問題。
所以上述例子中,每級頁表最多2^10個,占用10位,40位邏輯地址就至少需要三級頁表,即(40-12)/ 3 向上取整。
假設不考慮TLB,訪存次數(shù)根據(jù)頁表級數(shù)N而定,因為頁表也是存儲在內(nèi)存中的,所以查詢每一級頁表都需要訪存,最終訪存次數(shù)是N+1。
至于一開始提到的進程自身頁表存儲量最高可達4GB,現(xiàn)有的內(nèi)存容量無法滿足需求的解決方案,我們將會在下一章的虛擬存儲中提及。