色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

在4G內(nèi)存的機(jī)器上,申請(qǐng)8G內(nèi)存會(huì)怎么樣?

小林coding ? 來源:小林coding ? 2023-01-31 16:41 ? 次閱讀

大家好,我是小林。

這篇文章其實(shí)之前發(fā)過,但是最近有位讀者跟我反饋,我文章中的實(shí)驗(yàn)在 64 位操作系統(tǒng)、2 G 物理內(nèi)存的場(chǎng)景,申請(qǐng) 8G 內(nèi)存是沒問題的,而他也是這個(gè)環(huán)境,為什么他就無法申請(qǐng)成功呢?

然后,我?guī)退挪榱讼拢瓉硎歉?Linux 的 overcommit_memory 參數(shù)有關(guān),這個(gè)參數(shù)主要是定義進(jìn)程申請(qǐng)的內(nèi)存收否允許激進(jìn)。

然后這位讀者很用心,寫了個(gè) world 文檔總結(jié)我和他交流的過程。

我現(xiàn)在把這部分內(nèi)容也補(bǔ)充了進(jìn)來,相比以前的文章會(huì)更全面了一些。

廢話不多說,發(fā)車?yán)保?/p>

正文

看到讀者在群里討論這些面試題:

其中,第一個(gè)問題「4GB 物理內(nèi)存的機(jī)器上,申請(qǐng) 8G 內(nèi)存會(huì)怎么樣?」存在比較大的爭(zhēng)議,有人說會(huì)申請(qǐng)失敗,有的人說可以申請(qǐng)成功。

這個(gè)問題在沒有前置條件下,就說出答案就是耍流氓。這個(gè)問題要考慮三個(gè)前置條件:

操作系統(tǒng)是 32 位的,還是 64 位的?

申請(qǐng)完 8G 內(nèi)存后會(huì)不會(huì)被使用?

操作系統(tǒng)有沒有使用 Swap 機(jī)制?

所以,我們要分場(chǎng)景討論。

操作系統(tǒng)虛擬內(nèi)存大小

應(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)生缺頁(yè)中斷,進(jìn)程會(huì)從用戶態(tài)切換到內(nèi)核態(tài),并將缺頁(yè)中斷交給內(nèi)核的 Page Fault Handler (缺頁(yè)中斷函數(shù))處理。

缺頁(yè)中斷處理函數(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 (Out of Memory)機(jī)制。

32 位操作系統(tǒng)和 64 位操作系統(tǒng)的虛擬地址空間大小是不同的,在 Linux 操作系統(tǒng)中,虛擬地址空間的內(nèi)部又被分為內(nèi)核空間和用戶空間兩部分,如下所示:

6328f62a-97d6-11ed-bfe3-dac502259ad0.png

通過這里可以看出:

32 位系統(tǒng)的內(nèi)核空間占用 1G,位于最高處,剩下的 3G 是用戶空間;

64 位系統(tǒng)的內(nèi)核空間和用戶空間都是 128T,分別占據(jù)整個(gè)內(nèi)存空間的最高和最低處,剩下的中間部分是未定義的。

32 位操作系統(tǒng)的場(chǎng)景

現(xiàn)在可以回答這個(gè)問題了:在 32 位操作系統(tǒng)、4GB 物理內(nèi)存的機(jī)器上,申請(qǐng) 8GB 內(nèi)存,會(huì)怎么樣?

因?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ì)失敗(我手上沒有 32 位操作系統(tǒng)測(cè)試,我估計(jì)失敗的錯(cuò)誤是 cannot allocate memory,也就是無法申請(qǐng)內(nèi)存失敗)。

64 位操作系統(tǒng)的場(chǎng)景

在 64 位操作系統(tǒng)、4GB 物理內(nèi)存的機(jī)器上,申請(qǐng) 8G 內(nèi)存,會(huì)怎么樣?

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)存。

我們可以簡(jiǎn)單做個(gè)測(cè)試,我的服務(wù)器是 64 位操作系統(tǒng),但是物理內(nèi)存只有 2 GB:

634ae532-97d6-11ed-bfe3-dac502259ad0.png

現(xiàn)在,我在機(jī)器上,連續(xù)申請(qǐng) 4 次 1 GB 內(nèi)存,也就是一共申請(qǐng)了 4 GB 內(nèi)存,注意下面代碼只是單純分配了虛擬內(nèi)存,并沒有使用該虛擬內(nèi)存:

