天天看點

作業系統記憶體詳解 - sea的部落格

作業系統記憶體詳解

程序的簡單介紹

程序是占有資源的最小機關,這個資源當然包括記憶體。在現代作業系統中,每個程序所能通路的記憶體是互相獨立的(一些交換區除外)。而程序中的線程可以共享程序所配置設定的記憶體空間。

在作業系統的角度來看,程序=程式+資料+PCB(程序控制塊)

沒有記憶體抽象

在早些的作業系統中,并沒有引入記憶體抽象的概念。程式直接通路和操作的都是實體記憶體。比如當執行如下指令時:

mov reg1,1000

這條指令會将實體位址1000中的内容指派給寄存器。不難想象,這種記憶體操作方式使得作業系統中存在多程序變得完全不可能,比如MS-DOS,你必須執行完一條指令後才能接着執行下一條。如果是多程序的話,由于直接操作實體記憶體位址,當一個程序給記憶體位址1000指派後,另一個程序也同樣給記憶體位址指派,那麼第二個程序對記憶體的指派會覆寫第一個程序所賦的值,這回造成兩條程序同時崩潰。

沒有記憶體抽象對于記憶體的管理通常非常簡單,除去作業系統所用的記憶體之外,全部給使用者程式使用。或是在記憶體中多留一片區域給驅動程式使用,如圖1所示。

作業系統記憶體詳解 - sea的部落格

第一種情況作業系統存于RAM中,放在記憶體的低位址第二種情況作業系統存在于ROM中,存在記憶體的高位址,一般老式的手機作業系統是這麼設計的。

如果這種情況下,想要作業系統可以執行多程序的話,唯一的解決方案就是和硬碟搞交換,當一個程序執行到一定程度時,整個存入硬碟,轉而執行其它程序,到需要執行這個程序時,再從硬碟中取回記憶體,隻要同一時間記憶體中隻有一個程序就行,這也就是所謂的交換(Swapping)技術。但這種技術由于還是直接操作實體記憶體,依然有可能引起程序的崩潰。

是以,通常來說,這種記憶體操作往往隻存在于一些洗衣機,微波爐的晶片中,因為不可能有第二個程序去征用記憶體。

記憶體抽象

為了解決直接操作記憶體帶來的各種問題,引入的位址空間(Address Space)這個概念,這允許每個程序擁有自己的位址。這還需要硬體上存在兩個寄存器,基址寄存器(base register)和界址寄存器(limit register),第一個寄存器儲存程序的開始位址,第二個寄存器儲存上界,防止記憶體溢出。在記憶體抽象的情況下,當執行

mov reg1,20

這時,實際操作的實體位址并不是20,而是根據基址和偏移量算出實際的實體位址程序操作,此時操作的實際位址可能是:

mov reg1,16245

在這種情況下,任何操作虛拟位址的操作都會被轉換為操作實體位址。而每一個程序所擁有的記憶體位址是完全不同的,是以也使得多程序成為可能。

但此時還有一個問題,通常來說,記憶體大小不可能容納下所有并發執行的程序。是以,交換(Swapping)技術應運而生。這個交換和前面所講的交換大同小異,隻是現在講的交換在多程序條件下。交換的基本思想是,将閑置的程序交換出記憶體,暫存在硬碟中,待執行時再交換回記憶體,比如下面一個例子,當程式一開始時,隻有程序A,逐漸有了程序B和C,此時來了程序D,但記憶體中沒有足夠的空間給程序D,是以将程序B交換出記憶體,分給程序D。如圖2所示。

作業系統記憶體詳解 - sea的部落格

