推薦教學:#常見問題
簡介
在記憶體管理中,連續分配方式會形成許多“碎片”,雖然可透過“緊湊”方法將許多碎片拼接成可用的大塊空間,但須為之付出很大開銷。
如果允許將一個進程直接分散地裝入到許多不相鄰的分區中,則無須再進行「緊湊」。基於這個想法而產生了離散分配方式。如果離散分配的基本單位是頁,則稱為分頁儲存管理方式。在分頁儲存管理方式中,如果不具備頁面對換功能,則稱為基本分頁儲存管理方式,或稱為純分頁儲存管理方式,它不具有支援實作虛擬記憶體的功能,它要求把每個作業全部裝入記憶體後方能運行。
為什麼要分頁儲存
在記憶體的分配過程中,連續分配方式容易產生大量的碎片,雖然可以透過「緊湊”對其進行整理,但是這樣需要大量的開銷。
因此,如果能夠在進程的記憶體分配的時候,將連續的邏輯記憶體打散分配在多個可以不相連的實體記憶體上,那麼將會利用到原來被浪費的大塊碎片,降低不可利用碎片的最大大小(降至頁面的大小,因為如果碎片的大小超過頁面的大小,那麼將可以被利用),提升記憶體利用率。根據這種思想,產生了離散分配方式,如果離散分配的基本單位是頁,則稱之為分頁存儲管理方式;如果不具備頁面對換功能,那麼就是基本分頁存儲管理方式。
基本概念
## 分頁儲存管理方式將進程的連續的邏輯位址空間分割為若干大小相等的位址片,稱為頁或頁。並將其編號,如第0頁、第1頁。在邏輯上,這些頁中的各個位址拼接起來是連續的,但是他們對應的實體區塊位址是可以不連續的。對應的實體塊也相應的被命名為第0塊、第1塊等。在進程分配記憶體時,進程的若干個頁分別被裝入對應的實體區塊,由於最後一頁經常裝不滿,所以形成了無法被利用的頁內碎片
採用分頁儲存管理方式的目的就是更多的利用記憶體碎片,因此,頁面的大小相對來說是小於正常進程所需的位址空間大小。那麼頁面多大是比較適合的呢?頁面如果太小,雖然可以使得記憶體中不可利用碎片的最大大小降低,提升記憶體空間的使用率,但是也會導致進程佔用過多的頁面,使得頁表過長,降低頁面的換進換出的效率。同樣,如果頁面過大,雖然提升了頁面換進換出的效率,但是也會使得記憶體碎片增大。所以,根據經驗,頁面的大小最好選擇512B~8KB左右。
頁表
頁表就是進程中維護的一段位址空間,其中儲存了頁面和實體區塊的映射關係,在討論頁表之前,先理清分頁中的位址結構。
對於實體位址空間,總的記憶體位址空間是固定的。而對於一個進程,分配的邏輯記憶體空間也是固定且連續的,該邏輯位址空間從0開始,假設某個進程中的一個位元組的邏輯位址為 1088B, 而頁面大小為512B。在介紹頁面 時說過,邏輯位址空間雖然分給為若干個頁,但是這些頁的邏輯位址仍然是連續的。那麼我們可以知道該位元組所屬的頁號 P = 2 (從0開始),頁內位址 d = (1088 - 512 * 2) = 64。
也就是說在頁面長度已知的情況下,根據邏輯位址可以簡單的知道該位址空間所屬的頁號和在該頁面中的相對位址。根據這兩個參數和頁表,就能夠知道該位址對應的實體位址了。
頁表是用來對應頁面和實體區塊的一張表,如下圖:
透過頁表和頁號,我們知道了物理塊號,也就知道了對應物理塊空間的起始位址。再加上頁內地址,就知道對應的實體地址了。透過這種方式,我們能夠實現從邏輯位址到實體位址的轉換。
位址轉換
#上面的基礎概念介紹簡單介紹了一下地址轉換的原理,以下詳細看看具體流程。
上面說到透過尋找頁表找到頁號到實體區塊號碼的映射,那麼頁表存放在哪裡,如何找到頁表呢? ?
頁表可以透過一組暫存器來實現,一個暫存器儲存一條頁表項,因為暫存器的存取速度快,可以提高頁表位址轉換的速度。然而,暫存器成本較高,頁表中的頁表項可能會非常大,達到數百上千項。因此頁表通常也儲存在記憶體中,在系統中,只設定一個頁表暫存器PTR,用來儲存頁表在記憶體中的起始位址和長度。平時,進程未執行時,頁表的始址和頁表長度存放在本進程的PCB中。當調度程式調度到某一進程時,才將這兩個資料裝入頁表暫存器中。因此,在單一處理機環境下,雖然系統中可以運行多個進程,但只需一個頁表寄存器(也就是說,多進程同時運行的情況下,需要分別儲存多個進程內的頁表資料) 。
當進程要存取某個邏輯位址中的資料時,分頁位址變換機構會自動地將有效位址(相對位址)分成頁號頁內位址兩部分,再以頁號為索引去檢索頁表。在執行檢索之前,先將頁號與頁表長度進行比較,如果頁號大於或等於頁表長度,則表示本次所造訪的位址已超越進程的位址空間。於是,這錯誤將被系統發現並產生一地址越界中斷。若未出現越界錯誤,則將頁表始址與頁號和頁表項長度的乘積相加,便得到該表項在頁表中的位置,於是可從中得到該頁的物理塊號,將之裝入物理位址寄存器中。同時,再將有效位址暫存器中的頁內位址送入實體位址暫存器的區塊內位址欄位中。這樣便完成了從邏輯位址到實體位址的變換。下圖示出了分頁系統的位址變換機構
#快表
由於頁表是存放在記憶體而非暫存器中,所以每次讀取一個地址的時候需要訪問兩次內存,第一次訪問頁表找到物理塊號,第二次才是訪問真正的物理地址獲取數據。因此,採用這種方式將使計算機的處理速度降低近1/2。
為了提升位址變換效率,在位址變換機構中加入了一組具有並行查尋能力的特殊高速緩衝暫存器,又稱為“聯想暫存器”(Associative Memory),或稱為“快表” ,用來儲存目前存取的頁表項資料(類似緩存,儲存先前尋找過的頁表項,提升頁號到實體區塊號碼的轉換效率)。透過這種方式,位址轉換過程變成瞭如下圖:
# 在CPU取得邏輯位址後,位址轉換機構將頁號交給快表查詢對應的物理塊號,如果查到,則直接根據頁內地址找到物理地址訪問數據,如果沒有則按正常的方式查找物理塊號,並同時將其保存在快表中。如果快表已滿,則係統會自動在其中去掉一個頁表項替換出來。
簡而言之,快表就相當於頁表項快取。
以上是基本分頁儲存管理方式是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!