分頁機制圖文詳解
分頁儲存管理方式:
將使用者程式(程式)的 邏輯地址 空間分成若干個 頁 (4KB)並編號,同時將記憶體的 實體地址 也分成若干個 塊或頁框 (4KB)並編號
目的:
將程式的各個頁離散地儲存在記憶體的任一物理塊中,使得從程式的角度看,認為它有一段連續的記憶體,程式總是從0號單元開始編址
因此需要建立一個由頁到頁框的一一對映的關係,這就是頁表
系統會為每一個程式建立一張頁表,程式執行時,通過查詢程式自己的頁表,找到每頁在記憶體中的物理塊號,從而保證每個程式都能正確執行
由於頁表實現了邏輯地址到實體地址的變換,執行的頻率非常高,因此頁表大多駐留在記憶體中 ,且需要採用硬體實現。在系統中設定一個頁表暫存器(PTR) ,在其中存放頁表在記憶體中的起始地址和頁表的長度,平時頁表始址和長度存放在各程式的PCB中,當排程到某程式時,才將這兩個資料裝入頁表暫存器中。
頁表項結構:
前20位即為塊號,指示實體記憶體中的塊(也稱頁框)
P - 存在(Present)標誌,用於指明表項對地址轉換是否有效。P=1表示有效;P=0表示無效。在頁轉換過程中,如果說涉及的頁目錄或頁表的表項無效,則會導致一個異常。
R/W - 讀/寫(Read/Write)標誌。如果等於1,表示頁面可以被讀、寫或執行。如果為0,表示頁面只讀或可執行。
地址變換過程:
1、程式訪問某個邏輯地址的資料
2、由邏輯地址的頁號(3),以及頁表暫存器中的始址,找到頁表並找到對應的頁表項(3)
3、由頁表項上的塊號,找到實體記憶體中的塊號
4、由塊號,加上邏輯地址的頁內地址,實現了對實體地址資料的定位
5、程式訪問該邏輯地址對應的實體地址的資料
由上可知,每存取一個資料,需兩次訪問記憶體,第一次訪問記憶體中的頁表,第二次訪問記憶體中的資料,效率較低
改進:
增設一個具有並行查尋能力的特殊高速緩衝暫存器,稱為“聯想暫存器”或“快表”,IBM中稱為TLB,用於存放當前訪問的那些頁表項
改進後的地址變換過程:
1、程式訪問某個邏輯地址的資料
2、由邏輯地址的頁號(3),先與高速緩衝暫存器中的所有頁號比較,若匹配則直接讀出塊號,若不匹配則再由上面的2、3步驟執行
3、找到頁表項後,將此頁表項存入快表中,若快表已滿,則系統找出一個認為不再需要的頁表項將其換出
4、5步驟相同
分級頁表
原因:
IA-32體系結構中,處理器為32位,可定址232=4GB的虛擬地址空間,若每頁大小為4KB,則共分為4GB/4KB=220=1048576頁,因此頁表中應有1048576項,每個頁表項為4B,則一個頁表需要4MB的連續的實體記憶體,每個程式都需要自身的頁表佔4MB,將導致大量記憶體用於儲存程式的頁表
PS:80386處理器為32位,可定址4GB邏輯地址,而當時實體記憶體只有4MB,採用單級頁表明顯不行
採用兩級頁表:每頁中存210項,共分為210頁,並新增一個頁目錄表來記錄這210頁表的地址與資訊,因此頁目錄表大小為210*4B=4KB放在記憶體中,需要具體的表再由此讀入
解決方法:
1、採用離散分配方式代替原來頁表需要的連續實體記憶體
2、將當前需要的部分頁表項調入記憶體,其餘頁表項仍駐留在磁碟上,需要時再調入
兩級頁表:
指向原頁表項邏輯地址結構
PS:位移量W也稱為頁內地址 頁大小4k 所以頁內地址需要12位(212=4k)
VS
指向兩級頁表項邏輯地址結構
PS:外層頁號也稱頁目錄表(Directory),外層頁內地址也稱頁表地址(Table)
與頁表暫存器(PTR)相同,增設一個外層頁表暫存器(CR3),用於存放外層頁表的地址
頁目錄項結構
與頁表項結構類似。
分級後的地址變換過程:
1、程式訪問某個邏輯地址的資料
2、由邏輯地址中的外層頁號(Directory),以及外層頁表暫存器(CR3)中的外層頁表始址,找到二級頁表的始址
3、由二級頁表的始址,加上邏輯地址中的外層頁內地址(Table),找到對應的二級頁表中的頁表項
4、由頁表項中的物理塊號,加上邏輯地址中的頁內地址(偏移量),實現了對實體地址資料的定位
5、程式訪問該邏輯地址對應的實體地址的資料
以上分級解決了原來頁表需要連續實體記憶體空間的問題,接下來解決用較少的記憶體空間去存放大頁表的問題
解決方法:
僅把當前需要的一批頁表項調入記憶體,以後再根據需要陸續調入。因此頁目錄表常駐記憶體(大小為4KB,地址存在CR3暫存器中),而 程式的頁表存於磁碟中,對於頁表只需調入一頁或幾頁。由頁目錄項中的P標記該頁表是否在記憶體中,若不在則產生缺頁異常,產生異常中斷,請求系統將該頁表調入記憶體
相關文章
- Kafka 架構和原理機制 (圖文全面詳解)Kafka架構
- 圖文詳解 HDFS 的工作機制及其原理
- 分頁機制
- android事件分發機制詳解Android事件
- 一文詳解MySQL的鎖機制MySql
- mySql\oracle分頁機制MySqlOracle
- 圖解 Android 事件分發機制圖解Android事件
- 80頁PPT圖文詳解三相非同步電機,漲知識!非同步
- Android ViewGroup 事件分發機制詳解AndroidView事件
- 圖解Dubbo,6 種擴充套件機制詳解圖解套件
- Android頁面跳轉與返回機制詳解Android
- ElasticSearch 深度分頁詳解Elasticsearch
- Session機制詳解Session
- AsyncTask機制詳解
- jdon 的分頁機制的效率低,
- Android 事件分發機制原始碼詳解-最新 APIAndroid事件原始碼API
- Redis 事件機制詳解Redis事件
- Java SPI機制詳解Java
- Java 反射機制詳解Java反射
- 回撥機制詳解
- 多圖詳解:不停機分庫分表五個步驟
- Java泛型詳解,史上最全圖文詳解!Java泛型
- PopClip使用教程圖文詳解
- Git使用教程圖文詳解Git
- JavaScript數字分頁效果詳解JavaScript
- 自定義分頁標籤詳解
- 掌握ASP分頁技術詳解
- 80386的分段機制、分頁機制和實體地址的形成
- 詳解 php 反射機制原理PHP反射
- JavaScript非同步機制詳解JavaScript非同步
- Java-SPI機制詳解Java
- Spring事件機制詳解Spring事件
- js執行機制詳解JS
- PHP 垃圾回收機制詳解PHP
- Android Handler機制詳解Android
- Fail-Fast機制詳解AIAST
- PHP autoload 機制詳解PHP
- Django的Form機制詳解DjangoORM