#include
#include
#include
#include

#defineMEM_SIZE1024*1024*1024

intmain(){
char*addr[4];
inti=0;
for(i=0;i

然后運(yùn)行這個(gè)代碼,可以看到,我的物理內(nèi)存雖然只有 2GB,但是程序正常分配了 4GB 大小的虛擬內(nèi)存:

63700ee8-97d6-11ed-bfe3-dac502259ad0.png

我們可以通過下面這條命令查看進(jìn)程(test)的虛擬內(nèi)存大小:

#psaux|greptest
USERPID%CPU%MEMVSZRSSTTYSTATSTARTTIMECOMMAND
root77970.00.04198540352pts/1S+16:580:00./test

其中,VSZ 就代表進(jìn)程使用的虛擬內(nèi)存大小,RSS 代表進(jìn)程使用的物理內(nèi)存大小。可以看到,VSZ 大小為 4198540,也就是 4GB 的虛擬內(nèi)存。

開頭說的讀者跟我反饋,說他自己也做了這個(gè)實(shí)驗(yàn),然后發(fā)現(xiàn) 64 位操作系統(tǒng)、2G 物理內(nèi)存的機(jī)子上,在申請(qǐng) 4GB 虛擬內(nèi)存的時(shí)候失敗了,這是為什么呢?

失敗的錯(cuò)誤:

63962eca-97d6-11ed-bfe3-dac502259ad0.png

我當(dāng)時(shí)幫他排查了下,發(fā)現(xiàn)跟 Linux 中的 overcommit_memory 參數(shù)有關(guān),可以使用 cat /proc/sys/vm/overcommit_memory 來查看這個(gè)參數(shù),這個(gè)參數(shù)接受三個(gè)值:

如果值為 0(默認(rèn)值),代表:Heuristic overcommit handling,它允許overcommit,但過于明目張膽的 overcommit 會(huì)被拒絕,比如malloc一次性申請(qǐng)的內(nèi)存大小就超過了系統(tǒng)總內(nèi)存。Heuristic的意思是“試探式的”,內(nèi)核利用某種算法猜測(cè)你的內(nèi)存申請(qǐng)是否合理,大概可以理解為單次申請(qǐng)不能超過free memory + free swap + pagecache的大小 + SLAB中可回收的部分 ,超過了就會(huì)拒絕overcommit。

如果值為 1,代表:Always overcommit. 允許overcommit,對(duì)內(nèi)存申請(qǐng)來者不拒。

如果值為 2,代表:Don’t overcommit. 禁止overcommit。

當(dāng)時(shí)那位讀者的 overcommit_memory 參數(shù)是默認(rèn)值 0 ,所以申請(qǐng)失敗的原因可能是內(nèi)核認(rèn)為我們申請(qǐng)的內(nèi)存太大了,它認(rèn)為不合理,所以 malloc() 返回了 Cannot allocate memory 錯(cuò)誤,這里申請(qǐng) 4GB 虛擬內(nèi)存失敗的同學(xué)可以將這個(gè) overcommit_memory 設(shè)置為1,就可以 overcommit 了。

echo1>/proc/sys/vm/overcommit_memory

設(shè)置完為 1 后,讀者的機(jī)子就可以正常申請(qǐng) 4GB 虛擬內(nèi)存了。

63bc33e0-97d6-11ed-bfe3-dac502259ad0.png

不過我的環(huán)境overcommit_memory 是 0,在 64 系統(tǒng)、2G 物理內(nèi)存場(chǎng)景下,也是可以成功申請(qǐng) 4G 內(nèi)存的,我懷疑可能是不同版本的內(nèi)核在overcommit_memory 為 0 時(shí),檢測(cè)內(nèi)存申請(qǐng)是否合理的算法可能是不同的。

總之,如果你申請(qǐng)大內(nèi)存的時(shí)候,不想被內(nèi)核檢測(cè)內(nèi)存申請(qǐng)是否合理的算法干擾的話,將 overcommit_memory 設(shè)置為 1 就行。

那么將這個(gè) overcommit_memory 設(shè)置為 1 之后,64 位的主機(jī)就可以申請(qǐng)接近 128T 虛擬內(nèi)存了嗎?

不一定,還得看你服務(wù)器的物理內(nèi)存大小。

讀者的服務(wù)器物理內(nèi)存是 2 GB,實(shí)驗(yàn)后發(fā)現(xiàn),進(jìn)程還沒有申請(qǐng)到 128T 虛擬內(nèi)存的時(shí)候就被殺死了。

63e74b8e-97d6-11ed-bfe3-dac502259ad0.png

注意,這次是 killed,而不是 Cannot Allocate Memory,說明并不是內(nèi)存申請(qǐng)有問題,而是觸發(fā) OOM 了。

但是為什么會(huì)觸發(fā) OOM 呢?

那得看你的主機(jī)的「物理內(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。

可以使用 top 命令,點(diǎn)擊兩下 m,通過進(jìn)度條觀察物理內(nèi)存使用情況。

6422cbc8-97d6-11ed-bfe3-dac502259ad0.png

可以看到申請(qǐng)?zhí)摂M內(nèi)存的過程中物理內(nèi)存使用量一直在增長(zhǎng)

6449aca2-97d6-11ed-bfe3-dac502259ad0.png64748fb2-97d6-11ed-bfe3-dac502259ad0.png6490ae2c-97d6-11ed-bfe3-dac502259ad0.png

直到直接內(nèi)存回收之后,也無法回收出一塊空間供這個(gè)進(jìn)程使用,這個(gè)時(shí)候就會(huì)觸發(fā) OOM,給所有能殺死的進(jìn)程打分,分?jǐn)?shù)越高的進(jìn)程越容易被殺死。

