計(jì)算機(jī)系統(tǒng)中的RAM資源有限,由系統(tǒng)上運(yùn)行的進(jìn)行競(jìng)爭(zhēng)共享佳魔。當(dāng)系統(tǒng)運(yùn)行的多個(gè)應(yīng)用程序時(shí),所有進(jìn)程分配的內(nèi)存總量會(huì)超過(guò)系統(tǒng)上RAM的數(shù)量,這是很常見(jiàn)的一種情況廊镜。
操作系統(tǒng)支持虛擬內(nèi)存,這樣進(jìn)程就可以分配和使用比系統(tǒng)上安裝的RAM數(shù)量還要多的內(nèi)存唉俗。也就是說(shuō)嗤朴,進(jìn)程的空間地址不受物理RAM數(shù)量的限制。有了虛擬內(nèi)存互躬,操作系統(tǒng)便可以使用次級(jí)存儲(chǔ)器(如硬盤(pán))上的后備存儲(chǔ)空間播赁,保存無(wú)法放到RAM中的進(jìn)程的地址空間。然而吼渡,CPU仍然只能訪問(wèn)RAM中的地址容为,因此,操作系統(tǒng)必須在磁盤(pán)后備存儲(chǔ)空間和RAM之間交換數(shù)據(jù),以便能夠在進(jìn)程運(yùn)行時(shí)訪問(wèn)內(nèi)存坎背。
在特定的時(shí)刻替劈,進(jìn)程可能只是需要使用分配的總內(nèi)存的小部分,我們稱之為進(jìn)程的工作集得滤。只要操作系統(tǒng)將這一工作保存到RAM中陨献,就可以忽略虛擬內(nèi)存對(duì)執(zhí)行速度的影響。工作集是一個(gè)動(dòng)態(tài)實(shí)體懂更,根據(jù)進(jìn)程運(yùn)行時(shí)當(dāng)前使用的數(shù)據(jù)而變化眨业。
如果進(jìn)程訪問(wèn)RAM外部的內(nèi)存地址,則需要從硬盤(pán)的后備存儲(chǔ)中讀取對(duì)應(yīng)的數(shù)據(jù)沮协,放到RAM中龄捡。如果當(dāng)前沒(méi)有空閑的RAM用戶數(shù)據(jù)載入,就需要預(yù)先將RAM中現(xiàn)存的一些數(shù)據(jù)換出并保存到磁盤(pán)慷暂,釋放物理RAM聘殖。
虛擬內(nèi)存由操作系統(tǒng)處理。用戶進(jìn)程并不參與這一過(guò)程的實(shí)現(xiàn)行瑞。他不用關(guān)心地址空間是否在RAM中奸腺,也不用關(guān)心訪問(wèn)的數(shù)據(jù)是否轉(zhuǎn)移到了主存中。
使用虛擬內(nèi)存的后果是血久,進(jìn)程使用的地址與物理RAM的地址并不對(duì)應(yīng)突照。只要想一想進(jìn)程地址空間比RAM大,你就明白了洋魂。因此绷旗,需要將進(jìn)程讀寫(xiě)的地址從進(jìn)程的虛擬地址空間轉(zhuǎn)換成物理的RAM地址。由于訪問(wèn)每個(gè)內(nèi)存都要進(jìn)行地址的轉(zhuǎn)換副砍,為了減少對(duì)執(zhí)行速度的影響衔肢,這些工作全都是CPU執(zhí)行的。
操作系統(tǒng)一般使用一種稱為“分頁(yè)”的方案豁翎,來(lái)實(shí)現(xiàn)虛擬地址到物理地址的轉(zhuǎn)換角骤。使用分頁(yè)內(nèi)存方案時(shí),物理內(nèi)存被劃分偉固定長(zhǎng)度的塊心剥,稱為(^-^)頁(yè)幀邦尊。大多數(shù)操作系統(tǒng),包括mac OS 和 iOS,使用的幀長(zhǎng)度均為4096字節(jié)优烧。類似的蝉揍,每個(gè)進(jìn)程的虛擬地址空間也都可以被劃分為固定長(zhǎng)度的塊,稱之為頁(yè)畦娄。每頁(yè)的字節(jié)數(shù)與每幀的字節(jié)數(shù)始終相同又沾。這樣便可以將進(jìn)程中的每頁(yè)映射到物理內(nèi)存中的一個(gè)幀里弊仪。
虛擬內(nèi)存的另一個(gè)優(yōu)點(diǎn)是,進(jìn)程虛擬地址空間中頁(yè)碼連續(xù)的緩沖區(qū)杖刷,可以分布到物理內(nèi)存中多個(gè)不連續(xù)的幀里励饵。這就解決了物理內(nèi)存的碎片問(wèn)題,因?yàn)橐粋€(gè)進(jìn)程分配的內(nèi)存可以分布到多個(gè)物理內(nèi)存段滑燃,