虛擬地址
在虛擬內(nèi)存出現(xiàn)以前,程序?qū)ぶ酚玫亩际俏锢淼刂?,這種方式存在幾個問題
1、程序能尋址的范圍是有限的,取決于CPU的地址線條數(shù),比如32位的操作系統(tǒng)可供尋址的范圍是2^32次,即4g。因此每個程序都要分配4g的內(nèi)存,并且這是固定的。因為物流內(nèi)存是有限的,多個進程執(zhí)行的時候,內(nèi)存不夠用,于是沒有分配到資源的進行就只能等待,很沒用效率。
2、由于內(nèi)存是隨機分配的,因此程序運行時的地址也是不正確。
3、缺少安全性,通過指針直接訪問物理地址,其它進程可能會修改其它進程的數(shù)據(jù),甚至內(nèi)核的數(shù)據(jù)。
為了解決上述問題,出現(xiàn)了虛擬內(nèi)存。
每個程序運行都會被分配4g虛擬內(nèi)存(后續(xù)都以32位操作系統(tǒng)為例),虛擬內(nèi)存所對應(yīng)的地址便是虛擬地址,它是連續(xù)的。其實程序以為自己分配到是4g內(nèi)存,但真正被分配到的物理內(nèi)存只有一點點,實際正在運行用了多少內(nèi)存,便會分配多少內(nèi)存。同樣,進程也只是認為內(nèi)存地址是連續(xù)的,實際上,它的數(shù)據(jù)是存儲在多個物理內(nèi)存碎片上,還有一部分存儲在外部存儲器上(磁盤),在需要時,將數(shù)據(jù)交換進內(nèi)存。
進程要訪問一個地址,必須要將虛擬內(nèi)存轉(zhuǎn)換成真正的物理地址。每個進程共享一整塊物理內(nèi)存,每個進程只把自己目前需要訪問的虛擬地址空間映射到物理內(nèi)存上。

頁表的具體訪問過程
1.CPU想訪問虛擬地址所在的虛擬頁,根據(jù)頁表,找出頁表中對應(yīng)的頁表項,判斷有效位
2.若有效位為1,則表示有對應(yīng)的物理地址,直接返回
3.若有效位位0,則表示數(shù)據(jù)在磁盤上,發(fā)生缺頁異常,中斷運行,將磁盤文件內(nèi)容緩存到該物理地址對應(yīng)的頁上,然后將有效位變成1,第二部分存儲物理內(nèi)存對應(yīng)地址。
4.缺頁處理完,返回中斷前的命令,重新執(zhí)行。此時緩存命中
5.將找到的內(nèi)容映射到高速緩存區(qū),CPU從高速緩存區(qū)讀取該值,結(jié)束。
