1. 程式人生 > >[作業系統] 虛擬記憶體

[作業系統] 虛擬記憶體

虛擬記憶體

1. 什麼是虛擬記憶體

每個程式擁有自己的地址空間,這個空間被分割成多個塊,每一塊稱作一頁。每一頁有連續的地址範圍。這些頁被對映到實體記憶體,但並不是所有的頁都必須在記憶體中才能執行程式。當程式引用到一部分在實體記憶體中的地址空間時,由硬體立刻執行必要的對映。當程式引用到一部分不在實體記憶體中的地址空間時,由作業系統負責將缺失的部分裝入實體記憶體並重新執行失敗的指令。

2. 為什麼要使用虛擬記憶體

儘管上一篇文章中提到的基址暫存器和界限暫存器可以用於建立地址空間的抽象。但是並沒有考慮到應用程式與記憶體的發展。在現有情況下,需要執行的程式很可能大到記憶體無法容納。所以便誕生了虛擬記憶體。

3. 分頁

大部分虛擬記憶體系統都使用了分頁的技術。在程式中,所產生的地址稱為虛擬地址,它們構成了一個虛擬地址空間。在沒有虛擬記憶體的計算機上,系統直接將虛擬地址送到記憶體總線上,讀寫操作使用具有同樣地址的實體記憶體字;而在使用虛擬記憶體的情況下,虛擬地址不是被直接送到記憶體總線上,而是被送到記憶體管理單元(MMU),並通過它把虛擬地址對映為實體記憶體地址。

分頁

如圖中的例子,有一臺可以產生16位地址的計算機(2^16B),地址範圍從0~64KB,這些地址都為虛擬地址。另外這臺計算機只有32KB的實體記憶體。假如一個程式大小為64KB,虛擬記憶體可以容納64KB的程式,但是因為大於實體記憶體的實際容量,所以這個程式並不能完全調入記憶體執行(磁碟上會有一個該程式的64KB副本,在需要時要被調入到記憶體中)。

虛擬地址空間按照固定大小劃分成叫做頁面的若干單元。在實體記憶體中與之對應的大小相等(通常情況下)的單元稱為頁框。在這個例子中為4KB,所以我們可以得到16個虛擬頁面和8個實體記憶體中的頁框。我們要記住記憶體與磁碟的交換總是以整個頁面為單位執行的。

標記0K~4K的頁面的虛擬地址為0~4095,相應的標記0K~4K的頁框則表示它的實體地址為0~4095。當程式試圖訪問地址0時,執行一條帶有該地址的指令,然後將該**虛擬地址**0送到MMU。MMU看到虛擬地址在頁面0(因為頁面0的虛擬地址範圍是0~4095),根據對映結果(即圖中頁面裡的數字),這一頁面對應的是實體記憶體中的頁框2(實體地址範圍8192~12287),因此MMU該指令的地址變為8192。記憶體對MMU的存在一無所知,只是得到了訪問地址8192的命令,從而MMU有效的將虛擬地址0對映成了實體地址8192。

上述例子中我們用的是頁面的起始地址,如果我們想要訪問虛擬地址20,過程也是一樣的。只不過需要一個偏移量而已。MMU發現該虛擬地址在頁面1,距離起始地址0的偏移量為20。並且發現對應的頁框是2。MMU找到頁框2的其實地址8192,然後加上偏移量地址就變成了8212。

到此,我們解決了如何將虛擬地址對映到實體地址的問題,但並沒有解決虛擬記憶體大於實體記憶體的問題。如果程式想要訪問的虛擬地址是32780(在虛擬頁面8中,頁面8的起始地址為32768)該怎麼辦?我們可以看到該頁面中的標誌是”X”,並不是對應的頁框號,這表明該頁並沒有被對映,在實際的硬體中,用一個“在/不在”位來記錄是否被對映的狀態。

MMU發現該頁面沒有被對映,於是使作業系統陷入到作業系統,這個陷阱稱為缺頁中斷。作業系統在實體記憶體中找到一個很少使用的頁框,並把它寫回到磁碟上。隨後把需要訪問的頁面讀到剛才被回收的頁框中,修改對映關係然後重新啟動引起陷阱的指令。假如作業系統決定回收頁框1,需要對MMU對映做兩處修改。首先將虛擬頁面1改為位對映(因為回收前該頁面對映到頁框1),然後將虛擬頁面8的”X”改為1。完成後,MMU就將虛擬地址32780(32K+12)對映到實體地址4108(4K+12)。

4. MMU如何工作

MMU工作原理