在這里當(dāng)然是這個(gè)進(jìn)程得分最高,那么操作系統(tǒng)就會(huì)將這個(gè)進(jìn)程殺死,所以最后會(huì)出現(xiàn) killed,而不是Cannot allocate memory。

那么 2GB 的物理內(nèi)存的 64 位操作系統(tǒng),就不能申請(qǐng)128T的虛擬內(nèi)存了嗎?

其實(shí)可以,上面的情況是還沒開啟 swap 的情況。

使用 swapfile 的方式開啟了 1GB 的 swap 空間之后再做實(shí)驗(yàn):

64ab65a0-97d6-11ed-bfe3-dac502259ad0.png64cd1894-97d6-11ed-bfe3-dac502259ad0.png

發(fā)現(xiàn)出現(xiàn)了 Cannot allocate memory,但是其實(shí)到這里已經(jīng)成功了,

打開計(jì)算器計(jì)算一下,發(fā)現(xiàn)已經(jīng)申請(qǐng)了 127.998T 虛擬內(nèi)存了。

65057d74-97d6-11ed-bfe3-dac502259ad0.png

實(shí)際上我們是不可能申請(qǐng)完整個(gè) 128T 的用戶空間的,因?yàn)槌绦蜻\(yùn)行本身也需要申請(qǐng)?zhí)摂M空間

申請(qǐng) 127T 虛擬內(nèi)存試試:

651e4732-97d6-11ed-bfe3-dac502259ad0.png

發(fā)現(xiàn)進(jìn)程沒有被殺死,也沒有 Cannot allocate memory,也正好是 127T 虛擬內(nèi)存空間。

655969fc-97d6-11ed-bfe3-dac502259ad0.png

在 top 中我們可以看到這個(gè)申請(qǐng)了127T虛擬內(nèi)存的進(jìn)程。

6572a822-97d6-11ed-bfe3-dac502259ad0.png

Swap 機(jī)制的作用

前面討論在 32 位/64 位操作系統(tǒng)環(huán)境下,申請(qǐng)的虛擬內(nèi)存超過物理內(nèi)存后會(huì)怎么樣?

在 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)存。

程序申請(qǐng)的虛擬內(nèi)存,如果沒有被使用,它是不會(huì)占用物理空間的。當(dāng)訪問這塊虛擬內(nèi)存后,操作系統(tǒng)才會(huì)進(jìn)行物理內(nèi)存分配。

如果申請(qǐng)物理內(nèi)存大小超過了空閑物理內(nèi)存大小,就要看操作系統(tǒng)有沒有開啟 Swap 機(jī)制:

如果沒有開啟 Swap 機(jī)制,程序就會(huì)直接 OOM;

如果有開啟 Swap 機(jī)制,程序可以正常運(yùn)行。

什么是 Swap 機(jī)制?

