4G的機(jī)器上申請(qǐng)8G的內(nèi)存,是否可以成功?
4G的機(jī)器上申請(qǐng)8G的內(nèi)存,是否可以成功?這個(gè)問題沒有辦法,是沒有辦法進(jìn)行回答,這個(gè)問題要考慮三個(gè)前置條件:
操作系統(tǒng)是 32 位的,還是 64 位的?
申請(qǐng)完 8G 內(nèi)存后會(huì)不會(huì)被使用?
操作系統(tǒng)有沒有使用 Swap 機(jī)制?
先在這說一下結(jié)論:
- 在 32 位操作系統(tǒng),因?yàn)檫M(jìn)程最大只能申請(qǐng) 3 GB 大小的虛擬內(nèi)存,所以直接申請(qǐng) 8G 內(nèi)存,會(huì)申請(qǐng)失敗。
- 在 64 位操作系統(tǒng),因?yàn)檫M(jìn)程最大只能申請(qǐng) 128 TB 大小的虛擬內(nèi)存,即使物理內(nèi)存只有 4GB,申請(qǐng) 8G 內(nèi)存也是沒問題,因?yàn)樯暾?qǐng)的內(nèi)存是虛擬內(nèi)存。如果這塊虛擬內(nèi)存被訪問了,要看系統(tǒng)有沒有 Swap 分區(qū):
如果沒有 Swap 分區(qū),因?yàn)槲锢砜臻g不夠,進(jìn)程會(huì)被操作系統(tǒng)殺掉,原因是 OOM(內(nèi)存溢出);
如果有 Swap 分區(qū),即使物理內(nèi)存只有 4GB,程序也能正常使用 8GB 的內(nèi)存,進(jìn)程可以正常運(yùn)行;
操作系統(tǒng)是 32 位的,還是 64 位的?
為什么要考慮操作系統(tǒng)是 32 位的,還是 64 位的這個(gè)前置條件呢?
我們先來回顧一下之前學(xué)習(xí)的虛擬內(nèi)存的大小的知識(shí)
應(yīng)用程序通過 malloc 函數(shù)申請(qǐng)內(nèi)存的時(shí)候,實(shí)際上申請(qǐng)的是虛擬內(nèi)存,此時(shí)并不會(huì)分配物理內(nèi)存。
當(dāng)應(yīng)用程序讀寫了這塊虛擬內(nèi)存,CPU 就會(huì)去訪問這個(gè)虛擬內(nèi)存, 這時(shí)會(huì)發(fā)現(xiàn)這個(gè)虛擬內(nèi)存沒有映射到物理內(nèi)存, CPU 就會(huì)產(chǎn)生缺頁中斷,進(jìn)程會(huì)從用戶態(tài)切換到內(nèi)核態(tài),并將缺頁中斷交給內(nèi)核的 Page Fault Handler (缺頁中斷函數(shù))處理。
缺頁中斷處理函數(shù)會(huì)看是否有空閑的物理內(nèi)存:
- 如果有,就直接分配物理內(nèi)存,并建立虛擬內(nèi)存與物理內(nèi)存之間的映射關(guān)系。
- 如果沒有空閑的物理內(nèi)存,那么內(nèi)核就會(huì)開始進(jìn)行回收內(nèi)存的工作,如果回收內(nèi)存工作結(jié)束后,空閑的物理內(nèi)存仍然無法滿足此次物理內(nèi)存的申請(qǐng),那么內(nèi)核就會(huì)觸發(fā) OOM 。
32 位操作系統(tǒng)和 64 位操作系統(tǒng)的虛擬地址空間大小是不同的,在 Linux 操作系統(tǒng)中,虛擬地址空間的內(nèi)部又被分為內(nèi)核空間和用戶空間兩部分,如下所示:
通過這里可以看出:
- 32 位系統(tǒng)的內(nèi)核空間占用 1G,剩下的 3G 是用戶空間;
- 64 位系統(tǒng)的內(nèi)核空間和用戶空間都是 128T,剩下的中間部分是未定義的。
32 位系統(tǒng)的場(chǎng)景
因?yàn)?32 位操作系統(tǒng),進(jìn)程最多只能申請(qǐng) 3 GB 大小的虛擬內(nèi)存空間,所以進(jìn)程申請(qǐng) 8GB 內(nèi)存的話,在申請(qǐng)?zhí)摂M內(nèi)存階段就會(huì)失敗。
64 位系統(tǒng)的場(chǎng)景
64 位操作系統(tǒng),進(jìn)程可以使用 128 TB 大小的虛擬內(nèi)存空間,所以進(jìn)程申請(qǐng) 8GB 內(nèi)存是沒問題的,因?yàn)檫M(jìn)程申請(qǐng)內(nèi)存是申請(qǐng)?zhí)摂M內(nèi)存,只要不讀寫這個(gè)虛擬內(nèi)存,操作系統(tǒng)就不會(huì)分配物理內(nèi)存。
注意:即使 malloc 申請(qǐng)的是虛擬內(nèi)存,只要不去訪問就不會(huì)映射到物理內(nèi)存,但是申請(qǐng)?zhí)摂M內(nèi)存的過程中,還是使用到了物理內(nèi)存(比如內(nèi)核保存虛擬內(nèi)存的數(shù)據(jù)結(jié)構(gòu),也是占用物理內(nèi)存的),如果你的主機(jī)是只有 2GB 的物理內(nèi)存的話,大概率會(huì)觸發(fā) OOM。
申請(qǐng)后的8G內(nèi)存是否真的被使用
如果沒有被使用,就不用分配物理內(nèi)存,所以64系統(tǒng)的前提下:一定是可以成功的沒有任何問題。
操作系統(tǒng)有沒有使用 Swap 機(jī)制?
如果申請(qǐng)的內(nèi)存被使用了,也就意味著要進(jìn)行物理內(nèi)存的分配了,這個(gè)時(shí)候就要考慮是否開啟了Swap機(jī)制。
Swap機(jī)制
在系統(tǒng)的物理內(nèi)存不夠用的時(shí)候,把硬盤內(nèi)存中的一部分空間釋放出來,以供當(dāng)前運(yùn)行的程序使用。那些被釋放的空間可能來自一些很長(zhǎng)時(shí)間沒有什么操作的程序,這些被釋放的空間被臨時(shí)保存到Swap分區(qū)中,等到那些程序要運(yùn)行時(shí),再從Swap分區(qū)中恢復(fù)保存的數(shù)據(jù)到內(nèi)存中。
使用 Swap 機(jī)制優(yōu)點(diǎn)是,應(yīng)用程序?qū)嶋H可以使用的內(nèi)存空間將遠(yuǎn)遠(yuǎn)超過系統(tǒng)的物理內(nèi)存。由于硬盤空間的價(jià)格遠(yuǎn)比內(nèi)存要低,因此這種方式無疑是經(jīng)濟(jì)實(shí)惠的。當(dāng)然,頻繁地讀寫硬盤,會(huì)顯著降低操作系統(tǒng)的運(yùn)行速率,這也是 Swap 的弊端。