通過圖2,我們還發現一個問題,程序D和C之間的空間由于太小無法令任何程序使用,這也就是所謂的外部碎片。一種方法是通過緊湊技術(Memory Compaction)解決,通過移動程序在記憶體中的位址,使得這些外部碎片空間被填滿。使用緊湊技術會非常消耗CPU資源,一個2G的CPU每10ns可以處理4byte,是以多一個2G的記憶體進行一次緊湊可能需要好幾秒的CPU時間。還有一些讨巧的方法,比如記憶體整理軟體,原理是申請一塊超大的記憶體,将所有程序置換出原記憶體,然後再釋放這塊記憶體,重新加載程序,使得外部碎片被消除。這也是為什麼運作完記憶體整理會狂讀硬碟的原因。

程序記憶體是動态變化的

實際情況下,程序往往會動态增長,是以建立程序時配置設定的記憶體就是個問題了,如果配置設定多了,會産生内部碎片,浪費了記憶體,而配置設定少了會造成記憶體溢出。一個解決方法是在程序建立的時候,比程序實際需要的多配置設定一點記憶體空間用于程序的增長。

一種是直接多配置設定一點記憶體空間用于程序在記憶體中的增長,另一種是将增長區分為資料段和棧(用于存放傳回位址和局部變量),如圖3所示。

作業系統記憶體詳解 - sea的部落格

空間不足的解決方案

當預留的空間不夠滿足增長時,作業系統首先會看相鄰的記憶體是否空閑,如果空閑則自動配置設定,如果不空閑,就将整個程序移到足夠容納增長的空間記憶體中,如果不存在這樣的記憶體空間,則會将閑置的程序置換出去。

記憶體的管理政策

當允許程序動态增長時,作業系統必須對記憶體進行更有效的管理,作業系統使用如下兩種方法之一來得知記憶體的使用情況,分别為1位圖(bitmap) 和連結清單

作業系統記憶體詳解 - sea的部落格

使用位圖,将記憶體劃為多個大小相等的塊,比如一個32K的記憶體1K一塊可以劃為32塊,則需要32位(4位元組)來表示其使用情況,使用位圖将已經使用的塊标為1,未使用的标為0.

而使用連結清單,則将記憶體按使用或未使用分為多個段進行連結。使用連結清單中的P表示從0-2是程序,H表示從3-4是空閑。

使用位圖表示記憶體簡單明了,但一個問題是當配置設定記憶體時必須在記憶體中搜尋大量的連續0的空間,這是十分消耗資源的操作。相比之下,使用連結清單進行此操作将會更勝一籌。還有一些作業系統會使用雙向連結清單,因為當程序銷毀時,鄰接的往往是空記憶體或是另外的程序。使用雙向連結清單使得連結清單之間的融合變得更加容易。還有,當利用連結清單管理記憶體的情況下,建立程序時配置設定什麼樣的空閑空間也是個問題。通常情況下有如下幾種算法來對程序建立時的空間進行配置設定。

臨近适應算法(Next fit)—從目前位置開始,搜尋第一個能滿足程序要求的記憶體空間

最佳- 适應算法(Best fit)—搜尋整個連結清單,找到能滿足程序要求最小記憶體的記憶體空間

最大适應算法(Wrost fit)—找到目前記憶體中最大的空閑空間

首次适應算法(First fit) —從連結清單的第一個開始,找到第一個能滿足程序要求的記憶體空間

虛拟記憶體(Virtual Memory)

虛拟記憶體是現代作業系統普遍使用的一種技術。前面所講的抽象滿足了多程序的要求,但很多情況下,現有記憶體無法滿足僅僅一個大程序的記憶體要求(比如很多遊戲,都是10G+的級别)。在早期的作業系統曾使用覆寫(overlays)來解決這個問題,将一個程式分為多個塊,基本思想是先将塊0加入記憶體,塊0執行完後,将塊1加入記憶體。依次往複,這個解決方案最大的問題是需要程式員去程式進行分塊,這是一個費時費力讓人痛苦不堪的過程。後來這個解決方案的修正版就是虛拟記憶體。

