淺談操作系統之虛擬內存

首先我們來一個概念
虛擬內存,虛擬內存是一種內存管理技術,它會使程序自己認爲自己擁有一塊很大且連續的內存,然而,這個程序在內存中不是連續的,並且有些還會在磁盤上,在需要時進行數據交換
難以實現的物理尋址
我們把內存可以看成一個一維數組,那麼這個數組的下標就是內存的物理地址,CPU用內存的物理地址來定位他想獲取的內存塊(數組中的內容),我們把這種方式稱爲物理尋址
如下圖:
這裏寫圖片描述
我們都知道,我們寫的程序經過編譯器編譯成機器級語言後會被保存到文件中,當我們要運行它的時候,操作系統會將其加載到內存中並交給CPU去處理,CPU只處理一條條的指令。設想一下,如果內存中有一個程序,CPU通過系統總線去和內存中的指令和數據進行交互時,採用物理尋址將非常自然、方便,但是如果是兩個程序或者多個程序會出現怎樣的情況?
這裏寫圖片描述
我們會看到兩個程序中都有一條指令 mov eax (100),注意,這裏的100是相對於正在運行的進程而言(單核),如果直接使用物理地址,那麼就得分析每一個進程中的每一條指令,看看哪一個指令是操作內存的,並且要知道該進程的基值地址,然後把該指令中的位置(偏移量)加上該進程的基地址,分析指令是非常麻煩的,不容易實現,所以,我們引入了虛擬尋址(邏輯地址),如下圖:
這裏寫圖片描述
我們從圖中可以看到,在使用虛擬尋址時(用邏輯地址),CPU會生成一個虛擬地址(邏輯地址),用這個虛擬地址來訪問主存時需要經過一個MMU(內存管理單元)來對這個虛擬地址進行翻譯,把這個虛擬地址變爲真正的物理地址,對於每一個進程而言,它在執行的時候基址寄存器中的值是不一樣的,比如上面的程序1,它的基址寄存器中的值爲0,而對於程序2 寄存器中的值1000,這樣一來CPU就不用分析當前進程中的指令了,當CPU執行一個指令的時候,它就認爲所有關於內存地址的地址都是虛擬地址,然後發給MMU,經過MMU後就會將其翻譯成真實的地址,最後,內存通過系統總線把數據給CPU傳了過去。這裏注意一個問題:MMU怎麼知道當前進程的基地址?這是因爲操作系統知道每一個進程的基地址,MMU(內存管理單元)硬件會利用放在主存中的查詢表來動態地翻譯虛擬地址,該表的內容是由操作系統管理的,也就是說,在進程進行切換的時候,這個基值寄存器中的值是會發生改變的。
那虛擬地址到底長什麼樣?請看下圖:
這裏寫圖片描述
每一個進程都有一個虛擬地址空間,而且結構非常相似
這樣看起來一切順利,但事實並非如此,因爲我們的電腦內存很是有限,有些應用程序它需要很大的內存來運行它,這樣一來,有時內存就不夠用了,那應該怎樣解決呢?
我們想到了局部性原理(上帝的法則),局部性原理有兩個:
① 時間局部性: 意思是說,我電腦中的程序某一條指令在使用完之後,在不久的將來有很大可能再次地使用它
② 空間局部性: 這個是說,我電腦中的某一塊內存在使用時,在不久的將來會使用內存地址相近的一塊內存區域
所以我們決定,我們把應用程序代碼不全部加載到內存中去,只是加載一小部分
接下來我們瞭解幾個新的概念:
虛擬頁和物理頁
虛擬存儲器系統把虛擬存儲器分割成大小固定的塊,這一塊一塊的存儲器中的內容我們稱爲虛擬頁[虛擬頁不是真實存在的,而是邏輯上的],同樣的道理,我們把物理存儲器分割成物理頁(內存中)
擁有虛擬頁地址和物理頁地址信息的頁表
頁表就是一個存放頁表條目(Page Table Entry,PTE)的數組,裏面存放了若干個頁表條目,那麼什麼是頁表條目呢?頁表條目其實就是描述虛擬頁信息的一塊內存[物理](也可以說成數據結構[邏輯])如下圖
這裏寫圖片描述
我們可以簡單地認爲頁表條目是由一個有效位和一個n位地址字段組成,有效位表明了該虛擬頁當前是否被緩存到內存中了
瞭解了頁表,我們再來看看物理頁、虛擬頁和頁表之間的一個關係,虛擬頁是虛擬存儲系統把一個程序的虛擬地址空間劃分了若干個虛擬頁,(注意,這個虛擬頁不是真正存在的東西),虛擬頁有三種情況,一種是未分配的,不佔用內存空間,第二種是未緩存的,也就是以存儲在磁盤上的形式存在,還有一種是緩存的,也就是以存儲在內存中的形式存在,接下來我門來看一個圖
這裏寫圖片描述
從這個圖中我們可以看到,頁表條目其實就是一個虛擬頁的描述,它描述了虛擬頁是否被緩存在內存中(有效位),以及虛擬頁的存儲位置(未分配的爲null,緩存了的指向內存中物理頁的地址,未緩存的指向磁盤中虛擬頁的位置)
下來我們看看這個邏輯地址是如何工作的
在頁面命中時,CPU硬件執行的步驟爲:
第一步:處理器生成一個虛擬地址(VA),並把它傳送給MMU
第二步:MMU生成頁表條目的地址(PTEA),請求內存中的頁表,讓它給自己返回一個頁表條目(PTE)
第三步:MMU構造物理地址(PA),然後把這這個物理地址傳給內存(這時候是真實的物理地址),請求物理內存中的數據
第四步:內存返回所請求的數據給處理器
過程如下圖:
這裏寫圖片描述
這裏我們不討論頁面不命中的時候
我們來看一個總圖,來總結一下今天所提到的知識,看看到底在整個計算機中虛擬存儲技術是如何工作的
這裏寫圖片描述
到這裏,我們可以發現,虛擬內存技術的核心就是利用了局部性原理,把所要運行的進程中的數據不全部加載到內存中執行,而是加載一部分,當CPU在請求頁表時,發現頁表中的頁表條目中的有效位爲0但是被虛擬存儲系統分配了的虛擬頁時,就會把這個虛擬頁從磁盤中調度到內存中(往往磁盤中的數據不常用,而在內存中的物理頁的數據是頻繁使用的數據),這樣一來,我們就實現了多個進程同時加載到內存中並且還佔用不是很多的內存的效果了

更多內容,可關注趣談編程公衆號
這裏寫圖片描述
本文參考《深入理解計算系統》和劉老師的講課

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章