該圖顯示了在16個4KB頁面情況下MMU的內部操作。

該圖中虛擬地址為0010000000000100(對應10進位制的8196),該16位地址被分為:

  1. 高4位的頁號:0010(對應10進位制的2)
  2. 低12位的偏移量:000000000100(對應10進位制的4)

使用4位頁號因為足以表示0~15這16個頁面,12位的偏移量可以表示一頁內全部4096個地址。頁號可以作為頁表的索引並以此得出對應於虛擬頁面的頁框號。該例中,可以找到對應的虛擬頁面為0010即10進位制的2,發現”在/不在”位為1,即該頁面存在對映且對映的值為110。將該值複製到輸出暫存器的高三位,加上虛擬地址中低12位的偏移量即得到實體地址1100000000000100。

要注意的是,使用其他位數來表示頁號也是可以的,不同大小對應不同頁面大小。

5. 頁表

頁表的目的是把虛擬頁面對映為頁框。從數學角度來說,頁表是一個函式,它的引數是虛擬頁號,結果是物理頁框號。通過這個函式可以把虛擬地址中的虛擬頁面替換為頁框,繼而得到實體地址。

頁表項的結構(不同機器並不相同):

  1. 頁框號:最重要的域,因為頁對映的目的就是找到該值。
  2. 在/不在位:該項表示對映是否存在。該位是0就表示對應的虛擬頁面不在實體記憶體中,訪問該頁面會引起缺頁中斷。
  3. 保護位:指出一個頁允許什麼型別的訪問。例如,0表示允許讀/寫,1表示只讀。
  4. 修改位:如果一個頁面在記憶體中被修改過,則必須寫回磁碟。如果未被修改過,則可以不寫回。因為是從磁碟中讀入記憶體的,所以磁碟中存在它的有效副本。這一位經常被稱為髒位。
  5. 訪問位:用來幫助選擇要被淘汰的頁面。
  6. 禁止快取記憶體位:對於那些對映到裝置暫存器(針對I/O裝置)而不是常規記憶體內的頁面,非常重要。例如,一個I/O裝置要對作業系統作出響應,如果從快取記憶體中讀取副本,可能是過時的副本。

6. 分頁式系統中的問題

在分頁式系統中,我們需要考慮兩個問題

  1. 虛擬地址到實體地址的對映必須非常快。因為每次訪問記憶體,都需要進行對映。所有的指令最終都必須來自記憶體,並且很多指令也會訪問記憶體中的運算元。

  2. 如果虛擬地址空間很大,頁表也會很大。計算機至少使用32位的虛擬地址,而現在大多數位64位。假設頁長為4KB,32位的地址空間對應的大小是4,194,304KB,即需要100萬頁,那麼頁表需要100萬條頁表項。另外,每個程序都有自己的地址空間,即每個程序都有自己的頁表。

所以我們需要採用下面提及的一些方法

7. 加速分頁過程

加速分頁過程可以解決對映速度較慢的問題。

1. 轉換檢測緩衝區

假設一條指令要把一個暫存器中的資料複製到另一個暫存器。在不分頁的情況下,這條指令訪問一次記憶體,即從記憶體中取指令。而有了分頁後,因為要訪問頁表引起多次訪問記憶體,這樣必定會影響效能。

研究者發現,大多數程式總是對少量的頁面進行多次訪問。因此實際上只有很少的頁表項會被反覆讀取。解決方法是使用一種硬體裝置稱為轉換檢測緩衝區(TLB),可以將虛擬地址直接對映到實體地址,而不必再訪問頁表,有時這種裝置也被稱為相聯儲存器。它通常在MMU中,包含少量的表項。每個表項記錄一個頁面的資訊(包含虛擬頁號、修改位、保護位、和對應的頁框),每一項與頁表中的域一一對應,但增加了虛擬頁號(頁表中可以沒有)和有效位,記錄表項是否在使用。

TLB

工作原理:將一個虛擬地址放入MMU進行轉換,硬體首先通過將該虛擬頁號與TLB中所有表項進行匹配,如果虛擬頁面在其中,且要進行的訪問不違反保護位。則將頁框號直接從TLB取出,而不必訪問頁表。如果不符合保護位,則產生保護錯誤。當虛擬頁號不在TLB中時(失效)。則進行正常的頁表查詢,然後從TLB中淘汰一個表項,並使用新的頁表項代替。當一個表項從TLB被清除時,將修改位複製到記憶體中的頁表項,除了訪問位,其他值不變。當頁表項從頁表裝入到TLB時,所有值都來自記憶體。