虛拟記憶體的基本思想是,每個程序有用獨立的邏輯位址空間,記憶體被分為大小相等的多個塊,稱為頁(Page).每個頁都是一段連續的位址。對于程序來看,邏輯上貌似有很多記憶體空間,其中一部分對應實體記憶體上的一塊(稱為頁框,通常頁和頁框大小相等),還有一些沒加載在記憶體中的對應在硬碟上,如圖5所示。

作業系統記憶體詳解 - sea的部落格

由圖5可以看出,虛拟記憶體實際上可以比實體記憶體大。當通路虛拟記憶體時,會通路MMU(記憶體管理單元)去比對對應的實體位址(比如圖5的0,1,2),而如果虛拟記憶體的頁并不存在于實體記憶體中(如圖5的3,4),會産生缺頁中斷,從磁盤中取得缺的頁放入記憶體,如果記憶體已滿,還會根據某種算法将磁盤中的頁換出。

而虛拟記憶體和實體記憶體的比對是通過頁表實作,頁表存在MMU中,頁表中每個項通常為32位,既4byte,除了存儲虛拟位址和頁框位址之外,還會存儲一些标志位,比如是否缺頁,是否修改過,寫保護等。可以把MMU想象成一個接收虛拟位址項傳回實體位址的方法。

因為頁表中每個條目是4位元組,現在的32位作業系統虛拟位址空間會是2的32次方,即使每頁分為4K,也需要2的20次方*4位元組=4M的空間,為每個程序建立一個4M的頁表并不明智。是以在頁表的概念上進行推廣,産生二級頁表,二級頁表每個對應4M的虛拟位址,而一級頁表去索引這些二級頁表,是以32位的系統需要1024個二級頁表,雖然頁表條目沒有減少,但記憶體中可以僅僅存放需要使用的二級頁表和一級頁表,大大減少了記憶體的使用。

分頁機制:

為什麼使用兩級頁表

假設每個程序都占用了4G的線性位址空間,頁表共含1M個表項,每個表項占4個位元組,那麼每個程序的頁表要占據4M的記憶體空間。為了節省頁表占用的空間,我們使用兩級頁表。每個程序都會被配置設定一個頁目錄,但是隻有被實際使用頁表才會被配置設定到記憶體裡面。一級頁表需要一次配置設定所有頁表空間,兩級頁表則可以在需要的時候再配置設定頁表空間。

兩級頁表結構

兩級表結構的第一級稱為頁目錄,存儲在一個4K位元組的頁面中。頁目錄表共有1K個表項,每個表項為4個位元組,并指向第二級表。線性位址的最高10位(即位31~位32)用來産生第一級的索引,由索引得到的表項中,指定并選擇了1K個二級表中的一個表。

作業系統記憶體詳解 - sea的部落格

兩級表結構的第二級稱為頁表,也剛好存儲在一個4K位元組的頁面中,包含1K個位元組的表項,每個表項包含一個頁的實體基位址。第二級頁表由線性位址的中間10位(即位21~位12)進行索引,以獲得包含頁的實體位址的頁表項,這個實體位址的高20位與線性位址的低12位形成了最後的實體位址,也就是頁轉化過程輸出的實體位址。

線性位址到實體位址的轉換:

作業系統記憶體詳解 - sea的部落格

擴充分頁

從奔騰處理器開始,Intel微處理器引進了擴充分頁,它允許頁的大小為4MB。

作業系統記憶體詳解 - sea的部落格

頁面高速緩存:

作業系統記憶體詳解 - sea的部落格

頁面替換算法

因為在計算機系統中,讀取少量資料硬碟通常需要幾毫秒,而記憶體中僅僅需要幾納秒。一條CPU指令也通常是幾納秒,如果在執行CPU指令時,産生幾次缺頁中斷,那性能可想而知,是以盡量減少從硬碟的讀取無疑是大大的提升了性能。而前面知道,實體記憶體是極其有限的,當虛拟記憶體所求的頁不在實體記憶體中時,将需要将實體記憶體中的頁替換出去,選擇哪些頁替換出去就顯得尤為重要,如果算法不好将未來需要使用的頁替換出去,則以後使用時還需要替換進來,這無疑是降低效率的,讓我們來看幾種頁面替換算法。

