1. 程式人生 > >作業系統核心原理-5.記憶體管理(中):分頁記憶體管理

作業系統核心原理-5.記憶體管理(中):分頁記憶體管理

  在上一篇介紹的幾種多道程式設計的記憶體管理模式中,以交換記憶體管理最為靈活和先進。但是這種策略也存在很多重大問題,而其中最重要的兩個問題就是空間浪費和程式大小受限。那麼有什麼辦法可以解決交換記憶體存在的這些問題呢?答案是分頁,它是我們解決交換缺陷的“不二法門”。

一、分頁記憶體管理

1.1 解決問題之道

  為了解決交換系統存在的缺陷,分頁系統橫空出世。分頁系統的核心在於:將虛擬記憶體空間和實體記憶體空間皆劃分為大小相同的頁面,如4KB、8KB或16KB等,並以頁面作為記憶體空間的最小分配單位,一個程式的一個頁面可以存放在任意一個物理頁面裡

  (1)解決空間浪費碎片化問題

  由於將虛擬記憶體空間和實體記憶體空間按照某種規定的大小進行分配,這裡我們稱之為頁(Page),然後按照頁進行記憶體分配,也就克服了外部碎片的問題。

  (2)解決程式大小受限問題

  程式增長有限是因為一個程式需要全部載入到記憶體才能執行,因此解決的辦法就是使得一個程式無須全部載入就可以執行。使用分頁也可以解決這個問題,只需將當前需要的頁面放在記憶體裡,其他暫時不用的頁面放在磁碟上,這樣一個程式同時佔用記憶體和磁碟,其增長空間就大大增加了。而且,分頁之後,如果一個程式需要更多的空間,給其分配一個新頁即可(而無需將程式倒出倒進從而提高空間增長效率)。

1.2 虛擬地址的構成與地址翻譯

  (1)虛擬地址的構成

  在分頁系統下,一個程式發出的虛擬地址由兩部分組成:頁面號和頁內偏移值,如下圖所示:

  例如,對於32位定址的系統,如果頁面大小為4KB,則頁面號佔20位,頁內偏移值佔12位。

  (2)地址翻譯:虛擬地址→實體地址

  分頁系統的核心是頁面的翻譯,即從虛擬頁面到物理頁面的對映(Mapping)。該翻譯過程如下虛擬碼所示:

if(虛擬頁面非法、不在記憶體中或被保護)
{
    陷入到作業系統錯誤服務程式
}
else
{
    將虛擬頁面號轉換為物理頁面號
    根據物理頁面號產生最終實體地址
}

  而這個翻譯過程由記憶體管理單元(MMU)完成,MMU接收CPU發出的虛擬地址,將其翻譯為實體地址後傳送給記憶體。記憶體管理單元按照該實體地址進行相應訪問後讀出或寫入相關資料,如下圖所示:

  那麼,這個翻譯是怎麼實現的呢?答案是查頁表

,對於每個程式,記憶體管理單元MMU都為其儲存一個頁表,該頁表中存放的是虛擬頁面到物理頁面的對映。每當為一個虛擬頁面尋找到一個物理頁面之後,就在頁表裡增加一條記錄來保留該對映關係。當然,隨著虛擬頁面進出實體記憶體,頁表的內容也會不斷更新變化。

1.3 頁表

  頁表的根本功能是提供從虛擬頁面到物理頁面的對映。因此,頁表的記錄條數與虛擬頁面數相同。此外,記憶體管理單元依賴於頁表來進行一切與頁面有關的管理活動,這些活動包括判斷某一頁面號是否在記憶體裡,頁面是否受到保護,頁面是否非法空間等等。

  頁表的一個記錄所包括的內容如下圖所示:

  由於頁表的特殊地位,決定了它是由硬體直接提供支援,即頁表是一個硬體資料結構。

1.4 分頁系統的優缺點

  優點:

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

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

  缺點:頁表很大,佔用了大量的記憶體空間。

