標籤:
一 頁面與頁表1 頁面 分頁儲存管理是將作業的邏輯地址劃分為一系列同等大小的部分,稱為頁。並為各頁加以編號,每個作業的頁的編號都是從0開始的。與之類似,把可用的實體記憶體也劃分為同樣大小的連續的部分,稱為塊或頁框。同樣為塊也進行標號,從0#開始。在為進程分配記憶體空間時,以頁為單位,每個記憶體中的塊存放一頁使用者作業。只要記憶體中有足夠多的塊,這些塊可以相鄰也可以不相鄰,就可以存放整個作業了。 頁面的大小對於記憶體利用和系統開銷來說非常重要,頁面太大,在作業的最後一頁必然會剩餘較大不能利用的空間--內片段。頁面太小,雖然可以減小內片段的大小,但是一個作業的頁太多,會使得作業頁表太長而佔用記憶體,同時系統頻繁地進行頁面轉化,加重系統開銷。因此,頁面的大小應該適中,通常為512B - 8KB,windows系統的頁面大小為4KB。
2 地址結構 分頁系統中的地址結構由兩部分組成,頁號和頁內位移量。可以解釋為一個二元組(p,w),其中p是頁號,w是頁面p中的位移量或者相對於p頁開始的位置。(a) 中的地址長度為32位,其中0 - 9位為頁內位移量,每頁的大小為2的10次方 = 1k;10 - 31位為頁號,共計2的22次方 = 4M頁。在圖(b)中,地址長度同樣為32位,其中0 - 11位頁內位移量,每頁的大小為2的12次方 = 4k;12 - 31位為頁號,共計2的20次方 = 1M頁,由此可知不同的系統頁的大小是不一樣的。
(a)頁面大小為1KB(2的10次方)
(b)頁面大小為4KB(2的12次方) 對於特定的機器來說,其地址結構是一定的。若給定邏輯地址A,頁面大小為L,則頁號p和頁內位移量w分別為p = INT [A/L] w = [A]MODL例如:系統的頁面大小事1K,設A = 3096,則由上式得出 p =3,w =24。
3 頁表 在分頁儲存管理中,頁的存放可以是連續的,也可以是不連續的,這就增加了邏輯地址到物理地址轉換的難度。如何在記憶體中找到頁所對應的物理塊是地址裝換的關鍵。為此,系統為每個進程建立了一個頁表。在進程邏輯地址空間中的每一頁,依次在頁表中有一個表項,記錄了該頁對應的物理塊號。如所示
在配置了頁表之後,通過尋找頁表就可以很容易地找到該頁在記憶體中的位置。頁表具有邏輯地址到物理地址映射的作用。 對於頁的保護通常設定一個存取控制欄位。當這個欄位佔一位時,用於規定該頁中的內容允許寫還是讀;如果存取控制欄位佔兩位,那麼它可以表示存取控製為讀寫、唯讀和只運行三種。當進程寫一個唯讀頁時,系統就會通過中斷來報錯。
二 地址變換結構 為了實現分頁管理邏輯地址到物理地址的轉換,系統中必須設定地址變換機構,用來實現地址映射。由於頁的大小和塊的大小是一樣的,當把進程的某一頁放入記憶體時,該頁內地址的頁位移量和塊內位移量是一致的,因此地址轉換時就不必考慮位移量,只考慮邏輯頁號和實際物理號的對應即可。頁表中存放的就是頁號和其對應的物理塊號,所以地址變換就要藉助頁表來完成。
1 基本地址變換 地址變換的第一步就是檢索頁表。為了實現快速的檢索頁表,最好把頁表放在寄存器中,每一個表項都用一個寄存器。但是有一個問題,通常電腦中的寄存器都不多,而頁表可能非常大,現代電腦的虛擬位址至少是32位的,比如,頁的大小為4KB,那麼32位的地址空間將有1M個頁面,64位的地址空間則更多。虛擬空間中的1M個頁面需要1M個表項。並且,每個進程都有自己的頁表。因此,頁表通常存放在記憶體中。在系統中只設定一個頁表寄存器,其中存放頁表的開始地址和頁表長度。平時進程未執行時,頁表的開始地址和頁表的長度放在PCB中,當進程運行時,把這兩個資料裝入頁表寄存器中。 當進程要訪問某個地址中的資料時,地址變換機構首先自動地將地址轉換成頁號和頁內位移量,然後根據頁號來檢索頁表。在檢索之前要判斷頁號是否大於等於頁表長度,如果頁號大於等於頁表長度,說明超出了有效位址範圍,於是產生一個錯誤中斷。否則,把頁號和頁表項長度相乘得到的結果與頁表開始地址相加,就得到了該頁表項在頁表中的地址,從而找到對應的物理塊號,把物理塊號裝入物理地址寄存器中,同時把頁內位移量送入物理地址寄存器對應的塊內位移量中,由此得到真正的物理地址。
由於頁表是放在記憶體中的,那麼一次資料訪問需要兩次訪問記憶體,第一次訪問頁表,找到對應的物理號,然後與位移量拼接形成物理地址;第二次從第一次得到的物理地址結構中訪問資料。系統的運行速度一般都受到CPU從記憶體中取得指令和資料的速率的限制,一次資料兩次訪問記憶體會使電腦的處理速度降低50%。如何有效解決這個問題? 採取的解決方案是在地址變換結構中增加一個具有並行尋找能力的特殊的高速緩衝寄存器,這種裝置稱為轉換檢測緩衝區,又稱為快表,用於存放當前訪問過的頁表項。此時,當給出一個有效地址時,地址變換機構首先通過將該頁號p同TLB中的所有表項同時進行比較,判斷該表是否在其中,如果發現可匹配的頁面,則直接取出其頁表項得到物理塊號,而不必通過頁表。如果地址變換機構沒有可匹配的項,就進行正常的頁表查詢。首先從TLB中淘汰一個表項,然後用新找到的頁表項替換它。這樣,如果這一頁很快再次被訪問,那麼第二次自然將會命中。 因為寄存器的價格原因,快表的結構不可能很大,通常能存放16 - 512個頁表項,這對中小型作業來說,有可能把全部頁表放入快表中,對於大型作業,可以將常用的頁表項放入其中。由於程式的局部性原則,快表的引入極大改善了系統的效率,資料顯示,從快表中尋找到頁表項的機率可以達到90%。這樣因為訪問頁表而訪問記憶體的次數就會大大減少,從而降低系統的開銷。
2 多級頁表 現代的電腦都有非常大的邏輯地址空間,以32位電腦為例,假設頁的大小為4KB,那麼一個作業的頁最多可以達到2的20次方個,這意味著該作業的頁表現為2的20次方。假設一個頁表現佔用一個位元組,那麼該頁表的大小為2的20次方B,即需要1MB的記憶體空間。並且要求者1MB的記憶體空間是連續的。這顯然是不現實的,解決這個問題的最好方法是:把頁表頁看成普通的檔案,對它進行離散分配,即對頁表再分頁,由此形成多級頁表的思想。 以二級頁表為例,將頁表進行分頁後,離散的存放在不同的物理塊中,這樣,對這些離散分配的頁表再建立頁表,即二級頁表。在中,32位的虛地址劃分成10位的外層頁表域,10位的內層頁表域和12位的頁內位移量。
32位邏輯地址空間使用兩級頁表映射到32位物理地址空間,每個頁面大小為4KB。一級頁表的開始物理地址被存放在頁表基底位址暫存器中,一級地址映射使用邏輯地址的最高10位來索引,併產生第二級頁表的物理地址。下面10位用來索引第二級頁表,產生出的物理頁的地址和邏輯地址的最低12位相結合以產生物理地址。如果某二級頁表中沒有實際映射,就可將其刪除並在頂級頁表中標記為不可用。許多分頁方案在構造的時候都使各級頁表的大小和頁的大小一致,這樣儲存它們佔用的空間可以和進程使用的記憶體頁使用相同的分配方案。 對於32位的機器,採用二級頁表是合適的;但對於64位的機器,採用二級頁表是不合適的,因此必須採用多級頁表。 分頁儲存管理方式雖然可以解決程式和資料無需連續儲存空間的問題,但是這種記憶體管理方式依然要求整個作業都要裝入記憶體運行,既沒有解決大作業小記憶體的問題,此外,該種管理方式純粹從儲存的角度去考慮,沒有考慮到程式本身的儲存問題。 說明總結:單頁時,由於頁表項是連續的(對應著物理地址空間),造成必須佔用一整塊連續地址空間,是不可取的,所以採用多頁表(主要是二級頁表),但造成整個邏輯塊被分散。
基本分段分配方式 分頁儲存管可以實現記憶體利用率的提高,但是分頁的純物理解決方案,一個邏輯段被離散的放在很多個物理塊中。很多時候,程式員希望把一個程式按照它的邏輯結構存放在記憶體中。 一個程式的邏輯段在程式運行過程中有的大小會發生變化,如資料區段和堆棧;而有的邏輯段的大小在運行過程中不發生變化,如程式碼片段。在分頁儲存管理方式中,對於隨時動態增長的段的儲存管理是非常困難的,一旦斷的增長涉及重新分配物理塊,那麼就涉及頁表的修改等問題。 一個具有n個過程的程式,在分頁儲存管理中,過程被一個一個緊緊地放在一起,中間沒有間隙,結果是修改一個過程的大小會影響其他進程的起始地址,進而又需要修改所有調用被移動進程的進程,以使它們的訪問指向這些過程的新地址。在一個有數百個過程的程式中,這個操作的開銷是相當大的。 在分頁儲存管理中,一個邏輯段可能存放在n個物理塊中,如果幾個程式共用這個邏輯段就需要早每個程式的頁表中添加n項,以便實現地址轉換。這樣勢必會增加頁表的大小,進而增加系統的開銷,對於邏輯頁的保護也是同樣的道理。 針對這些問題,一個非常通用的辦法是為一個程式提供多個相互獨立的稱為段的地址空間。每個段由一個從0到最大的線性地址序列構成。各個段的長度可以是0到某個允許的最大值之間的一個值。不同段的長度可以不同,而且通常也不同。段的長度在運行期間可以改變,堆棧段的長度在資料被壓入時會增長。在資料被彈出時又會減小。 因為每個段都是一個獨立的空間,它們可以獨立地增長或減小而不會影響到其他的段。段是一個邏輯實體,一個段可能包括一個過程,一個數組,一個堆棧,一組數值變數,但一般它不會同時包含多種不同類型的內容。分段分配方式實現段長度的擴充,段的動態連結以及段的保護和共用都比頁式儲存容易實現。 1 段表 在分段儲存管理中,邏輯地址結構是二維的,即段號和段內位移量。如所示。在該地址結構中,允許一個作業最長有64K個段,每個段的最大長度為64KB。 在分段分配方式中,系統為每個分段分配一個連續的分區,進程中的各個段可以離散地裝入記憶體中的不同分區中。為了實現邏輯地址到物理地址的轉換,在系統中為每個進程建立一張段表。每個段在段表中都佔有一個表項,其中記錄了該段的起始地址和段的地址,,段表可以存放在一組寄存器中,這樣有助於提高地址轉換速度;但更常見的是放在記憶體中。在配置了段表之後,執行中的進程可以通過尋找段表找到每個段所對應的記憶體區。
2 採用大小不等的段,邏輯地址和物理地址之間不再是簡單的對應關係。考慮一個 n+m 位的地址,左邊的n位為段號,右邊的m位為段內地址。當進程進入運行狀態時,它的段表地址被裝入到段表寄存器中。
作業系統記憶體管理之 分頁與虛存(頁表、頁框、記憶體)