1) 最佳置換算法(Optimal Page Replacement Algorithm)

最佳置換算法是将未來最久不使用的頁替換出去,這聽起來很簡單,但是無法實作。但是這種算法可以作為衡量其它算法的基準。

2) 最近不常使用算法(Not Recently Used Replacement Algorithm)

這種算法給每個頁一個标志位,R表示最近被通路過,M表示被修改過。定期對R進行清零。這個算法的思路是首先淘汰那些未被通路過R=0的頁,其次是被通路過R=1,未被修改過M=0的頁,最後是R=1,M=1的頁。

3) 先進先出頁面置換算法(First-In,First-Out Page Replacement Algorithm)

這種算法的思想是淘汰在記憶體中最久的頁,這種算法的性能接近于随機淘汰。并不好。

改進型FIFO算法(Second Chance Page Replacement Algorithm)

這種算法是在FIFO的基礎上,為了避免置換出經常使用的頁,增加一個标志位R,如果最近使用過将R置1,當頁将會淘汰時,如果R為1,則不淘汰頁,将R置0.而那些R=0的頁将被淘汰時,直接淘汰。這種算法避免了經常被使用的頁被淘汰。

4) 時鐘替換算法(Clock Page Replacement Algorithm)

雖然改進型FIFO算法避免置換出常用的頁,但由于需要經常移動頁,效率并不高。是以在改進型FIFO算法的基礎上,将隊列首位相連形成一個環路,當缺頁中斷産生時,從目前位置開始找R=0的頁,而所經過的R=1的頁被置0,并不需要移動頁。如圖6所示。

最久未使用算法(LRU Page Replacement Algorithm)

LRU算法的思路是淘汰最近最長未使用的頁。這種算法性能比較好,但實作起來比較困難。

算法 描述:

最佳置換算法 無法實作,作為測試基準使用

最近不常使用算法 和LRU性能差不多

先進先出算法 有可能會置換出經常使用的頁

改進型先進先出算法 和先進先出相比有很大提升

最久未使用算法 性能非常好,但實作起來比較困難

時鐘置換算法 非常實用的算法

上面幾種算法或多或少有一些局部性原理的思想。局部性原理分為時間和空間上的局部性

1.時間上,最近被通路的頁在不久的将來還會被通路。

2.空間上,記憶體中被通路的頁周圍的頁也很可能被通路。

=============================================================================================================

作業系統——分頁式記憶體管理

==============================================================================================================

為什麼要引入記憶體管理?

答:多道程式并發執行,共享的不僅僅隻有處理器,還有記憶體,并發執行不過不進行記憶體管理,必将會導緻記憶體中資料的混亂,以至于限制了程序的并發執行。

擴充記憶體的兩種方式?

答:覆寫和交換技術是擴充記憶體的兩種方法

1:覆寫技術。覆寫的基本思想是:由于程式運作時并非任何時候都需要通路程式和資料的各個部分(尤其對大程式而言),是以可以把使用者空間分成一個固定區和若幹個覆寫區。經常活躍的部分放在固定區,其餘部分按照調用關系配置設定。首先将那些即将要通路的段放入覆寫區,其他段放在外存中,在需要調用之前,系統再将其調入覆寫區,替換覆寫區中原有的段。

特點:打破了必須将一個程序的全部資訊裝入主存後才能運作的限制,但是當同時運作的程式的代碼量大于主存時仍不能允許,記憶體中常能更新的隻有覆寫區的段

2:交換技術。交換的基本思想是:把處于等待狀态的程式從記憶體移到輔存,把記憶體空間騰出來,這一過程被稱為換出;把準備好競争CPU運作的而程式從輔存移到主存,這一過程稱為換入。