1.5 缺頁中斷處理

  在分頁系統中,一個虛擬頁面既有可能在實體記憶體,也有可能儲存在磁碟上。如果CPU發出的虛擬地址對應的頁面不在實體記憶體,就將產生一個缺頁中斷,而缺頁中斷服務程式負責將需要的虛擬頁面找到並載入到記憶體。缺頁中斷的處理步驟如下,省略了中間很多的步驟,只保留最核心的幾個步驟:

二、頁面置換演算法

  如果發生了缺頁中斷,就需要從磁碟上將需要的頁面調入記憶體。如果記憶體沒有多餘的空間,就需要在現有的頁面中選擇一個頁面進行替換。使用不同的頁面置換演算法,頁面更換的順序也會各不相同。如果挑選的頁面是之後很快又要被訪問的頁面,那麼系統將很開再次產生缺頁中斷,因為磁碟訪問速度遠遠記憶體訪問速度,缺頁中斷的代價是非常大的。因此,挑選哪個頁面進行置換不是隨隨便便的事情,而是有要求的。

2.1 頁面置換的目標

  頁面置換時挑選頁面的目標主要在於降低隨後發生缺頁中斷的次數或概率

  因此,挑選的頁面應當是隨後相當長時間內不會被訪問的頁面,最好是再也不會被訪問的頁面。BTW,如果可能,最好選擇一個沒有修改過的頁面,這樣替換時就無須將被替換頁面的內容寫回磁碟,從而進一步加快缺頁中斷的響應速度。

  所以,為了達到這個目的,先驅們設計出了各種各樣的頁面置換演算法,下面就來看看這些演算法。

2.2 隨機更換演算法

  在需要替換頁面的時候,產生一個隨機頁面號,從而替換與該頁面號對應的物理頁面。遺憾的是,隨機選出的被替換的頁面不太可能是隨後相當長時間內不會被訪問的頁面。也就是說,這種演算法難以保證最小化隨後的缺頁中斷次數。事實上,這種演算法的效果相當差。

2.3 先進先出演算法

  顧名思義,先進先出(FIFO,First In First Out)演算法的核心是更換最早進入記憶體的頁面,其實現機制是使用連結串列將所有在記憶體中的頁面按照進入時間的早晚連結起來,然後每次置換連結串列頭上的頁面就行了,而新加進來的頁面則掛在連結串列的末端,如下圖所示:

  FIFO的優點是簡單且容易實現,缺點是如果最先載入進來的頁面是經常被訪問的頁面,那麼就可能造成被訪問的頁面替換到磁碟上,導致很快就需要再次發生缺頁中斷,從而降低效率。

2.4 第二次機會演算法

  由於FIFO只考慮進入記憶體的時間,不關心一個頁面被訪問的頻率,從而有可能造成替換掉一個被經常訪問的頁面而造成效率低下。那麼,可以對FIFO進行改進:在使用FIFO更換一個頁面時,需要看一下該頁面是否在最近被訪問過,如果沒有被訪問過,則替換該頁面。反之,如果最近被訪問過(通過檢查其訪問位的取值),則不替換該頁面,而是將該頁面掛到連結串列末端,並將該頁面進入記憶體的時間設定為當前時間,並將其訪問位清零。這樣,對於最近被訪問過的頁面來說,相當於給了它第二次機會。

  例如,當A頁面最近被訪問過,即其訪問位R的值為1,則使用第二次機會演算法之後,連結串列的格局如下圖所示:

  第二次機會演算法簡單、公平且容易實現。但是,每次給予一個頁面第二次機會時,將其移動到連結串列末端需要耗費時間。此外,頁面的訪問位只在頁面替換進行掃描時才可能清零,所以其時間局域性體現得不好,訪問位為1的頁面可能是很久以前訪問的,時間上的分辨粒度太粗,從而影響頁面替換的效果。

2.5 時鐘演算法

  為了改善第二次機會演算法的缺點,先驅們提出了時鐘演算法。時鐘演算法的核心思想是:將頁面排成一個時鐘的形狀,該時鐘有一個針臂,每次需要更換頁面時,我們從針臂所指的頁面開始檢查。如果當前頁面的訪問位為0,即從上次檢查到這次,該頁面沒有被訪問過,將該頁面替換。反之,就將其訪問位清零,並順時針移動指標到下一個頁面。重複這些步驟,直到找到一個訪問位為0的頁面。