2. 軟體TLB管理

當發生TLB實效時,不再是由MMU到頁表中查詢並取出需要的頁表項,而是生成一個TLB失效並將問題交給作業系統解決。系統必須先找到該頁面,然後從TLB中刪除一個項,接著裝載一個新的項,最後在執行先前出錯的指令。

無論是使用硬體還是軟體來處理TLB失效,常見方法都是找到頁表並執行索引操作以定位要訪問的頁面。用軟體代替硬體找到頁表並執行索引操作以定位將要訪問的頁面。這樣產生的問題是,頁表可能不在TLB中,會導致處理過程中額外的TLB失效。採用的解決方法是可以再記憶體中的固定位置,維護一個大的TLB表項的軟體快取記憶體(該快取記憶體的頁面總是被儲存在TLB中)來減少TLB失效。

兩種不同的失效:

  1. 當一個頁面訪問在記憶體中而不再TLB中時,會產生軟失效。此時要做的是更新TLB,不需要磁碟I/O。
  2. 當頁面本身不在記憶體中,則產生硬失效,此時需要一次磁碟存取以裝入該頁面。

7. 針對大記憶體的頁表

如何處理巨大的虛擬地址空間

1. 多級頁表

多級頁表

在上圖的例子中,32位的虛擬地址被劃分為10位的PT1域,10位的PT2域和12位的偏移量。因為偏移量(Offset)為12位,所以對應的頁面長度為2^12B,即4KB,共有2^20個頁面。

引入多級頁表的原因是避免把全部頁表一直儲存在記憶體中。特別是那些從不需要的頁表。例如,一個需要12MB記憶體的程序,最底端為4MB程式正文段,然後是4MB的資料段,頂端是4MB的堆疊段,在資料段上方和堆疊段下方是大量沒有使用的空閒區。

在圖示的例子中,針對一個4GB(32位地址對應的大小)大的虛擬地址空間,用一個具有1024個表項的頂級表。並用PT1域的值對應,這時虛擬空間會被分為1024個4MB的空間,即頂級表中每一個表項對應的是一個4MB的空間。

頂級表的表項0指向程式正文的頁表,表項1指向資料頁表,表項1023指向堆疊頁表,其他表項沒有使用。PT1的值作為頂級表的索引,PT2的值作為二級頁表的索引。

假如,有一個32位虛擬地址0x00403004(對應10進位制的4,206,596),位於資料部分12292位元組處。通過該虛擬地址的2進位制0000 0000 0100 0000 0011 0000 0000 0100可得,PT1=1,PT2=3,Offset=4。

先用PT1作為索引訪問頂級頁表中的表項1,則地址範圍為4MB~8MB。然後使用PT2作為索引訪問對應4MB~8MB的二級頁表,應為表項3,虛擬地址範圍應是12288~16383絕對地址此時為(4MB+12288~4MB+16383 = 4206592~4210687)把該值加上偏移量4,則為實際的實體地址4206596。

在該方法中,實際只需要4個頁表,頂級頁表,正文段(0~4MB),資料段(4~8MB),堆疊段(頂端4MB)的二級頁表。頂級表中其他1021個表項的”在/不在位都設為0”,訪問它們時強制產生缺頁中斷。作業系統應該採取行動,如殺死程序。

可以將二級頁表擴充為三級、四級、甚至更多級。級別越多,靈活性越大,但會增加複雜性。而且,此方法對於64位的機器並不友好,所需要頁表太大,可使用下面的方法。

2. 倒排頁表

實際實體記憶體中每一個頁框有一個表項,而不是每一個虛擬頁面有一個表項。例如,對於64位虛擬地址4KB的頁,1GB記憶體,一個倒排頁表只需要262144個頁表項 (1GB/4KB)。可以節省大量空間(當虛擬記憶體比實體記憶體大的時候)。

但是從虛擬地址到實體地址的轉換很困難。當程序n訪問虛擬頁面p時,硬體不再能通過把p當做索引來查詢物理頁框。取而代之,必須搜尋整個倒排表來查詢一個表項(n, p)。此外,該搜尋必須對每一個記憶體訪問操作都要執行一次,而不僅僅是在發生缺頁中斷時執行。

可以使用TLB解決,記錄頻繁使用的頁面,地址轉換就可能變的和正常頁表一樣快。但是當TLB失效時,需要搜尋整個倒排表。一個解決方法是,可以為此建立一張散列表,使用虛擬地址來雜湊。當前所有在記憶體中具有相同雜湊值的虛擬頁面被連結在一起。如果散列表中的槽數和物理頁面數一樣多,那麼散列表的衝突鏈的平均長度會是1個表項。一旦頁框號被找到,新的(虛擬頁號,物理頁框號)對就會被裝載到TLB中。