特點:交換技術主要是在不同的程序之間進行,覆寫則是用于同一個程序。

連續記憶體配置設定管理

答:連續配置設定方式,指為一個使用者配置設定一個連續的記憶體空間。包括:

1:單一連續配置設定。記憶體此時分為系統區和使用者區,系統區隻配置設定給作業系統使用,通常在低位址部分;使用者區為使用者提供。記憶體中隻有一道程式,也無需進行記憶體保護。無外部碎片但是有内部碎片,且存儲器效率低下

2:固定分區配置設定。将記憶體空間劃分為若幹個固定大小的區域,每個分區隻能裝入一道作業。當有空閑分區時,便可以再從外存的後備作業隊列中,選擇适當大小的作業裝入該區,分為(分區大小相等和分區大小不相等兩種方式)無外部碎片但是有内部碎片(分區内部有空間的浪費),且存儲器效率低下,但是可存在多道程式,是用于多道程式并發執行的最簡單的記憶體配置設定方式。

3:動态分區配置設定。也成為可變分區配置設定,它不預先對記憶體進行劃分,而是在程序裝入記憶體時,根據程序的大小動态的建立分區,并使分區的大小正好适合程序的需要,其分區的數目和大小是可變的。但是随着時間的推移,很容易産生外部碎片(區域1程序釋放後20M(區域1),區域2中19M仍在 ,再進入14M,放在區域一原來的地方,程序間的記憶體空間被浪費6M),外部碎片指的是分區以外的存儲空間被浪費

解決問題1:為了解決外部碎片的問題,可以使用“緊湊”技術來解決:作業系統不時的對程序進行移動和整理(需要動态重定位寄存器的支援,較為費時)

解決問題2:動态分區的配置設定問題,

1:首次适應算法,空閑分區以位址遞增的方式連結,配置設定記憶體時順序查找,找到大小滿足要求的第一個空閑分區

通常該算法是最快最好的也是最簡單的。

2:最佳适應算法,空閑分區以容量遞增形成分區鍊,找到第一個滿足要求的空閑分區

實際上新能不佳,因為每次最佳配置設定通常會留下很小的難以利用的記憶體塊,産生外部碎片。

3:最壞适應算法,又稱最大适應算法,空閑分區以容量遞減形成分區鍊,找到第一個滿足要求的空閑分區,也就是挑選出最大的分區

性能較差,因為算法開銷也是需要考慮的一部分

4:鄰近适應算法,又稱循環首次适應算法,也就是從首次适應算法中演變而來,不同的是,從上次查找結束的位置開始繼續查找

性能較差

非連續記憶體配置設定管理

答:根據分區的大小是否固定主要分為分頁和分段的存儲管理方式

非連續配置設定允許一個程式分散的裝入到不相鄰的記憶體分區中,這需要額外的空間去存儲它們的存儲區索引,使得非連續配置設定方式的存儲密度低于連續存儲方式

1.分頁式存儲管理方式

分頁式存儲管理方式,根據運作時是否需要把作業的所有頁面都裝入記憶體才能運作分為基本分頁存儲管理方式和請求分頁存儲管理方式

@基本分頁式存儲管理方式

答:在連續存儲管理方式中,固定分區會産生内部碎片,動态分區會産生外部碎片。這兩種技術對記憶體的使用率都比較低,分頁:把主存空間劃分為大小相等且固定的塊,塊相對較小,作為主存的基本機關,每個程序也以塊為基本機關劃分,程序在執行時,以塊為機關逐個申請主存中的塊空間。

分析:從形式上來看,很像固定分區,但卻有着本質的不同點:1:塊的大小相對于分區來說要小得多 2:程序也按照塊來劃分,運作時按照塊來申請主存,盡管這樣也會産生内部碎片,但是相對于程序的大小來說是非常小的,每個程序平均隻産生半個塊大小的内部碎片