例如下圖所示的一個時鐘,指標指向的頁面是F,因此第一個被考慮替換的頁面是F。如果頁面F的訪問位為0,F將被替換。如果F的訪問位為1,則F的訪問位清零,指標移動到頁面G。

  從表面上看,它和第二次機會演算法類似,都是訪問位為0就更換,反之則再給一次機會。但是,它和第二次機會演算法還是有幾點不同:

  (1)他們的資料結構不一樣,第二次機會使用的是連結串列,時鐘演算法使用的是索引(整數指標)。這樣,其使用的記憶體空間不一樣。

  (2)第二次機會需要使用額外的記憶體,而時鐘演算法可以直接使用頁表。使用頁表的好處是無需額外的空間,更大的好處是頁面的訪問位會定期自動清零,這樣將使得時鐘演算法的時間分辨粒度較第二次機會演算法高,從而取得更好的頁面替換效果。

  時鐘演算法的精髓是第二次機會,其缺點也就和第二次機會演算法一樣:過於公平,沒有考慮到不同頁面呼叫頻率的不同,有可能換出不應該或不能換出的頁面,還可能造成無限迴圈。

PS:至此,隨機、FIFO、第二次機會與時鐘演算法的介紹就到此結束,這四種演算法都是屬於“公平演算法”,即所有的頁面都或多或少地給予公平待遇,沒有頁面獲得特殊待遇。但是這種公平實現方式,會使效率受到一定影響,這時因為個體對於整個系統的貢獻沒有被區別對待,造成貢獻大的和貢獻小的待遇一樣,自然會影響整個系統的效率。

2.6 最優更換演算法

  我們知道,最理想的頁面替換演算法是選擇一個再也不會被訪問的頁面進行替換。如果不存在這樣的頁面,那至少選擇一個在隨後最長時間內不會被訪問的頁面進行替換。這樣,我們就可以保證在隨後發生缺頁中斷的次數最小或概率最低,這種演算法就是最有替換演算法。

  但是,我們沒法知道一個頁面隨後多長時間不會被訪問,因此最優更換演算法在實際中沒法實現,那麼為什麼要介紹最有更換演算法呢?這是為了定義一個標杆,以此來評判其他演算法的優劣。

2.7 NRU(最近未被使用)演算法

  顧名思義,NRU就是選擇一個在最近一段時間內沒有被訪問過的頁面進行替換,這是基於程式訪問的時空局域性。因為根據時空局域性原理,一個最近沒有被訪問的頁面,在隨後的時間裡也不太可能被訪問,而NRU的實現方式就是利用頁面的訪問和修改位。

  每個頁面都有一個訪問位和一個修改位,凡是對頁面進行讀寫操作時,訪問位被設定為1。當程序對頁面進行讀寫操作時,修改位設定為1。根據這兩個位的狀態來對頁面進行分類的話,可以分成以下四種頁面型別:1、2、3、4。

  有了這個分類,NRU演算法就按照這四類頁面的順序依次尋找可以替換的頁面。如果所有頁面皆被訪問和修改過,那也只能從中替換掉一個頁面,因此NRU演算法總是會終結的。

  當然,這種分類比較籠統,在同一類頁面裡,我們沒有辦法分辨出哪一類被訪問的時間更近一些。即在某些情況下,我們替換的可能並不是最近沒有被使用的頁面。