當(dāng)系統(tǒng)的物理內(nèi)存不夠用的時(shí)候,就需要將物理內(nèi)存中的一部分空間釋放出來,以供當(dāng)前運(yùn)行的程序使用。那些被釋放的空間可能來自一些很長(zhǎng)時(shí)間沒有什么操作的程序,這些被釋放的空間會(huì)被臨時(shí)保存到磁盤,等到那些程序要運(yùn)行時(shí),再?gòu)拇疟P中恢復(fù)保存的數(shù)據(jù)到內(nèi)存中。

另外,當(dāng)內(nèi)存使用存在壓力的時(shí)候,會(huì)開始觸發(fā)內(nèi)存回收行為,會(huì)把這些不常訪問的內(nèi)存先寫到磁盤中,然后釋放這些內(nèi)存,給其他更需要的進(jìn)程使用。再次訪問這些內(nèi)存時(shí),重新從磁盤讀入內(nèi)存就可以了。

這種,將內(nèi)存數(shù)據(jù)換出磁盤,又從磁盤中恢復(fù)數(shù)據(jù)到內(nèi)存的過程,就是 Swap 機(jī)制負(fù)責(zé)的。

Swap 就是把一塊磁盤空間或者本地文件,當(dāng)成內(nèi)存來使用,它包含換出和換入兩個(gè)過程:

換出(Swap Out) ,是把進(jìn)程暫時(shí)不用的內(nèi)存數(shù)據(jù)存儲(chǔ)到磁盤中,并釋放這些數(shù)據(jù)占用的內(nèi)存;

換入(Swap In),是在進(jìn)程再次訪問這些內(nèi)存的時(shí)候,把它們從磁盤讀到內(nèi)存中來;

Swap 換入換出的過程如下圖:

660fc9a4-97d6-11ed-bfe3-dac502259ad0.png

使用 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 的弊端。

Linux 中的 Swap 機(jī)制會(huì)在內(nèi)存不足和內(nèi)存閑置的場(chǎng)景下觸發(fā):

內(nèi)存不足:當(dāng)系統(tǒng)需要的內(nèi)存超過了可用的物理內(nèi)存時(shí),內(nèi)核會(huì)將內(nèi)存中不常使用的內(nèi)存頁(yè)交換到磁盤上為當(dāng)前進(jìn)程讓出內(nèi)存,保證正在執(zhí)行的進(jìn)程的可用性,這個(gè)內(nèi)存回收的過程是強(qiáng)制的直接內(nèi)存回收(Direct Page Reclaim)。直接內(nèi)存回收是同步的過程,會(huì)阻塞當(dāng)前申請(qǐng)內(nèi)存的進(jìn)程。

內(nèi)存閑置:應(yīng)用程序在啟動(dòng)階段使用的大量?jī)?nèi)存在啟動(dòng)后往往都不會(huì)使用,通過后臺(tái)運(yùn)行的守護(hù)進(jìn)程(kSwapd),我們可以將這部分只使用一次的內(nèi)存交換到磁盤上為其他內(nèi)存的申請(qǐng)預(yù)留空間。kSwapd 是 Linux 負(fù)責(zé)頁(yè)面置換(Page replacement)的守護(hù)進(jìn)程,它也是負(fù)責(zé)交換閑置內(nèi)存的主要進(jìn)程,它會(huì)在時(shí),回收內(nèi)存頁(yè)中的空閑內(nèi)存保證系統(tǒng)中的其他進(jìn)程可以盡快獲得申請(qǐng)的內(nèi)存。kSwapd 是后臺(tái)進(jìn)程,所以回收內(nèi)存的過程是異步的,不會(huì)阻塞當(dāng)前申請(qǐng)內(nèi)存的進(jìn)程。

Linux 提供了兩種不同的方法啟用 Swap,分別是 Swap 分區(qū)(Swap Partition)和 Swap 文件(Swapfile):

Swap 分區(qū)是硬盤上的獨(dú)立區(qū)域,該區(qū)域只會(huì)用于交換分區(qū),其他的文件不能存儲(chǔ)在該區(qū)域上,我們可以使用 swapon -s 命令查看當(dāng)前系統(tǒng)上的交換分區(qū);

Swap 文件是文件系統(tǒng)中的特殊文件,它與文件系統(tǒng)中的其他文件也沒有太多的區(qū)別;