參考書目:現代作業系統第三版

相關推薦

作業系統虛擬記憶體中的四種典型頁替換演算法(OPT,LRU,FIFO,Clock)

 頁面置換:在地址對映過程中,若在頁面中發現所要訪問的頁面不再記憶體中,則產生缺頁中斷(page fault)。當發生缺頁中斷時作業系統必須在記憶體選擇一個頁面將其移出記憶體,以便為即將調入的頁面

[作業系統] 虛擬記憶體

虛擬記憶體 1. 什麼是虛擬記憶體 每個程式擁有自己的地址空間,這個空間被分割成多個塊,每一塊稱作一頁。每一頁有連續的地址範圍。這些頁被對映到實體記憶體,但並不是所有的頁都必須在記憶體中才能執行程式。當程式引用到一部分在實體記憶體中的地址空間時

深入理解作業系統虛擬記憶體

最近用java NIO的時候涉及到虛擬記憶體的知識,看了網上一些資料感覺寫的都不直觀,決定自己整理一下。 先解釋幾個名詞: 虛擬記憶體 現代作業系統中的程序在使用記憶體的時候,都不是直接訪問記憶體實體地址的,程序訪問的都是虛擬記憶體地址,然後虛擬

作業系統——虛擬記憶體管理

面試問題彙總: 1.邏輯地址、線性地址,實體地址,虛擬地址分別是什麼 實體地址,CPU地址匯流排傳來的地址,實體地址中很大一部分是留給記憶體條中的記憶體的 線性地址(Linear Address)也叫虛擬地址(virtual address)是邏輯地址到實體地址變換之間

[作業系統]虛擬記憶體和swap分割槽

轉自:http://www.cnblogs.com/nerrissa/p/4237179.html 首先,這兩個概念分別對應windows和linux,即:windows:虛擬記憶體 linux:swap分割槽 windows即使實體記憶體沒有用完也會去用到虛擬記憶體,而Linux不一樣 Linux只有當實

第八章—虛擬記憶體【計算機作業系統

8.1 簡單分頁與虛擬分頁有什麼區別? 簡單分頁:一個程式中的所有的頁都必須在主儲存器中程式才能正常執行,除非使用覆蓋技術。 擬記憶體分頁:不是程式的每一頁都必須在主儲存器的幀中來使程式執行,頁在需要的時候進行讀取。 8.2 解釋什麼是抖動。 虛擬記憶體結構的震動現象,在這

3.作業系統簡單介紹 作業系統發展歷史 批處理分時系統 作業系統是什麼 作業系統對檔案的抽象 程序 虛擬記憶體是什麼 作業系統作用 作業系統功能

作業系統 其實 作業系統並不是與計算機硬體一起誕生的 它是在人們使用計算機的過程中,為了管理硬體資源,提高效能提高資源利用率,而逐步地形成和完善起來的。 作業系統也是一種程式,負責管理系統資源 上電自檢(經過BIOS)之後,處理器第一個要處理的程式 之所以叫做作業系統,其實就相當於它提供

淺談作業系統虛擬記憶體

我們把記憶體可以看成一個一維陣列,那麼這個陣列的下標就是記憶體的實體地址,CPU用記憶體的實體地址來定位他想獲取的記憶體塊(陣列中的內容),我們把這種方式稱為物理定址。 如下圖: 我們都知道,我們寫的程式經過編譯器編譯成機器級語言後會被儲存到檔案中,當我們要執行它的時候,作業系統會將其載入到記憶體中並

作業系統--記憶體學習筆記(2)程序記憶體管理--虛擬記憶體

虛擬記憶體(virtual memory) = CPU + MMU(Memory Management Unit), MMU是一個CPU上的元器件,它將實體地址對映為虛擬地址,這樣CPU可以之別虛擬地址,而不是實際實體地址了。使用MMU的好處有 1、同一個虛擬地址可以指向不