2.8 LRU(最近最少使用)演算法

  與NRU演算法相比,LRU演算法不僅考慮最近是否用過,還要考慮最近使用的頻率。這裡是基於過去的資料預測未來:如果一個頁面被訪問的頻率低,那麼以後很可能也用不到。

  LRU演算法的實現必須以某種方式記錄每個頁面被訪問的次數,這是個相當大的工作量。最簡單的方式就是在頁表的記錄項裡增加一個計數域,一個頁面被訪問一次,這個計數器的值就增加1。於是,當需要更換頁面時,只需要找到計數域值最小的頁面替換即可,該頁面即是最近最少使用的頁面。另一種簡單實現方式就是用一個連結串列將所有頁面連結起來,最近被使用的頁面在連結串列頭,最近未被使用的放在連結串列尾。在每次頁面訪問時對這個連結串列進行更新,使其保持最近被使用的頁面在連結串列頭。

  LRU演算法雖然很好,但是實現成本高(需要分辨出不同頁面中哪個頁面時最近最少使用的),並且時間代價大(每次頁面訪問發生時都需要更新記錄)。因此,一般的商業作業系統都沒有采納LRU頁面更新演算法。

2.9 工作集演算法

  由於不可能精確地確定那個頁面是最近最少使用的,那就乾脆不花費這個力氣,只維持少量的資訊使得我們選出的替換頁面不太可能是馬上又會使用的頁面即可。這種少量的資訊就是工作集資訊

  工作集概念來源於程式訪問的時空侷限性,即在一段時間內,程式訪問的頁面將侷限在一組頁面集合上。例如,最近k次訪問均發生在某m個頁面上,那麼m就是引數為k時的工作集。我們用w(k,t)來表示在時間t時k次訪問所涉及的頁面數量。

  顯然,隨著k的增長,w(k,t)的值也隨之增長;但是當k增長到某個數值之後,w(k,t)的值將增長極其緩慢甚至接近停滯,並維持一段時間的穩定,如下圖所示:

  由上圖可以看出,如果一個程式在記憶體裡面的頁面數與其工作集大小相等或者超過工作集,則該程式可在一段時間內不會發生缺頁中斷。如果其在記憶體的頁面數小於工作集,則發生缺頁中斷的頻率將增加,甚至發生記憶體抖動。

  因此,工作計演算法的目標就是維持當前的工作集的頁面在實體記憶體裡面。每次頁面更換時,尋找一個不屬於當前工作集的頁面替換即可。這樣,我們再尋找頁面時只需要將頁面分離為兩大類即可:當前工作集內頁面和當前工作集外頁面。如此,只要找到一個飛當前工作集的頁面,將其替換即可。

  工作集演算法的優點:實現簡單,只需要在頁表的每個記錄增加一個虛擬時間域即可。而且,這個時間域不是每次發生訪問時都需要更新,而是在需要更換頁面時,頁面更換演算法對其進行修改,因此時間成本也不大。

  工作集演算法的缺點:每次掃描頁面進行替換時,有可能需要掃描整個頁表。然而,並不是所有頁面都記憶體裡,因此掃描過程中的一大部分時間將是無用功。另外,由於其資料結構是線性的,會造成每次都按同樣的順序進行掃描,顯得不太公平。

2.10 工作集時鐘演算法

  鑑於工作集演算法的缺點,先驅們將工作集演算法與時鐘演算法結合起來,設計出了工作集時鐘演算法,即使用工作集演算法的原理,但是將頁面的掃描順序按照時鐘的形式組織起來。這樣每次需要替換頁面時,從指標指向的頁面開始掃描,從而達到更加公平的狀態。而且,按時鐘組織的頁面只是在記憶體裡面的頁面,在記憶體外的頁面不放在時鐘圈裡,從而提高實現效率

  鑑於其時間與空間上的優勢,工作集時鐘演算法被大多商業作業系統所採納

參考資料

鄒恆明,《作業系統之哲學原理》,機械工業出版社

作者:周旭龍

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連結。

相關推薦

作業系統核心原理-5.記憶體管理記憶體管理

  在上一篇介紹的幾種多道程式設計的記憶體管理模式中,以交換記憶體管理最為靈活和先進。但是這種策略也存在很多重大問題,而其中最重要的兩個問題就是空間浪費和程式大小受限。那麼有什麼辦法可以解決交換記憶體存在的這些問題呢?答案是分頁,它是我們解決交換缺陷的“不二法門”。 一、分頁記憶體管理 1.1 解決問題之

作業系統核心原理-5.記憶體管理段式記憶體管理