Swap 換入換出的是什么類型的內(nèi)存?

內(nèi)核緩存的文件數(shù)據(jù),因?yàn)槎加袑?duì)應(yīng)的磁盤文件,所以在回收文件數(shù)據(jù)的時(shí)候, 直接寫回到對(duì)應(yīng)的文件就可以了。

但是像進(jìn)程的堆、棧數(shù)據(jù)等,它們是沒有實(shí)際載體,這部分內(nèi)存被稱為匿名頁(yè)。而且這部分內(nèi)存很可能還要再次被訪問,所以不能直接釋放內(nèi)存,于是就需要有一個(gè)能保存匿名頁(yè)的磁盤載體,這個(gè)載體就是 Swap 分區(qū)。

匿名頁(yè)回收的方式是通過 Linux 的 Swap 機(jī)制,Swap 會(huì)把不常訪問的內(nèi)存先寫到磁盤中,然后釋放這些內(nèi)存,給其他更需要的進(jìn)程使用。再次訪問這些內(nèi)存時(shí),重新從磁盤讀入內(nèi)存就可以了。

接下來,通過兩個(gè)實(shí)驗(yàn),看看申請(qǐng)的物理內(nèi)存超過物理內(nèi)存會(huì)怎樣?

實(shí)驗(yàn)一:沒有開啟 Swap 機(jī)制

實(shí)驗(yàn)二:有開啟 Swap 機(jī)制

實(shí)驗(yàn)一:沒有開啟 Swap 機(jī)制

我的服務(wù)器是 64 位操作系統(tǒng),但是物理內(nèi)存只有 2 GB,而且沒有 Swap 分區(qū):

634ae532-97d6-11ed-bfe3-dac502259ad0.png

我們改一下前面的代碼,使得在申請(qǐng)完 4GB 虛擬內(nèi)存后,通過 memset 函數(shù)訪問這個(gè)虛擬內(nèi)存,看看在沒有 Swap 分區(qū)的情況下,會(huì)發(fā)生什么?

#include
#include
#include
#include

#defineMEM_SIZE1024*1024*1024

