1. 程式人生 > 實用技巧 >作業系統之記憶體管理:4、基本地址變換機構(段氏、頁式、段頁式)

作業系統之記憶體管理:4、基本地址變換機構(段氏、頁式、段頁式)

4、基本地址變換機構

頁式

1、頁式

在這裡插入圖片描述

硬體實現流程

在這裡插入圖片描述
在這裡插入圖片描述

需要進行倆次記憶體訪問

地址變化步驟

在這裡插入圖片描述

在這裡插入圖片描述

問題

在這裡插入圖片描述

2、頁式+快表

什麼是快表?

在這裡插入圖片描述

快表:就是快取記憶體cache訪問速度快於記憶體,造價高於記憶體
所以:cache的容量小於記憶體,
cache和快表(TLB)的區別:TLB 中只有頁表項的副本,而普通 Cache 中可能會有其他各種資料的副本

引入快表後地址變換步驟

在這裡插入圖片描述

什麼叫快表和慢表同時查詢?
在這裡插入圖片描述
就是在訪問快表的同時也訪問慢表,所以在上面的例子中可以節省一秒時間

引入快表後的硬體實現

在這裡插入圖片描述

假如:
第一次訪問(0,0),檢查越界後查詢快表,未命中,查詢頁表,並將該頁表項複製到快表,訪問實體地址。(訪問兩次記憶體)

第二次訪問(0,4),檢查越界後查詢快表,命中,直接訪問實體地址(訪問一次記憶體)
第三次訪問(0,8),檢查越界後查詢快表,命中,直接訪問實體地址(訪問一次記憶體)

快表無法裝入完整的慢表,達到高命中率的基礎原理是什麼?-------->區域性性原理

在這裡插入圖片描述

有無快表的對比:

在這裡插入圖片描述

3、兩級頁表

在這裡插入圖片描述

單級頁表存在的問題

在這裡插入圖片描述

在這裡插入圖片描述
由於段氏記憶體分配的一個優點就是可以進行非連續的儲存,但是當我們採用頁式儲存的時候,邏輯地址與頁表項需要建立一一對應的關係,當邏輯地址太多時,就需要一片很長的連續空間進行頁表儲存,這樣就喪失了非連續儲存的優勢。因此,提出了二級頁表的概念。

二級頁表的邏輯地址結構

在這裡插入圖片描述

二級頁表的硬體實現(解決第一個問題)

在這裡插入圖片描述

我們可以類比於一級頁表,一級頁表可以將一個程式分頁儲存到不同不連續的記憶體單元。那二級頁表其實就是將一級頁表分頁儲存到不同不連續的記憶體單元,即將一級頁表再分頁這樣就可以解決第一個問題了

二級頁表如何實現地址轉換?

在這裡插入圖片描述

就是先用一級頁表查到二級頁表存放的位置,在從二級頁表查到實體地址。相對於一級頁表的方式,就是多了一步頁表查詢的過程。

第二個問題的解決?

在這裡插入圖片描述

見下篇部落格:作業系統之記憶體管理:5、虛擬儲存技術

什麼叫各級頁表大小不能超過一個頁面?

在這裡插入圖片描述

其中,二級頁表在沒有快表時需要進行3次記憶體的訪問才能找到實際的實體地址。n級頁表需要訪問n+1次。

段氏

在這裡插入圖片描述

什麼叫分段?

在這裡插入圖片描述

1、當我們寫一個程式時會有一個main()函式,已經一系列的子函式;那麼分段的意思就是:按照完整的自身邏輯結構(比如一個函式)將一個程式劃分成多個塊,然後將不同的塊儲存到不同不連續的記憶體段中。(如上圖所示),一個函式名就對應一個斷號。
2、使用者要對分段儲存的程式進行資料的訪問時,需要有倆個引數:第一個是段名,第二個是段內偏移量,所以稱段氏的地址空間是二維的
3、段是資訊的邏輯單位。分頁的主要目的是更好地滿足使用者需求。。分段對使用者是可見的,使用者程式設計時需要顯式地給出段名。

如何確定程序的每個段在記憶體中存放的位置?--------->段表

在這裡插入圖片描述

我們可以通過邏輯地址與段表,段表與實體地址的對映關係實現從邏輯地址到實體地址的轉化

段氏硬體實現流程

在這裡插入圖片描述

首先用短號與段表暫存器對比檢視是否越界;
未越界則查詢段表中對應的段表項
然後段內地址與段長對比,判斷是否越界
未越界則查詢實體地址
假如現在要查詢:(2,1024),未越界則查詢到段基址:40K,在加上偏移量:1K,所以最終的實體地址為41K處

記憶體訪問次數

在這裡插入圖片描述

分段、分頁管理的對比

在這裡插入圖片描述在這裡插入圖片描述

假如現在程式有三個段:0,1,2;第二段可共享;用段氏就很容易實現共享;若採用頁式:
在這裡插入圖片描述
可能出現一頁中一部分可共享,一部分不可共享的情況。

段頁式

在這裡插入圖片描述

段氏和頁式的缺點

在這裡插入圖片描述

如何確定程序的每個段在記憶體中存放的位置?--------->段表+頁表

在這裡插入圖片描述
在這裡插入圖片描述

段頁式和段氏中的段表儲存欄位不同。

段頁式管理的邏輯地址結構

在這裡插入圖片描述

段頁氏硬體實現流程

在這裡插入圖片描述

不使用快表時記憶體訪問次數:每次地址轉化都需要訪問記憶體3次。