一、分頁系統的缺點   分頁系統存在的一個無法容忍,同時也是分頁系統無法解決的一個缺點就是:一個程序只能佔有一個虛擬地址空間。在此種限制下,一個程式的大小至多隻能和虛擬空間一樣大,其所有內容都必須從這個共同的虛擬空間內分配。 二、分段管理系統 2.1 何為分段管理   分段管理就是將一個程式按照邏輯單

作業系統核心原理-5.記憶體管理基本記憶體管理

  作業系統的兩個角色分別是魔術師和管理者,在管理者這個角色中,除了CPU之外,記憶體是作業系統要管理的另外一個重要資源。記憶體管理需要達到兩個目標:一是地址保護,即一個程式不能訪問另一個程式的地址空間。二是地址獨立,即程式發出的地址應該與物理主存地址無關。這兩個目標就是衡量一個記憶體管理系統是否完善的標準,

作業系統核心原理-3.程序原理程序排程

PS:在多程序併發的環境裡,雖然從概念上看,有多個程序在同時執行,但在單個CPU下,在任何時刻只能有一個程序處於執行狀態,而其他程序則處於非執行狀態。那麼問題來了,我們是如何確定在任意時刻到底由哪個程序執行,哪些不執行呢?這就涉及到程序管理的一個重要組成部分:程序排程,跟隨本篇來一起復習下程序排程吧! 一、

iOS/OS X記憶體管理基本概念與原理

CSDN移動將持續為您優選移動開發的精華內容,共同探討移動開發的技術熱點話題,涵蓋移動應用、開發工具、移動遊戲及引擎、智慧硬體、物聯網等方方面面。如果您想投稿、尋求《近匠》報道,或給文章挑錯,歡迎傳送郵件至tangxy#csdn.net(請把#改成@)。  在Objective-C的記憶體管理中,其實就

《Linux學習並不難》文件系統管理3在Linux系統創建文件系統

Linux xfs 文件系統 18.3 《Linux學習並不難》文件系統管理(3):在Linux系統中創建文件系統使用mkfs命令可以在分區上創建各種文件系統。mkfs命令本身並不執行建立文件系統的工作,而是去調用相關的程序來執行。這裏的文件系統是要指定的,比如xfs、ext4、ext3、vfa

講述Sagit.Framework解決雙向引用導致的IOS記憶體洩漏- IOS不為人知的Bug

前言: 文章寫到最後時,多了很多莫名奇妙的問題!!! 為了解決了這些莫名奇妙的問題,我又戰鬥了24小時〜〜〜 然後終於解決了問題,原來是IOS的隱藏性Bug,只想恨恨的說一聲fuck~~~ 故事起源: 故事是這樣的,為了處理記憶體釋放的問題,正常人的思維,都是給物件的dealloc增加日誌輸出。

解讀ASP.NET 5 & MVC6系列17MVC的其他新特性

(GlobalImport全域性匯入功能) 預設新建立的MVC程式中,在Views目錄下,新增加了一個_GlobalImport.cshtml檔案和_ViewStart.cshtml平級,該檔案的功能類似於之前Views目錄下的web.config檔案,之前我們在該檔案中經常設定全域性匯入的名稱空間,以避免在

解讀ASP.NET 5 & MVC6系列4核心技術與環境配置

asp.net 5是下一代的asp.net,該版本進行了全部重寫以適用於跨平臺,新新版本中,微軟引入瞭如下工具與命令:DNVM、DNX、DNU。 DNVM(.NET Version Manager):由於要實現跨平臺的目錄,微軟提供了DNVM功能,DNVM是ASP.NET最底層的內容,他是一組Powershe

Android 效能優化之記憶體洩漏檢測以及記憶體優化

Android 記憶體洩漏檢測   通過上篇部落格我們瞭解了 Android JVM/ART 記憶體的相關知識和洩漏的原因,再來歸類一下記憶體洩漏的源頭,這裡我們簡單將其歸為一下三類:自身編碼引起由專案開發人員自身的編碼造成;第三方程式碼引起這裡的第三

