㈠ 基本分頁存儲管理方式的頁面與頁表
1) 頁面和物理塊
分頁存儲管理是將一個進程的邏輯地址空間分成若干個大小相等的片,稱為頁面或頁,並為各頁加以編號,從0開始,如第0頁、第1頁等。相應地,也把內存空間分成與頁面相同大小的若干個存儲塊,稱為(物理)塊或頁框(frame),也同樣為它們加以編號,如0#塊、1#塊等等。在為進程分配內存時,以塊為單位將進程中的若干個頁分別裝入到多個可以不相鄰接的物理塊中。由於進程的最後一頁經常裝不滿一塊而形成了不可利用的碎片,稱之為「頁內碎片」。
2) 頁面大小
在分頁系統中的頁面其大小應適中。頁面若太小,一方面雖然可使內存碎片減小,從而減少了內存碎片的總空間,有利於提高內存利用率,但另一方面也會使每個進程佔用較多的頁面,從而導致進程的頁表過長,佔用大量內存;此外,還會降低頁面換進換出的效率。然而,如果選擇的頁面較大,雖然可以減少頁表的長度,提高頁面換進換出的速度,但卻又會使頁內碎片增大。因此,頁面的大小應選擇適中,且頁面大小應是2的冪,通常為512 B~8 KB。 分頁地址中的地址結構如下:
對於某特定機器,其地址結構是一定的。若給定一個邏輯地址空間中的地址為A,頁面的大小為L,則頁號P和頁內地址d可按右圖所示公式求得:
其中,INT是整除函數,MOD是取余函數。例如,其系統的頁面大小為1 KB,設A = 2170 B,則由上式可以求得P = 2,d = 122。 頁表的功能可以由一組專門的寄存器來實現。一個頁表項用一個寄存器。由於寄存器具有較高的訪問速度,因而有利於提高地址變換的速度;但由於寄存器成本較高,且大多數現代計算機的頁表又可能很大,使頁表項的總數可達幾千甚至幾十萬個,顯然這些頁表項不可能都用寄存器來實現,因此,頁表大多駐留在內存中。在系統中只設置一個頁表寄存器PTR(Page-Table Register),在其中存放頁表在內存的始址和頁表的長度。平時,進程未執行時,頁表的始址和頁表長度存放在本進程的PCB中。當調度程序調度到某進程時,才將這兩個數據裝入頁表寄存器中。因此,在單處理機環境下,雖然系統中可以運行多個進程,但只需一個頁表寄存器。
當進程要訪問某個邏輯地址中的數據時,分頁地址變換機構會自動地將有效地址(相對地址)分為頁號頁內地址兩部分,再以頁號為索引去檢索頁表。查找操作由硬體執行。在執行檢索之前,先將頁號與頁表長度進行比較,如果頁號大於或等於頁表長度,則表示本次所訪問的地址已超越進程的地址空間。於是,這一錯誤將被系統發現並產生一地址越界中斷。若未出現越界錯誤,則將頁表始址與頁號和頁表項長度的乘積相加,便得到該表項在頁表中的位置,於是可從中得到該頁的物理塊號,將之裝入物理地址寄存器中。與此同時,再將有效地址寄存器中的頁內地址送入物理地址寄存器的塊內地址欄位中。這樣便完成了從邏輯地址到物理地址的變換。右圖示出了分頁系統的地址變換機構。 由於頁表是存放在內存中的,這使CPU在每存取一個數據時,都要兩次訪問內存。第一次是訪問內存中的頁表,從中找到指定頁的物理塊號,再將塊號與頁內偏移量W拼接,以形成物理地址。第二次訪問內存時,才是從第一次所得地址中獲得所需數據(或向此地址中寫入數據)。因此,採用這種方式將使計算機的處理速度降低近1/2。可見,以此高昂代價來換取存儲器空間利用率的提高,是得不償失的。
為了提高地址變換速度,可在地址變換機構中增設一個具有並行查尋能力的特殊高速緩沖寄存器,又稱為「聯想寄存器」(Associative Memory),或稱為「快表」,在IBM系統中又取名為TLB(Translation Lookaside Buffer),用以存放當前訪問的那些頁表項。此時的地址變換過程是:在CPU給出有效地址後,由地址變換機構自動地將頁號P送入高速緩沖寄存器,並將此頁號與高速緩存中的所有頁號進行比較,若其中有與此相匹配的頁號,便表示所要訪問的頁表項在快表中。於是,可直接從快表中讀出該頁所對應的物理塊號,並送到物理地址寄存器中。如在塊表中未找到對應的頁表項,則還須再訪問內存中的頁表,找到後,把從頁表項中讀出的物理塊號送地址寄存器;同時,再將此頁表項存入快表的一個寄存器單元中,亦即,重新修改快表。但如果聯想寄存器已滿,則OS必須找到一個老的且已被認為不再需要的頁表項,將它換出。右圖示出了具有快表的地址變換機構。
㈡ 用c語言分頁式存儲管理的地址轉換過程實現
邏輯地址轉換為物理地址
#include<stdio.h>
main()
{int p,d,la,pa,ps,a[100],n,i;/*pa為物理地址,la為物理地址,ps為頁面大小拆彎含,a[100]存放頁表中對應主存旅笑的頁號,n為頁面數*/
printf("請輸入邏輯地址la=");/*輸入邏輯地址*/
scanf("%d",&la);
printf("請輸入頁面大小ps=");/*輸入頁面大小*/
scanf("%d",&ps);
printf("請輸入頁面數n=");/*輸入頁面數*/
scanf("%d",&n);
for(i=0;i<n;i++)
{
printf("輸入頁表中第%d頁項中主存頁號=",i);
scanf("%d",&a[i]);
}/*輸入頁表中主存的頁號*/
p=la/ps;d=la-p*ps;/*p為頁表項的頁號,d為頁內位移*/
pa=a[p]*ps+d;
printf("邏輯鬧升地址為%d的物理地址為%d",la,pa);
}
㈢ 頁儲存管理中,已知一個邏輯地址長度為16位,頁面大小為4096B,地址為2F6AH,怎麼知道這個地址的頁號啊
頁面大小4096B,那頁內需要12位才能表示,邏輯地址16位,也就是4位頁地址加12位頁內偏移地址組成,那16位邏輯地址中前面的4位就是頁號。
想要求出物理地址,那還需要頁表,根據頁號查找對應的頁表,頁表存放是的頁號對應的物理頁地址,物理地址就是物理頁地址加上頁內偏移。
㈣ 簡述。。分頁式虛擬存儲系統中。一個邏輯地址到物理地址的轉換過程(並畫出地址轉換機構圖) 跪求大
存儲管理單元 MMU(Memory Manage Unit, 存儲管理單元)和物理內存之間進行地址轉換 在CPU和物理內存之間進行地址轉換,將地址從邏輯空間映映射到物理地址空間。\r\n選 B