intmain(){
char*addr[4];
inti=0;
for(i=0;i

運(yùn)行結(jié)果:

66da83e2-97d6-11ed-bfe3-dac502259ad0.png

可以看到,在訪問第 2 塊虛擬內(nèi)存(每一塊虛擬內(nèi)存是 1 GB)的時(shí)候,因?yàn)槌^了機(jī)器的物理內(nèi)存(2GB),進(jìn)程(test)被操作系統(tǒng)殺掉了。

通過查看 message 系統(tǒng)日志,可以發(fā)現(xiàn)該進(jìn)程是被操作系統(tǒng) OOM killer 機(jī)制殺掉了,日志里報(bào)錯(cuò)了 Out of memory,也就是發(fā)生 OOM(內(nèi)存溢出錯(cuò)誤)。

66f79d4c-97d6-11ed-bfe3-dac502259ad0.png

什么是 OOM?

內(nèi)存溢出(Out Of Memory,簡(jiǎn)稱OOM)是指應(yīng)用系統(tǒng)中存在無法回收的內(nèi)存或使用的內(nèi)存過多,最終使得程序運(yùn)行要用到的內(nèi)存大于能提供的最大內(nèi)存。此時(shí)程序就運(yùn)行不了,系統(tǒng)會(huì)提示內(nèi)存溢出。

實(shí)驗(yàn)二:有開啟 Swap 機(jī)制

我用我的 mac book pro 筆記本做測(cè)試,我的筆記本是 64 位操作系統(tǒng),物理內(nèi)存是 8 GB, 目前 Swap 分區(qū)大小為 1 GB(注意,這個(gè)大小不是固定不變的,Swap 分區(qū)總大小是會(huì)動(dòng)態(tài)變化的,當(dāng)沒有使用 Swap 分區(qū)時(shí),Swap 分區(qū)總大小是 0;當(dāng)使用了 Swap 分區(qū),Swap 分區(qū)總大小會(huì)增加至 1 GB;當(dāng) Swap 分區(qū)已使用的大小超過 1 GB 時(shí);Swap 分區(qū)總大小就會(huì)增加到至 2 GB;當(dāng) Swap 分區(qū)已使用的大小超過 2 GB 時(shí);Swap 分區(qū)總大小就增加至 3GB,如此往復(fù)。這個(gè)估計(jì)是 macos 自己實(shí)現(xiàn)的,Linux 的分區(qū)則是固定大小的,Swap 分區(qū)不會(huì)根據(jù)使用情況而自動(dòng)增長(zhǎng))。

671755ce-97d6-11ed-bfe3-dac502259ad0.png

為了方便觀察磁盤 I/O 情況,我們改進(jìn)一下前面的代碼,分配完 32 GB虛擬內(nèi)存后(筆記本物理內(nèi)存是 8 GB),通過一個(gè) while 循環(huán)頻繁訪問虛擬內(nèi)存,代碼如下:

#include
#include
#include

#defineMEM_SIZE32*1024*1024*1024

intmain(){
char*addr=(char*)malloc((long)MEM_SIZE);
printf("主線程調(diào)用malloc后,目前共申請(qǐng)了32gb的虛擬內(nèi)存
");

//循環(huán)頻繁訪問虛擬內(nèi)存
while(1){
printf("開始訪問32gb大小的虛擬內(nèi)存...
");
memset(addr,0,(long)MEM_SIZE);
}
return0;
}

運(yùn)行結(jié)果如下:

674115a8-97d6-11ed-bfe3-dac502259ad0.png

可以看到,在有 Swap 分區(qū)的情況下,即使筆記本物理內(nèi)存是 8 GB,申請(qǐng)并使用 32 GB 內(nèi)存是沒問題,程序正常運(yùn)行了,并沒有發(fā)生 OOM。

從下圖可以看到,進(jìn)程的內(nèi)存顯示 32 GB(這個(gè)不要理解為占用的物理內(nèi)存,理解為已被訪問的虛擬內(nèi)存大小,也就是在物理內(nèi)存呆過的內(nèi)存大小),系統(tǒng)已使用的 Swap 分區(qū)達(dá)到 2.3 GB。

675c8a86-97d6-11ed-bfe3-dac502259ad0.png

此時(shí)我的筆記本電腦的磁盤開始出現(xiàn)“沙沙”的聲音,通過查看磁盤的 I/O 情況,可以看到磁盤 I/O 達(dá)到了一個(gè)峰值,非常高:

676b67e0-97d6-11ed-bfe3-dac502259ad0.png

有了 Swap 分區(qū),是不是意味著進(jìn)程可以使用的內(nèi)存是無上限的?

當(dāng)然不是。

我把上面的代碼改成了申請(qǐng) 64GB 內(nèi)存后,當(dāng)進(jìn)程申請(qǐng)完 64GB 虛擬內(nèi)存后,使用到 56 GB (這個(gè)不要理解為占用的物理內(nèi)存,理解為已被訪問的虛擬內(nèi)存大小,也就是在物理內(nèi)存呆過的內(nèi)存大小)的時(shí)候,進(jìn)程就被系統(tǒng) kill 掉了,如下圖:

67964d7a-97d6-11ed-bfe3-dac502259ad0.png

當(dāng)系統(tǒng)多次嘗試回收內(nèi)存,還是無法滿足所需使用的內(nèi)存大小,進(jìn)程就會(huì)被系統(tǒng) kill 掉了,意味著發(fā)生了 OOM。

總結(jié)

至此, 驗(yàn)證完成了。簡(jiǎn)單總結(jié)下:

在 32 位操作系統(tǒng),因?yàn)檫M(jìn)程理論上最大能申請(qǐng) 3 GB 大小的虛擬內(nèi)存,所以直接申請(qǐng) 8G 內(nèi)存,會(huì)申請(qǐng)失敗,報(bào)錯(cuò) Cannot allocate memory

在 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)行;

完!

溜啦溜啦!

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 4G
    4G
    +關(guān)注

    關(guān)注

    15

    文章

    5530

    瀏覽量

    119372
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11342

    瀏覽量

    210135
  • 內(nèi)存
    +關(guān)注

    關(guān)注

    8

    文章

    3052

    瀏覽量

    74214
  • 操作系統(tǒng)
    +關(guān)注

    關(guān)注

    37

    文章

    6889

    瀏覽量

    123595
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4345

    瀏覽量

    62868

原文標(biāo)題:在 4G 內(nèi)存的機(jī)器上,申請(qǐng) 8G 內(nèi)存會(huì)怎么樣?

文章出處:【微信號(hào):小林coding,微信公眾號(hào):小林coding】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    淺談4G內(nèi)存對(duì)筆記本的影響 2G內(nèi)存剛剛好

    內(nèi)存是越來越便宜了。很多筆記本用戶購(gòu)買筆記本的時(shí)候都把是否支持4G內(nèi)存作為一個(gè)總要的衡量標(biāo)準(zhǔn)。官方資料里面僅僅支持2G
    發(fā)表于 09-23 18:02

    G-sensor中的±2g、±4g、±8g代表什么意思啊

    G-sensor中的±2g、±4g、±8g代表什么意思啊
    發(fā)表于 05-27 09:29

    選1條8G還是2條4G的DDR內(nèi)存條?ICMAX論如何組建內(nèi)存雙通道

    雙通道,絕大多數(shù)情況下,組建雙通道比單通道效率要高,也就是2條4G內(nèi)存條比單條8G內(nèi)存條效果要好。但也意味著會(huì)多占用一個(gè)
    發(fā)表于 07-10 09:30

    MMCSD卡的32位存儲(chǔ)地址與8G內(nèi)存是如何對(duì)應(yīng)的?

    小弟在學(xué)習(xí)創(chuàng)龍的MMCSD例程時(shí),產(chǎn)生了如下疑問: 測(cè)試函數(shù)MMCSD_Test中,MMCSD卡的起始寫入地址為:也即為32位零地址, 因此疑問就是如果32位的地址最多也會(huì)只能支持讀寫4G內(nèi)
    發(fā)表于 04-30 09:29

    ls1046a ddr內(nèi)存8G升級(jí)到16G硬件和軟件需要哪些改動(dòng)?

    ls1046a ddr 內(nèi)存 8G 升級(jí)到 16G 硬件和軟件需要哪些改動(dòng) ..?
    發(fā)表于 04-10 06:21

    什么叫內(nèi)存3g可用

    什么叫內(nèi)存3g可用    加了內(nèi)存為5G,但是顯示安裝內(nèi)存5G, 可用物理
    發(fā)表于 01-20 10:12 ?2920次閱讀

    4GDDR4對(duì)比8G/16G實(shí)測(cè),你的電腦內(nèi)存真的夠嘛?

    雖然,SSD現(xiàn)在經(jīng)取代內(nèi)存成為電腦升級(jí)的明星硬件,但坦率講,這應(yīng)當(dāng)基于這些年內(nèi)存升級(jí)“玄學(xué)”誘導(dǎo)的多數(shù)主機(jī)內(nèi)存容量水平已然十分優(yōu)秀的前提,比如4G其實(shí)已經(jīng)少見,6
    發(fā)表于 11-11 15:44 ?4.6w次閱讀
    <b class='flag-5'>4GDDR4</b>對(duì)比<b class='flag-5'>8G</b>/16<b class='flag-5'>G</b>實(shí)測(cè),你的電腦<b class='flag-5'>內(nèi)存</b>真的夠嘛?

    傳iPhone8將一破保守的傳統(tǒng)采用8G超速內(nèi)存

    隨著6G內(nèi)存智能手機(jī)市場(chǎng)上廣泛出現(xiàn),今年我們將更加普遍地看到8G內(nèi)存的智能設(shè)備。據(jù)最新消息,三星Galaxy S
    發(fā)表于 01-13 09:08 ?958次閱讀

    運(yùn)行內(nèi)存是什么意思,手機(jī)運(yùn)行內(nèi)存4G和6G區(qū)別很大?

    手機(jī)更新?lián)Q代真的太快了,讓人有點(diǎn)應(yīng)接不暇。想想以前的手機(jī)基本是用來打電話跟接電話的,然后現(xiàn)在手機(jī)拿來打電話的越來越少,已經(jīng)漸漸成為生活中的一個(gè)“好助手”了。以前還只有2G的手機(jī),現(xiàn)在動(dòng)不動(dòng)就6G運(yùn)行內(nèi)存甚至
    發(fā)表于 06-02 08:58 ?9.1w次閱讀

    4G/8G內(nèi)存電腦玩游戲的差別是什么?差距有多大?告訴你這結(jié)果有多驚人

    雖然,SSD現(xiàn)在取代內(nèi)存成為電腦升級(jí)的明星硬件,但坦率講,這應(yīng)當(dāng)基于這些年內(nèi)存升級(jí)“玄學(xué)”誘導(dǎo)的多數(shù)主機(jī)內(nèi)存容量水平已然十分優(yōu)秀的前提,比如4G其實(shí)已經(jīng)少見,6
    發(fā)表于 06-30 14:09 ?9967次閱讀

    一加手機(jī)6為什么用8G內(nèi)存,手機(jī)內(nèi)存的全面解讀

    8G LPDDR 4X是如今手機(jī)運(yùn)行內(nèi)存的頂配,除了擁有8G的大容量外之外,更重要的是LPDDR 4X為這些容量提升了更高的運(yùn)行效率并降低
    發(fā)表于 06-14 13:40 ?2w次閱讀

    手機(jī)內(nèi)存4g和6g的區(qū)別

    大家現(xiàn)在挑選手機(jī),都十分看重外觀和配置。對(duì)于手機(jī)的配置怎么,它的運(yùn)行內(nèi)存有多大也很重要的一點(diǎn)。我們都知道現(xiàn)在手機(jī)都有常見的運(yùn)行內(nèi)存4G、6G
    的頭像 發(fā)表于 03-01 14:36 ?8766次閱讀

    物理內(nèi)存上了8G虛擬內(nèi)存就真的可以關(guān)掉了嗎

    坊間一直有種說法認(rèn)為物理內(nèi)存上了8G,虛擬內(nèi)存就沒用可以關(guān)掉了,但這是不對(duì)的,因?yàn)閃indows操作系統(tǒng)中虛擬內(nèi)存承載了許多超出頁(yè)面文件功能以外的功能。
    的頭像 發(fā)表于 05-07 09:00 ?8609次閱讀

    4G內(nèi)存和6G內(nèi)存的手機(jī)成本差異是多少?

    現(xiàn)在手機(jī)4G內(nèi)存和6G內(nèi)存的成本差異大概有多少呢?實(shí)際,現(xiàn)在大多數(shù)的手機(jī)廠商還是使用LPDDR4
    的頭像 發(fā)表于 07-05 10:38 ?5569次閱讀

    內(nèi)存是怎么映射到物理地址空間的?內(nèi)存是連續(xù)分布的嗎?

    如果我們將兩個(gè)4G內(nèi)存插入內(nèi)存插槽,得到的內(nèi)存地址空間是0到8G嗎?是不是0到4G是第一根
    的頭像 發(fā)表于 06-30 15:59 ?3604次閱讀
    <b class='flag-5'>內(nèi)存</b>是怎么映射到物理地址空間的?<b class='flag-5'>內(nèi)存</b>是連續(xù)分布的嗎?
    主站蜘蛛池模板: 亚洲 欧美 制服 视频二区 | 欧美激情一区二区三区视频 | 在线国内自拍精品视频 | 成人免费观看在线视频 | 亚洲午夜AV久久久精品影院色戒 | 91麻豆精品 | 野花社区视频WWW高清 | 激情午夜307| 乳交高H糙汉宠文 | 国产成人综合在线观看 | 欧美一夜爽爽爽爽爽爽 | 老太脱裤子让老头玩xxxxx | 超碰高清熟女一区二区 | 秋霞电影午夜伦午夜 | 大胸美女被C得嗷嗷叫动态图 | 超碰免费视频在线观看 | 亚洲精品在线播放视频 | 久久亚洲成a人片 | 伊人色综合久久天天网 | 国产精品嫩草99AV在线 | 久久精品成人免费网站 | 草莓视频在线看免费高清观看 | 西西人体一级裸片 | 国产在线观看免费观看 | 国产一卡在线观看完整版 | 97豆奶视频国产 | BLACKED太粗太长 | 美女pk精子2小游戏 美女MM131爽爽爽 | 国产成人一区二区三区在线观看 | 亚洲一区在线视频观看 | 在线观看永久免费网站 | 午夜特级毛片 | 一级毛片西西人体44rt高清 | 2018高清国产一区二区三区 | 久久深夜视频 | 在线免费观看毛片网站 | 私密按摩师在线观看 百度网盘 | 国产真实强被迫伦姧女在线观看 | 在线不卡日本v二区到六区 在线不卡日本v二区 | 玩弄朋友娇妻呻吟交换电影 | 色狠狠色狠狠综合天天 |