基本概念

程序中的塊稱為頁。

主存中的塊稱為頁框。

外存也以同樣的機關進行劃分,也稱為塊。

程序執行時,向主存申請塊,就産生了頁與頁框的一一對應關系

為友善位址轉換,頁面的大小應該是2的整次幂,頁面的大小也應該适中,太小的話回使得程序的頁面數過多,頁表過長,占用大量的記憶體且增加硬體位址轉換的開銷,降低頁面的換入/換出效率。過大會使得頁内碎片增大,降低記憶體的使用率。是以空間效率和時間效率都應該被考慮在内。

(邏輯位址)位址結構:包含兩部分,第一部分為頁号P,後一部分為頁内偏移量W,位址長度為32位,其中0~11位為頁内位址,即每頁大小為4 KB,12~31位為頁号,位址空間最多允許有2的30次方頁。(二進制與十進制之間的轉換)

頁表:為了便于在記憶體中找到程序的每個頁面對應的實體塊,系統為每個程序建立了一張頁表,記錄頁面在記憶體中對應的實體塊号,頁表一般存在記憶體中。頁表的第一部分存的是頁号,第二部分存的是實體記憶體中的塊号,頁表項的第二部分與位址的第二部分共同組成實體位址。

基本位址變換機構

位址變換機構的任務是将邏輯位址轉換為記憶體中的實體位址,位址變換是借助于頁表實作的(注意十進制與二進制的轉換)位址空間為一維。

第一步:根據邏輯位址計算邏輯位址(頁号 * 頁長 + 偏移位址)中的頁号(P = A/L)和位址偏移量(W = A %L)

邏輯位址A = 2500 B,頁面大小(塊的大小) L = 1 KB, 得到 p = 2, W = 452

第二步:比較頁号P和頁表長度M,若P > M,則産生越界中斷,否則繼續執行

第三步:頁表寄存器中,分為兩部分(頁表起始位址F和頁表長度M),計算頁号P在頁表中對應的實體位址的頁表項位址(對應塊号b) p = 頁表起始項F +頁号P * 頁表項長度,得到實體塊号,直接對應的2頁号對應塊号8(頁号與塊号在頁表中有直接對應),注意:頁表長度:指的是一共有多少頁。頁表項長度:指的是一頁占多大記憶體。

第四步:計算實體位址E = b L +W (塊号 塊大小+位址偏移量)得到E = 8 * 1 KB +452 B = 8644 B ,得到實體空間之後,就可以通路記憶體了。

頁表項大小的确定

以32位邏輯位址為例,位元組為編碼機關,一個頁面的大小為4 KB,是以2的32次方 B 除以4 KB位址空間一共有 1 M 頁,則需要log 2 (1 M) = 20 位才能保證表示範圍能容納所有的頁面,又以位元組為編碼機關,[20 / 8] = 3 B,是以頁表項的大小應該大于等于3 B,取4 B為常見。

将頁表始址與頁号和頁表項長度的乘積相加,便得到該表項在頁表中的位置,

于是可從中得到該頁的實體塊号,将之裝入實體位址寄存器中。

列出式子出來: 頁表始址+頁号x頁表項長度

1)頁表項長度是頁面長度是嗎?

2)如果是頁面長度,那兩者相乘就是整個記憶體的大小來,你想一想整個記憶體都用來存儲頁表可能嗎?

當然是不可能了,首先記憶體被劃分成若幹個和頁面大小相等的片。

每個頁表項代表一個頁面的位址,一般很小。

假設記憶體大小是2GB,頁面大小(實體塊)是4KB,頁表項長度是4B。

則整個記憶體可以被劃分成2GB/4KB=512K個頁面。

頁表的長度=頁表項的長度x頁面的個數=4Bx512K=2M。

記憶體中用2M的大小來存放頁表。

這下清楚了吧,實際上是取了每一個頁号對應的頁面的起始位址,或許還有對應的實體塊号(應該有)。

