虛擬內(nèi)存是計(jì)算機(jī)物理內(nèi)存中劃分出來的一部分。虛擬內(nèi)存是計(jì)算機(jī)系統(tǒng)內(nèi)存管理的一種技術(shù),它通常是被分隔成多個(gè)物理內(nèi)存碎片,還有部分暫時(shí)存儲(chǔ)在外部磁盤存儲(chǔ)器上,在需要時(shí)進(jìn)行數(shù)據(jù)交換。
雙臺(tái)子網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)建站,雙臺(tái)子網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為雙臺(tái)子1000+提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)營(yíng)銷網(wǎng)站建設(shè)要多少錢,請(qǐng)找那個(gè)售后服務(wù)好的雙臺(tái)子做網(wǎng)站的公司定做!
操作系統(tǒng)有虛擬內(nèi)存與物理內(nèi)存的概念。在很久以前,還沒有虛擬內(nèi)存概念的時(shí)候,程序?qū)ぶ酚玫亩际俏锢淼刂贰3绦蚰軐ぶ返姆秶怯邢薜?,這取決于CPU的地址線條數(shù)。比如在32位平臺(tái)下,尋址的范圍是2^32也就是4G。并且這是固定的,如果沒有虛擬內(nèi)存,且每次開啟一個(gè)進(jìn)程都給4G的物理內(nèi)存,就可能會(huì)出現(xiàn)很多問題:
因?yàn)槲业奈锢韮?nèi)存時(shí)有限的,當(dāng)有多個(gè)進(jìn)程要執(zhí)行的時(shí)候,都要給4G內(nèi)存,很顯然你內(nèi)存小一點(diǎn),這很快就分配完了,于是沒有得到分配資源的進(jìn)程就只能等待。當(dāng)一個(gè)進(jìn)程執(zhí)行完了以后,再將等待的進(jìn)程裝入內(nèi)存。這種頻繁的裝入內(nèi)存的操作是很沒效率的
由于指令都是直接訪問物理內(nèi)存的,那么我這個(gè)進(jìn)程就可以修改其他進(jìn)程的數(shù)據(jù),甚至?xí)薷膬?nèi)核地址空間的數(shù)據(jù),這是我們不想看到的
因?yàn)閮?nèi)存時(shí)隨機(jī)分配的,所以程序運(yùn)行的地址也是不正確的。
于是針對(duì)上面會(huì)出現(xiàn)的各種問題,虛擬內(nèi)存就出來了。
一個(gè)進(jìn)程運(yùn)行時(shí)都會(huì)得到4G的虛擬內(nèi)存。這個(gè)虛擬內(nèi)存你可以認(rèn)為,每個(gè)進(jìn)程都認(rèn)為自己擁有4G的空間,這只是每個(gè)進(jìn)程認(rèn)為的,但是實(shí)際上,在虛擬內(nèi)存對(duì)應(yīng)的物理內(nèi)存上,可能只對(duì)應(yīng)的一點(diǎn)點(diǎn)的物理內(nèi)存,實(shí)際用了多少內(nèi)存,就會(huì)對(duì)應(yīng)多少物理內(nèi)存。
進(jìn)程得到的這4G虛擬內(nèi)存是一個(gè)連續(xù)的地址空間(這也只是進(jìn)程認(rèn)為),而實(shí)際上,它通常是被分隔成多個(gè)物理內(nèi)存碎片,還有一部分存儲(chǔ)在外部磁盤存儲(chǔ)器上,在需要時(shí)進(jìn)行數(shù)據(jù)交換。
進(jìn)程開始要訪問一個(gè)地址,它可能會(huì)經(jīng)歷下面的過程
每次我要訪問地址空間上的某一個(gè)地址,都需要把地址翻譯為實(shí)際物理內(nèi)存地址
所有進(jìn)程共享這整一塊物理內(nèi)存,每個(gè)進(jìn)程只把自己目前需要的虛擬地址空間映射到物理內(nèi)存上
進(jìn)程需要知道哪些地址空間上的數(shù)據(jù)在物理內(nèi)存上,哪些不在(可能這部分存儲(chǔ)在磁盤上),還有在物理內(nèi)存上的哪里,這就需要通過頁(yè)表來記錄
頁(yè)表的每一個(gè)表項(xiàng)分兩部分,第一部分記錄此頁(yè)是否在物理內(nèi)存上,第二部分記錄物理內(nèi)存頁(yè)的地址(如果在的話)
當(dāng)進(jìn)程訪問某個(gè)虛擬地址的時(shí)候,就會(huì)先去看頁(yè)表,如果發(fā)現(xiàn)對(duì)應(yīng)的數(shù)據(jù)不在物理內(nèi)存上,就會(huì)發(fā)生缺頁(yè)異常
缺頁(yè)異常的處理過程,操作系統(tǒng)立即阻塞該進(jìn)程,并將硬盤里對(duì)應(yīng)的頁(yè)換入內(nèi)存,然后使該進(jìn)程就緒,如果內(nèi)存已經(jīng)滿了,沒有空地方了,那就找一個(gè)頁(yè)覆蓋,至于具體覆蓋的哪個(gè)頁(yè),就需要看操作系統(tǒng)的頁(yè)面置換算法是怎么設(shè)計(jì)的了。
關(guān)于虛擬內(nèi)存與物理內(nèi)存的聯(lián)系,下面這張圖可以幫助我們鞏固。
頁(yè)表的工作原理如下圖
我們的cpu想訪問虛擬地址所在的虛擬頁(yè)(VP3),根據(jù)頁(yè)表,找出頁(yè)表中第三條的值.判斷有效位。 如果有效位為1,DRMA緩存命中,根據(jù)物理頁(yè)號(hào),找到物理頁(yè)當(dāng)中的內(nèi)容,返回。
若有效位為0,參數(shù)缺頁(yè)異常,調(diào)用內(nèi)核缺頁(yè)異常處理程序。內(nèi)核通過頁(yè)面置換算法選擇一個(gè)頁(yè)面作為被覆蓋的頁(yè)面,將該頁(yè)的內(nèi)容刷新到磁盤空間當(dāng)中。然后把VP3映射的磁盤文件緩存到該物理頁(yè)上面。然后頁(yè)表中第三條,有效位變成1,第二部分存儲(chǔ)上了可以對(duì)應(yīng)物理內(nèi)存頁(yè)的地址的內(nèi)容。
缺頁(yè)異常處理完畢后,返回中斷前的指令,重新執(zhí)行,此時(shí)緩存命中,執(zhí)行1。
將找到的內(nèi)容映射到告訴緩存當(dāng)中,CPU從告訴緩存中獲取該值,結(jié)束。
再來總結(jié)一下虛擬內(nèi)存是怎么工作的
當(dāng)每個(gè)進(jìn)程創(chuàng)建的時(shí)候,內(nèi)核會(huì)為進(jìn)程分配4G的虛擬內(nèi)存,當(dāng)進(jìn)程還沒有開始運(yùn)行時(shí),這只是一個(gè)內(nèi)存布局。實(shí)際上并不立即就把虛擬內(nèi)存對(duì)應(yīng)位置的程序數(shù)據(jù)和代碼(比如.text .data段)拷貝到物理內(nèi)存中,只是建立好虛擬內(nèi)存和磁盤文件之間的映射就好(叫做存儲(chǔ)器映射)。這個(gè)時(shí)候數(shù)據(jù)和代碼還是在磁盤上的。當(dāng)運(yùn)行到對(duì)應(yīng)的程序時(shí),進(jìn)程去尋找頁(yè)表,發(fā)現(xiàn)頁(yè)表中地址沒有存放在物理內(nèi)存上,而是在磁盤上,于是發(fā)生缺頁(yè)異常,于是將磁盤上的數(shù)據(jù)拷貝到物理內(nèi)存中。
另外在進(jìn)程運(yùn)行過程中,要通過malloc來動(dòng)態(tài)分配內(nèi)存時(shí),也只是分配了虛擬內(nèi)存,即為這塊虛擬內(nèi)存對(duì)應(yīng)的頁(yè)表項(xiàng)做相應(yīng)設(shè)置,當(dāng)進(jìn)程真正訪問到此數(shù)據(jù)時(shí),才引發(fā)缺頁(yè)異常。
可以認(rèn)為虛擬空間都被映射到了磁盤空間中(事實(shí)上也是按需要映射到磁盤空間上,通過mmap,mmap是用來建立虛擬空間和磁盤空間的映射關(guān)系的)
利用虛擬內(nèi)存機(jī)制的優(yōu)點(diǎn)
既然每個(gè)進(jìn)程的內(nèi)存空間都是一致而且固定的(32位平臺(tái)下都是4G),所以鏈接器在鏈接可執(zhí)行文件時(shí),可以設(shè)定內(nèi)存地址,而不用去管這些數(shù)據(jù)最終實(shí)際內(nèi)存地址,這交給內(nèi)核來完成映射關(guān)系
當(dāng)不同的進(jìn)程使用同一段代碼時(shí),比如庫(kù)文件的代碼,在物理內(nèi)存中可以只存儲(chǔ)一份這樣的代碼,不同進(jìn)程只要將自己的虛擬內(nèi)存映射過去就好了,這樣可以節(jié)省物理內(nèi)存
在程序需要分配連續(xù)空間的時(shí)候,只需要在虛擬內(nèi)存分配連續(xù)空間,而不需要物理內(nèi)存時(shí)連續(xù)的,實(shí)際上,往往物理內(nèi)存都是斷斷續(xù)續(xù)的內(nèi)存碎片。這樣就可以有效地利用我們的物理內(nèi)存
更多相關(guān)知識(shí),請(qǐng)?jiān)L問:PHP中文網(wǎng)!
分享文章:虛擬內(nèi)存是計(jì)算機(jī)內(nèi)存的一部分嗎?
轉(zhuǎn)載注明:http://weahome.cn/article/cpsdge.html