什么是虛擬內存?
多個進程如果同時操作真實的地址內存的話,會產(chǎn)生沖突。 于是操作系統(tǒng)就提供了一種機制,讓每個進程都仿佛擁有全部的內存地址,這些內存地址是虛擬的,由操作系統(tǒng)提供統(tǒng)一的方式映射到真實的物理地址。
虛擬內存的作用:
- 進程隔離,進程層面不用考慮內存的問題,操作系統(tǒng)會統(tǒng)一包辦
- 靈活的內存管理,操作系統(tǒng)能夠更加靈活的管理和分配資源
- 地址空間擴展
- 內存保護,防止進程訪問未分配給它的內存空間,通過在虛擬地址空間中標記頁的訪問權限,操作系統(tǒng)可以捕捉到地址越界
操作系統(tǒng)是通過內存分段和內存分頁的方式管理虛擬內存地址和物理內存地址之間的關系
內存分段
程序是由若干個邏輯分段組成的,代碼分段、數(shù)據(jù)分段、棧段、堆段組成,不同的段有不同的屬性,所以就用分段的形式分離開。
分段機制下的虛擬內存由兩部分組成,段選擇因子和段內偏移量。段選擇因子里面有段號,段號是段表的索引,段表是一個表,里面保存的有該段的基地址、段的界限和特權等級。段內偏移量應該位于 0 和段界限之間,如果段內偏移量是合法的,就將段基地址加上段內偏移量得到物理內存地址。
分段機制會把程序的虛擬地址分為4個段,每個段在段表中有一個項,在這一個項找到段的基地址,然后加上偏移量,就能找到在物理內存中的地址。
每個段的長度是不一樣的,而且每個段內部都是從0開始編制的。 每個段內部是連續(xù)分配內存,但是段和段之間是離散分配的。
?分段的方式解決了程序員不需要關心具體的物理地址內存的問題,但是有一些不足之處:
- 存在內存碎片(外部碎片),可以通過內存交換的方式解決
- 內存交換的效率低,把內存寫到硬盤上面太慢了
分段的好處是:
- 能產(chǎn)生連續(xù)的內存空間
?內存分頁
內存分頁是為了減少內存碎片、加快內存交換的方式。
分頁是把整個虛擬和物理內存空間切成一段段固定尺寸的大小。每個頁的大小是4k。 虛擬地址與物理地址之間通過頁表來映射。
MMU是內存管理單元?,當進程訪問虛擬內存地址在頁表中查不到時,系統(tǒng)會產(chǎn)生一個缺頁異常,進入系統(tǒng)內核分配物理內存,更新進程頁表,然后再返回用戶空間,恢復進程的運行。
分頁是怎么解決分段的「外部內存碎片和內存交換效率低」的問題?
分頁的話,頁與頁之間是緊密排列的,所以不會存在外部碎片。內存分頁機制分配內存的最小單位是一頁,即使程序不足一頁大小,最少只能分配一個頁,所以頁內會出現(xiàn)內存浪費,所以針對內存分頁機制會存在內部內存碎片的現(xiàn)象。
如果內存分頁不夠,操作系統(tǒng)會把其他正在運行的進程中的最近沒有被使用的內存頁給換出到硬盤上面。 一旦需要的話,再從磁盤上面換入到內存里面。由于一次性換入或者換出的只有少數(shù)幾個頁,所以不用花費太多的時間。
更進一步,分頁的方式使得我們在加載程序的時候,不再需要一次性把全部的程序加載到物理內存中。我們可以在進行虛擬內存和物理內存的頁之間映射之后,并不把真正的頁加載到物理內存里面,而是只有在程序運行中,需要用到對應的虛擬內存頁里面的指令和數(shù)據(jù)的時候,在加載到物理內存中去。
分頁機制下,虛擬地址和物理地址是如何映射的?
虛擬地址分為兩部分,頁號和頁內偏移,頁號是頁表的索引,頁表中存儲的是虛擬頁號和物理頁號,物理頁號可以查找物理內存的基地址,基地址劃傷頁內偏移量就能找到真實的物理地址。
簡單的分頁有什么問題??
32位的環(huán)境下,每個進程的虛擬地址空間都有4GB,一個頁的大小是4kb,那么就會存在4GB / 4KB = 100萬個頁,每個頁中有的頁表項 需要4個字節(jié)大小來存儲,那么整個4GB的映射需要4MB的內存來存儲頁表。 如果有100個進程的話,需要400M來存儲,耗費比較大。
多級頁表是什么?
每個進程的100萬個頁共用的一個頁表 ,該頁表占用的4MB空間。 4M空間來說有些大了,我們把這100萬個頁表項的單級頁再分頁,將一級頁表再分為1024個二級頁表,每個二級頁表中包含1024個頁表項。
分了二級表,映射 4GB 地址空間就需要 4KB(一級頁表)+ 4MB(二級頁表)的內存,這樣占用空間不是更大了嗎?
如果把4GB的虛擬地址全部都映射到了物理內存上的話,確實二級分頁占用的空間更大了,但是,我們不會為一個進程分配太多的內存。
對于每個進程來說,其使用的空間沒有達到4GB,因為會存在部分對應的頁表項都是空的,對于已經(jīng)分配的頁表項,如果最近一段時間沒有被使用,在物理內存緊張的情況下,也是會被換出的。
那么為什么不分級的頁表就做不到這樣節(jié)約內存呢?
保存在內存中的頁承擔的職責是將虛擬內存翻譯成物理地址,假如虛擬地址在頁表中找不到對應的頁表項,計算機系統(tǒng)就不能工作了。
頁表一定要覆蓋全部的虛擬地址空間,不分級的頁表需要100萬個頁表項來映射,而分級的頁表只需要1024個頁表項。
分段和分頁有什么區(qū)別?
- 分段對程序員來說是透明的,但是分段需要程序員顯式的劃分每個段
- 分頁的地址空間是一維的,分段是二維的
- 頁的大小不可變,段的大小可以動態(tài)改變
- 分頁主要用于實現(xiàn)虛擬內存,可以獲得更大的地址空間;分段主要是為了使程序和數(shù)據(jù)可以被劃分為邏輯上獨立的地址空間并且有助于共享和保護
什么是空間交換(內存交換) ?
當內存資源不足的時候,操作系統(tǒng)吧某些頁或者某些段的內容轉移到硬盤的一塊空間上面,從而達到釋放內存空間的效果。
缺頁中斷異常
在了解頁面置換算法之前,我們需要了解一下缺頁中斷異常
當CPU訪問的頁面不在物理內存時,便會產(chǎn)生一個缺頁中斷,請求操作系統(tǒng)將缺頁調入到物理內存。它與一般的中斷不一樣:
- 缺頁中斷在指令執(zhí)行期間產(chǎn)生和處理中斷信號,而在一般的中斷在一條指令執(zhí)行完成之后檢查和處理中斷信息
- 缺頁中斷返回到該指令的開始重新執(zhí)行該指令,一般中斷是返回到該指令的下一個指令執(zhí)行
頁面替換算法有哪些?
最佳頁面置換算法
先進先出頁面置換算法
LRU緩存淘汰算法
時鐘頁面置換算法文章來源:http://www.zghlxwxcb.cn/news/detail-614667.html
最不常用淘汰算法文章來源地址http://www.zghlxwxcb.cn/news/detail-614667.html
到了這里,關于為什么要有虛擬內存?的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!