Linux 程式位址空間及常見頁面置換演算法

2021-10-19 10:02:26 字數 3359 閱讀 7077

缺頁中段

環境:32為平台

程式:其實就是一堆**,儲存在檔案(磁碟)中

計算機物理記憶體的大小是固定的,也就是說計算機主機板記憶體槽上的實際物理記憶體,cpu可以直接進行定址,物理記憶體的容量是固定的,但是定址的空間取決於cpu位址線的數量。在32位系統上,線性位址空間可達4g(2^32);這4g一般是按照3:1的比例進行分配,使用者程序享有3g的空間,而核心獨自享有剩下的1g記憶體

編譯器在編譯程式生成可執行檔案時,就會對每一條指令,每乙個資料進行乙個位址排號,當程式執行時,就會將指令以及資料放到指定的記憶體位址位置

cpu就會根據位址偏移逐步區執行命令,以及找到對應的資料進行處理

(注意:程式執行之後才會佔據記憶體——因此程式位址空間通常又被成為—程序位址空間)

程序位址空間:實際上也是乙個虛擬位址空間,是作業系統作為程序通過乙個mm_struct結構體所描述的乙個假的位址空間

那麼為什麼作業系統不讓程序直接訪問物理記憶體,而是虛擬記憶體位址呢?若程序直接訪問物理記憶體有什麼不好呢?

1.在程式編譯時,編譯器就會給指令和資料進行位址編址;但是如果某個位址記憶體已經被占用,則這個程式就執行不起來了----編譯器的位址管理麻煩

2.程序直接訪問物理記憶體,如果有乙個野指標,你在操作的時候可能就會把其他程序中的資料改變了(無法進行記憶體訪問控制)

3.程式執行載入通常需要使用一塊連續的記憶體空間,對記憶體的利用率比較低

注意:虛擬位址不具備儲存能力,資料的儲存仍然還是要放到記憶體中

定義:將使用者程式的位址空間分為若干個固定大小的不同的段,在儲存分配時,以段為單位,實現了離散分配。

將虛擬位址的組織分為段號+段內偏移量(比如全域性資料段有很多變數,他們的段號都是一樣的,也就意味著物理記憶體段的起始變數的偏移量不同)因此,通過段號對應的物理記憶體段起始位址,以及虛擬位址中位址的偏移量組成乙個完整的實體地址,找到對應的物理記憶體單元

對映邏輯:解析出段號,通過段號在段表中找到對應的段表項,取出段表中的實體地址,與段內偏移進行相加

優點:可以分別編寫和編譯,可以針對不同型別的段採取不同的保護,可以按段為單位來進行共享,包括通過動態鏈結進行**共享。對編譯器的位址管理比較友好

缺點:會產生碎片,沒有解決資料連續儲存記憶體利用率低的問題

定義:將使用者程式的位址空間分為若干個固定大小的區域,稱為「頁」或「頁面」。也將使用者程式的任一頁放入任一物理塊中,實現了離散分配。

頁表如何通過虛擬位址找到實體地址

頁表:頁號,實體地址,缺頁中斷位……

虛擬位址的組成:頁號+頁內偏移

對映邏輯:拿到虛擬位址,解析出頁號,通過頁號在頁表中找到對應的頁表項,取出頁表項中的實體地址,與頁內偏移進行相加

優點:(1).分頁系統不會產生外部碎片,乙個程序占用的記憶體空間可以不是連續的,並且乙個程序的虛擬頁面在不需要的時候可以放在磁碟中。

(2)分頁系統可以共享小的位址,即頁面共享。只需要在對應給定頁面的頁表項裡做乙個相關的記錄即可

缺點:頁面很大,會占用大量記憶體空間

就是分段式與分頁式的結合,首先對虛擬位址空間進行分段式管理,然後在每個分段內進行分頁管理。是實際的記憶體管理方式。

定義:指通過虛擬位址找到頁表項之後,如果當前位址本來存放的資料不再記憶體中,就會觸發該現象

那麼為什麼乙個資料會不再記憶體中呢?

這是因為當物理記憶體不夠用的時候,作業系統會根據一定的演算法,找出一塊物理記憶體,將其中的資料放到磁碟的交換區中進行儲存,當觸發缺頁中斷的時候,這塊記憶體中的原有資料會被重新置換回來。