資料結構基礎溫故-5.圖圖的遍歷演算法

上一篇我們瞭解了圖的基本概念、術語以及儲存結構,還對鄰接表結構進行了模擬實現。本篇我們來了解一下圖的遍歷,和樹的遍歷類似,從圖的某一頂點出發訪問圖中其餘頂點,並且使每一個頂點僅被訪問一次,這一過程就叫做圖的遍歷(Traversing Graph)。如果只訪問圖的頂點而不關注邊的資訊,那麼圖的遍歷十分簡單,使用

資料結構基礎溫故-5.圖最小生成樹演算法

圖的“多對多”特性使得圖在結構設計和演算法實現上較為困難,這時就需要根據具體應用將圖轉換為不同的樹來簡化問題的求解。 一、生成樹與最小生成樹 1.1 生成樹   對於一個無向圖,含有連通圖全部頂點的一個極小連通子圖成為生成樹(Spanning Tree)。其本質就是從連通圖任一頂點出發進行遍歷操作所經過

《逆向工程核心原理》學習總結

介紹 PE檔案是windows作業系統的可執行檔案格式(包括.exe、.scr、.dll、.sys、.obj等檔案),PE檔案指32位的可執行檔案,也稱為PE32。64位可執行檔案稱為PE+或PE32+,是PE32檔案的一種擴充套件形式。 基本結構 P

現代作業系統應用開發UWP——檔案管理FileManagement

背景簡介 我們的UWP程式想要讀寫本地的檔案的時候,往往會遇到許可權問題,這裡存在著兩個解決方法: 第一,電腦上的KnownFolder允許UWP程式直接訪問;這裡的KnowFolder指的是下面圖片中的資料夾: 關於這種方法可以參考第一篇部落格

作業系統真象還原》-閱讀筆記

第七章 作業系統是由中斷驅動的。 中斷分為外部中斷和內部中斷。 外部中斷分為可遮蔽中斷和不可遮蔽中斷,內部中斷分為軟中斷和異常。 外部中斷 來自CPU外部的中斷。 可遮蔽中斷:通過INTR引腳進入CPU,外部裝置如硬碟、網絡卡、印表機等發出的中斷

[linux][MongoDB] mongodb學習MongoDB安裝、管理工具、

ole ont mon mkdir man 管理工具 tar end 認證 參考原文:http://www.cnblogs.com/kaituorensheng/p/5118226.html linux安裝完美實現! 1. mongoDB安裝、啟動、關閉   1.1

Apollo配置中心解惑關於一個portal管理多個環境,要求環境相互之間不影響,獨立

pan program encoding character 建立 環境部署 fat == 127.0.0.1 關於作者的回答很官方,不太懂: https://github.com/ctripcorp/apollo/wiki/%E5%88%86%E5%B8%83%E5%BC

《Linux學習並不難》用戶管理1Linux用戶賬戶分類

Linux 用戶 9.1 《Linux學習並不難》用戶管理(1):Linux用戶賬戶分類用戶賬戶在Linux系統中是分角色的,由於角色不同,每個用戶的權限和所能執行的工作任務也不同。在實際的管理中,用戶的角色是通過UID(用戶ID號)來標識的,每個用戶的UID都是不同的。 在Linux系統中有三大類

《Linux學習並不難》用戶管理2/etc/passwd文件詳細介紹

Linux 用戶 passwd 9.2 《Linux學習並不難》用戶管理(2):/etc/passwd文件詳細介紹/etc/passwd文件是Linux系統識別用戶的一個重要文件,Linux系統中所有的用戶都記錄在該文件中。假設用戶以賬戶zhangsan登錄系統時,系統首先會檢查/etc/pas

《Linux學習並不難》用戶管理3/etc/shadow文件詳細介紹

Linux 用戶 shadow 9.3 《Linux學習並不難》用戶管理(3):/etc/shadow文件詳細介紹/etc/shadow文件是/etc/passwd的影子文件,這兩個文件應該是對應互補的。/etc/shadow文件的內容包括用戶被加密的密碼以及其它/etc/passwd文件不能包