3、作業系統記憶體管理——段頁式(虛擬記憶體

注:參考哈工大李治軍老師公開課。本小節需要之前分段與分頁為基礎 對使用者而言,分段是對記憶體的有效使用;而對於計算機而言,分頁可以提高記憶體的使用效率。作業系統需要滿足兩個方面的需求,所以就採取了段頁相結合的方式來管理記憶體。 對於使用者而言,當用戶發出一個邏輯地址,

作業系統概念(第九章) 虛擬記憶體

背景 第八章所介紹的記憶體管理演算法都是基於一個基本要求:執行指令必須在實體記憶體中,滿足這一要求的第一種方法是整個程序放在記憶體中。動態載入能幫助減輕這一限制,但是它需要程式設計師特別小心地做一些額外的工作。 指令必須都在實體記憶體內的這一限制,似乎是必須

作業系統記憶體分頁管理、虛擬記憶體介紹

今天這篇關於作業系統的方面的技術文章,我們繼續為各位朋友們講解關於作業系統的記憶體方面的內容。今天 我們主要為各位朋友們講解記憶體分頁管理、虛擬記憶體介紹。傳統儲存管理方式的特徵上一節所討論的各種記憶體管理策略都是為了同時將多個程序儲存在記憶體中以便允許多道程式設計。它們都

作業系統真實的虛擬記憶體是什麼樣的(三. committed memory)

1. commit limit與current commit charge接上文,我們看到testlimit -r開關,只是預留虛擬記憶體,並沒有實際進行提交(commit)。預留虛存並不儲存資料或程式碼,但有時候應用需要這個預留(就像預訂坐位一樣),用以建立大塊虛存,並且在

作業系統虛擬記憶體+儲存管理選擇題

Chapter 9虛擬記憶體 1、基本概念 (1)定義: 虛擬儲存器是具有請求調入功能和置換功能,能僅把程序的一部分裝入記憶體便可執行程序的儲存管理系統,它能從邏輯上對記憶體容量進行擴充的一種虛擬的儲存器系統 (2)區域性性原理: ①時間區域性性 ②空間區域性性 2、De

每天3分鐘作業系統修煉祕籍(8):虛擬記憶體分段

點我檢視祕籍連載 程序的地址空間佈局:分段 Linux的虛擬地址空間採用“分段+分頁”結合的方式實現。先看分段,之後再介紹分頁。 分段是將記憶體劃分成各個段落(Segment),每個段落的長度可以不同,且虛擬地址空間中未使用的空間不會對映到實體記憶體中,所以作業系統不會為這段空間分配實體記憶體。這樣的話,核心

讀懂作業系統虛擬記憶體(一)

前言 由於個人對虛擬記憶體這塊特別感興趣,所以就直接暫且跳過其他,接下來將通過幾篇文章進行詳細講解,當然其他基礎內容後續在我進行相應整體學習後也會同步輸出文章,比如作業系統概念、程式連結、程序管理、頁面置換演算法、流水線、浮點指令、記憶體管理、磁碟管理等內容。不管周遭的環境如何,畢竟還很菜,堅持每天讓自己進步

讀懂作業系統虛擬記憶體地址翻譯原理分析篇(二)

前言 上一節我們整體概括通過MMU將虛擬地址翻譯為實體地址的轉換,這個過程都是按序就班的進行,一切都是基於已提前建立、分配虛擬頁、物理頁以及命中的前提,只是給和我一樣沒怎麼系統學習作業系統的童鞋首先在腦海裡有個大概的印象,本節我們從源頭開始分析為程式建立程序到對映到主存上整個詳細過程,本文將通過大量圖解來分析

讀懂作業系統虛擬記憶體TLB與快取(cache)關係篇(四)

前言 前面我們講到通過TLB快取頁表加快地址翻譯,通過上一節快取原理的講解為本節做鋪墊引入TLB和快取的關係,同時我們來完整梳理下從CPU產生虛擬地址最終對映為實體地址獲取資料的整個過程是怎樣的,若有錯誤之處,還請批評指正。 TLB和快取序列訪問(Serial TLB & Cache Access)

讀懂作業系統虛擬記憶體頁表(五)

前言 在一個擁有32位的地址空間,4KB的頁面(212),並且每個PTE為4個位元組,那麼頁表大小為4MB(4 * 232 / 212),但若為64位地址空間,4KB的頁面(212)且每個PTE為4位元組,那麼頁表大小為16TB(4 * 264 / 212),由於頁表常駐記憶體,佔用記憶體

ucore作業系統學習(三) ucore lab3虛擬記憶體管理分析

1. ucore lab3介紹 虛擬記憶體介紹   在目前的硬體體系結構中,程式要想在計算機中執行,必須先載入至物理主存中。在支援多道程式執行的系統上,我們想要讓包括作業系統核心在內的各種程式能併發的執行,而物理主存的總量通常是極為有限的,這限制了併發程式的發展。受制於成本問題,擁有足夠大容量主存的個人計算機