下面抄寫作業系統中的一句話便于了解:

對于一個具有32位邏輯位址空間的分頁系統(4GB),規定頁面大小為4KB,則在每個程序頁表中的頁表項

可達1M個之多。4GB/4KB=1M

又因為每個頁表項占用1個位元組(1B),故每個程序僅僅其頁表就要占1MB的記憶體空間。

而且還要求是連續的,顯然這是不現實的,解決問題方法:

1)采用離散配置設定方式來解決難以找到一塊連續的大記憶體空間的問題。

2)隻将目前需要的部分頁表項調入記憶體,其餘的頁表項仍然駐留在磁盤上,需要時再調入。

快速位址變換機構

上述方法需要通路兩次記憶體,一次是通路頁表,确定所存取資料或指令的實體位址,一次是根據該實體位址存取資料或者指令。顯然這樣的方法較慢。

為此我們可以在位址變換機構中增設一個具有并行查找能力的高速緩沖存儲器——快表,又稱聯想寄存器,用來存放目前通路的若幹頁表項,加速位址變換過程,命中率達到90%以上

第一步就變為了:将邏輯位址中的頁号直接送入高速緩存寄存器,與快表進行比對,未找到則按慢表處理~

有些處理器設計為快表和慢表同時查找,快表查找成功則終止慢表的查找

兩級頁表

由于引入了分頁管理,程序在執行時不需要将所有頁都調入記憶體頁框中,隻要将儲存有映射關系的頁表存入記憶體中即可,我們這裡考慮一下頁表的大小,以32位邏輯空間,頁面大小4 KB ,頁表項大小4 B 為例,若要實作程序對全部邏輯位址空間的映射,則每個程序需要需要2的20次方(2的32次方 / 2的12次方(也就是頁面的大小 4 KB ))(表示的也就是頁面的個數),約100萬個頁表項。2的20次方個頁表項 * 4 B ,為4 MB ,也就是說每個程序在頁表項這一塊就需要4 MB 的主存空間,顯然這是比較大的記憶體占用。即使不考慮對全部邏輯位址空間的映射,一個邏輯位址空間稍大的程序,其頁表項所占用的主存空間也是過大的。

例:40 MB 的程序,頁表項總共占有(40 MB / 4 KB * 4 B ) 40 KB 的主存空間,頁面大小為4 KB,那麼就需要10 個記憶體頁面來存儲整個頁表,整個程序需要(40 MB / 4 KB )為1萬個頁面,在實際執行中隻需要幾十個頁面進入記憶體框就可以運作, 是以這10個頁面的頁表相對于實際執行的幾十個程序頁面來說,記憶體使用率肯定是比較低的。從另一方面來說,這10個頁面的頁表也并不需要同時儲存在主存中,大多數情況下,映射所需要的頁表項都在頁表的同一個頁面。

綜上,為了壓縮頁表,我們将頁表映射的思想進一步延伸,使用一個層次結構的頁表——兩級頁表,從上例中,我們将10頁的頁表進行位址映射,建立上一級頁表,用于存儲頁表的映射關系。這裡對占10個頁面的頁表進行映射,在上一級頁表中隻需要10個頁表項,是以上一級頁表隻需要1個頁面(4 KB)就足夠表示了。在程序的執行過程中,隻需要将占用1頁的上一級頁表存入主存中即可,程序的頁表和程序的頁面可以後續進行調入。

實際上,我們需要的就是一張索引表,告訴我們第幾張頁表應該上哪去找,這樣就不用将所有的頁表存入主存,是以,這就是頁表的頁表,稱為二級頁表。規定:為了查詢友善,頂級頁表最多隻能有一個頁面。

發表于

2020-04-02 12:02 

sea的部落格 

閱讀(1021) 

評論(0) 

編輯 

收藏 

舉報

作業系統記憶體詳解 - sea的部落格