首先我們需要明確:頁面置換時挑選頁面的目標主要在於降低隨後發生缺頁中斷的次數或概率。所以,挑選的頁面應當是隨後相當長時間內不會被訪問的頁面,最好是再也不會被訪問的頁面。如果可能,最好選擇乙個沒有修改過的頁面,這樣替換時就無須將被替換頁面的內容寫回磁碟,從而進一步加快缺頁中斷的響應速度。下面給大家介紹幾種頁面置換演算法。

該演算法是由belasy於2023年題出的一種理論上的演算法。該演算法的思想是從已經在記憶體中的頁面中選擇未來最長時間內不會使用的頁面將其置換出去;但是在顯示中是無法**的。這種演算法的效能是最好的,因為它對未來的判斷達到了100%,因此也決定了它無法實際使用,唯一的作用是作為衡量其他演算法的尺度。

fifo演算法是最早出現的置換演算法,該演算法的核心思想是總是淘汰最先進入記憶體的頁面,即選擇在記憶體中駐留時間最久的頁面予以淘汰。這種演算法實現簡單,只需要把乙個程序調入記憶體的頁面按先後次序鏈結成乙個佇列,並設定乙個指標,稱為替換指標。讓它總是指向最老的頁面。

缺點:該演算法與程序實際執行的規律不相適應,因為在程序中,有些頁面經常被訪問,比如含有全域性變數、常用函式、例程等的頁面,fifo演算法並不能保證這些頁面不被淘汰

最近最久未使用(lru)的頁面置換演算法是根據頁面調入記憶體後的使用情況做出決策的。核心思想是選擇最近最長時間未訪問過的頁面予以淘汰,它認為過去一段時間內未訪問過的頁面,在最近的將來可能也不會被訪問。該演算法為每個頁面設定乙個訪問字段,來記錄頁面自上次被訪問以來所經歷的時間,淘汰頁面時選擇現有頁面中值最大的予以淘汰。

lfu演算法和最近最久未使用演算法思路相同,都是使用最近的過去**最近的未來;在該演算法裡,採取的依據是最近一段時間裡的使用次數,選擇在最近時期使用最少的頁面作為置換頁。在採用lfu演算法時,應為在記憶體中的每個頁面設定乙個移位暫存器,用來記錄該頁面被訪問的頻率(訪問次數)

簡單的clock演算法是給每一頁設定乙個訪問位,又稱使用位。再將記憶體中的所有頁面都通過鏈結指標鏈結成乙個迴圈佇列。當某一頁眉次裝入主存時,該幀的訪問位設定為1;當該頁隨後再被訪問到時,訪問位也被置為1。

對於頁面替換,該演算法中將頁面組織為迴圈佇列,每個頁面有乙個訪問位,如果訪問過該頁面,就將其訪問位置為1,否則將其訪問位置為0;當尋找置換出去的頁面時,遇到第乙個訪問位為0的頁面就將其置換出去,如果遇到訪問位為1的頁面,依然將其訪問位置為1,然後繼續尋找;

由於該演算法迴圈檢查各個頁面的使用情況,所以叫做clock演算法;

Linux 程式位址空間

我們所說的位址是乙個虛擬的位址空間,只是一堆位址編號的描述,非物理記憶體位址 虛擬位址不具備儲存能力,資料儲存依然放到物理記憶體中 程序中訪問的位址都是虛擬位址,非物理記憶體位址 程式位址空間也是乙個虛擬位址空間,是作業系統為程序通過乙個mm struct 結構體所描述的乙個假的位址空間 mm st...

程式位址空間

上圖也可以進一步細分 1.棧區 棧又叫堆疊,通常存放程式臨時建立的非靜態區域性變數 即函式大括號中定義的區域性變數 以及函式呼叫時的引數,呼叫後的返回值等。由編譯器自動分配釋放。棧是向下增長的。棧具有 小記憶體 自動化 可能會溢位 的特點。棧頂的位址和棧的最大容量一般是系統預先規定好的,通常不會太大...

程式位址空間

乙個全域性變數,在子程序中修改後,列印100,父程序還是列印1 資料不同,表示肯定沒有使用同一塊記憶體空間 一塊記憶體空間不能儲存兩個資料 父子程序列印的資料不同,但是位址卻是相同的 此處產生矛盾,因為實際程序中訪問的位址都是虛擬位址,且程式位址空間時機上也是乙個程序的虛擬位址空間。size 表示記...