【关于内存管理:争议很大的问题】

文 | 小林coding

出品 | 小林coding(ID:CodingLin )

已获得原公众号的授权转载

早上看到读者在群里讨论这些面试题(下图1):

其中,第一个问题「在 4GB 物理内存的机器上,申请 8G 内存会怎么样?」存在比较大的争议,有人说会申请失败,有的人说可以申请成功。

这个问题在没有前置条件下,就说出答案就是耍流氓。因为在 32 位操作系统和 64 位操作系统场景下,答案是不同的。

另外,我们还要看申请完 8G 内存后会不会被使用,会被使用是一种情况,不会被使用又是另外一种情况了。

所以,我们要分场景讨论。

正文
应用程序通过 malloc 函数申请内存的时候,实际上申请的是虚拟内存,此时并不会分配物理内存。

当应用程序读写了这块虚拟内存,CPU 就会去访问这个虚拟内存, 这时会发现这个虚拟内存没有映射到物理内存, CPU 就会产生缺页中断,进程会从用户态切换到内核态,并将缺页中断交给内核的 Page Fault Handler (缺页中断函数)处理。

缺页中断处理函数会看是否有空闲的物理内存:

如果有,就直接分配物理内存,并建立虚拟内存与物理内存之间的映射关系。
如果没有空闲的物理内存,那么内核就会开始进行回收内存的工作,如果回收内存工作结束后,空闲的物理内存仍然无法满足此次物理内存的申请,那么内核就会放最后的大招了触发 OOM (Out of Memory)机制。
32 位操作系统和 64 位操作系统的虚拟地址空间大小是不同的,在 Linux 操作系统中,虚拟地址空间的内部又被分为内核空间和用户空间两部分,如下所示:

通过这里可以看出:

32 位系统的内核空间占用 1G,位于最高处,剩下的 3G 是用户空间;
64 位系统的内核空间和用户空间都是 128T,分别占据整个内存空间的最高和最低处,剩下的中间部分是未定义的。
现在可以回答这个问题了:在 32 位操作系统、4GB 物理内存的机器上,申请 8GB 内存,会怎么样?

因为 32 位操作系统,进程最多只能申请 3 GB 大小的虚拟内存空间,所以进程申请 8GB 内存,在申请虚拟内存阶段就会失败(我手上没有 32 位操作系统测试,我估计失败的原因是 OOM)。

在 64 位操作系统、4GB 物理内存的机器上,申请 8G 内存,会怎么样?

64 位操作系统,进程可以使用 128 TB 大小的虚拟内存空间,所以进程申请 8GB 内存是没问题的,因为进程申请内存是申请虚拟内存,只要不读写这个虚拟内存,操作系统就不会分配物理内存。

我们可以简单做个测试,我的服务器是 64 位操作系统,但是物理内存只有 2 GB。
图2

现在,我在机器上,申请 4 GB 内存,注意下面代码只是单纯分配了虚拟内存,并没有使用该虚拟内存:

#include
#include
#include
#include
#include

int main() {

int ret;

char* addr[4];

printf("使用cat /proc/%d/maps查看内存分配\n",getpid());

size_t s = 1024 * 1024 * 1024;

int i = 0;

for(i = 0; i < 4; ++i) {

printf("alloc size = %d\n", s);

addr[i] = (char*) malloc(s);

printf("主线程调用malloc后,申请1gb大小得内存,此内存起始地址:0X%x\n", addr[i]);

}

getchar();

return 0;
}
然后运行这个代码,可以看到,我的物理内存虽然只有 2GB,但是程序正常分配了 4GB 大小的虚拟内存:


我们可以通过下面这条命令查看进程的虚拟内存大小:

# ps aux | grep alloc_4g
USER

PID %CPU %MEM

VSZ

RSS TTY

STAT START

TIME COMMAND
root

7797 0.0 0.0 4198540 352 pts/1

S+

16:58

0:00 ./alloc_4g
其中,VSZ 就代表进程使用的虚拟内存大小,RSS 代表进程使用的物理内存大小。可以看到,VSZ 大小为 4198540,也就是 4GB 的虚拟内存。

然后,我们改一下代码,在申请完虚拟内存后,通过 memset 函数使用这个虚拟内存,看看会发生什么。

#include
#include
#include
#include
#include

int main() {

int ret;

char* addr[4];

printf("使用cat /proc/%d/maps查看内存分配\n",getpid());

size_t s = 1024 * 1024 * 1024;

int i = 0;

for(i = 0; i < 4; ++i) {

printf("alloc size = %d\n", s);

addr[i] = (char*) malloc(s);

printf("主线程调用malloc后,申请1gb大小得内存,此内存起始地址:0X%x\n", addr[i]);

//访问虚拟内存

memset(addr[i], 0, s);

}

getchar();

return 0;
}
运行结果:

图4

可以看到,在申请了 2GB 虚拟内存后,然后马上使用了这块虚拟内存,由于这台机器的物理内存只有 2 GB,所以发生了 OOM。

至此, 验证完成了。简单总结下:

在 32 位操作系统,因为进程最大只能申请 3 GB 大小的虚拟内存,所以直接申请 8G 内存,会申请失败。
在 64位 位操作系统,因为进程最大只能申请 128 TB 大小的虚拟内存,即使物理内存只有 4GB,申请 8G 内存也是没问题,因为申请的内存是虚拟内存,等这块虚拟内存被访问了,因为物理空间不够,就会发生 OOM。

https://t.cn/A6XkOzhh

namo-amitabhaya!

#吉享出行暖心产品#学生惠,无忧行!18-24岁周岁学生旅客于2022年6月10日至7月15日(含)之间乘坐吉祥航空南京出港航班实际出行后,将收到学生专属出行福利礼包![求关注]内含机票改期券、机票优惠券等电子权益。通过“吉祥航空江苏”微信公众号输入关键词“学生惠”,学生旅客还可获得T3出行满减优惠券噢[送花花]

之前采访过一个治疗后完全缓解的古稀之年的患者,当时把他的故事写成了CAR-T公众号的头稿,还在胡院和梅师指导下为他做了查体。几年来的辛苦,一家人终于可以歇下脚,我和爹爹康复出院时的合照还在内存狭窄的手机里存着。
几个月后,爹爹复发了,做第二次CART。这几天在科室为标本奔波,时常看到爹爹的妻子在病房楼道里来回踱步,每次看到我都会问上班啦,下班啦,点着头微笑示意;偶尔,还会看到她和爹爹一起,手牵着手在走廊活动散步,从护士站一段走到职工电梯门前,反复来回这30米,手也不曾松开。
今天看到的时候,突然就很想写下来,以为的自己不敢面对,其实在他们对生命和爱的尊敬下不足一提。
本龙卷风女子要多做自己,去表达自己的真实情感


发布     👍 0 举报 写留言 🖊   
✋热门推荐
  • ”这样,孩子就很容易跟我们讲出幼儿园的事情。这时,孩子通常就会回答我们:“开心!
  • 都喜欢彼此,都有情谊,那却是不一样的,在这段关系里,并不会只是一个人在主动着,而是都特别的主动,并不会总是那么的小心翼翼,而是时时刻刻都可以去表达自己的欢喜。不
  • 截止目前所有转寄台历均已发出,【单人&家族款,拼团中奖&代拍&补贴家族款】除拼团中奖外,其他款台历未在相关台历查询渠道中查到的单号宝宝
  • #帮邻居卖芹菜赚14元被罚10万#·帮邻居卖蔬菜 农残超标面临高额罚款福州市闽侯县人民法院副院长 林孔亮:当时行政强制处罚的催告书上面,有两个字引起了我非常大的
  • ​看了这么多直播间,凡是男人卖女士内衣的,什么卫生巾,卫生棉的,就特别反感,而且他们还讲解的那么仔细,就好像他用过似的,一个男人化着妆在直播间讲解女士内衣,不伦
  • 这里其实我觉得写得一般,可能因为我特别喜欢日常向觉得没有boss也好吧总之就是在上一个轮回的A世界女主男主已经相遇,为了对方互相牺牲最后进入了现在天堂地狱和睦发
  • 按梁的说法,当地主要领导找他一半股权未果,就动用刑事手段灭他全家。当时我的报道出来后,贵州高院发函要收拾我,我就在微博上半夜喊话贵州高院院长,我说愿跟他们院长就
  • 明日(あした)へと Ah…等待着.天明 啊~碧いうさぎ 祈(いの)り続(つづ)ける 碧蓝色的兔子.用心祈祷只为你どこかに居(い)るあなたのため今(いま)の二人(
  • #减肥方法[超话]# 一个月虽然掉秤仅仅➖斤͛‼️但是这体型改变真心很大,看看肚子就很明显[666][666]#减肥##减肥药##瘦身##减肥打卡##中药减肥#
  • 是心动的感觉)27. (。˘•ε•˘。) (我十拿九稳,少你一吻)28. ฅ՞•ﻌ•՞ฅ (把你的双手借给我好吗)ฅฅ*~ (呐,给你)29. (♡ര‿ര)(快
  • 以油护肤真的香,尤其混干皮干皮,这个是精华油,摇匀了用,也没有纯油的黏腻感。4️⃣ 鎏光瓶精华油这个不是很火,但我特别爱!
  • 我震撼于吴教授的学识渊博以及其强大的记忆力,与池州有关的那么多文人墨客,生平经历所著作品,在哪一片区域发生了怎样的故事,甚至精确到了年月日,他都能随手拈来,我讶
  • 我不做菠fw的原因就是我没有时间也没有更多的精力去关注菠萝以外的人,我甚至连菠萝都看不完,一会不见菠我就开始想念菠萝,做fw注定要精力不止在一个人身上,都说fw
  • 」他们挽起衣袖想要揍孩子,但病房里的护理长却及时出现,平静地说:「不要在这里打孩子,让我来处理好吗? 我起身,不免有些好笑,“何琬菁,你不知道这种地方四处都有监
  • #年会化妆[爱心]#今天给小仙女化的年会妆!(礼服,配饰均有出租,欢迎预定[爱你])#清远跟妆##清远化妆师##喜日跟妆##年会化妆##清远年会化妆##舞台化妆
  • 在皖西路一家商场的直达电梯前设置了测温和扫码装置,但记者停留观察到,测温基本上都能正常进行,但安康码扫码主要凭顾客自觉,值班人员并未要求查验。“进入本店的顾客请
  • 为方便旅客规划出行,现将2月22日各汽车站出行班次信息公布如下:汽车中心站:除新蔡、登封线路外,其余线路全部停班。汽车东站:中牟线路9点开始发班,杞县、太康、鹿
  • #王源[超话]##王源23岁且放青山远##王源1108二十三岁生日快乐# 你们好啊你们好 【王源23岁生日抽奖礼包】 ——不能一起追太阳的日子里 我们都万事
  • 蜜思婷小蓝盾 ,据说这款是有防晒效果的,我化妆很少涂防晒,用它的时候也没感觉晒黑,这款上妆确实很细腻,提亮肤色,遮瑕弱一点,但是很水润,追求性价比和皮肤底子比较
  • 而这款精华对于那些喜欢熬夜的,脸色暗沉宝子们来说十分友好,使用之后不但能够让我们的肤色更加的一致,从根源改善皮肤暗沉,暗黄,瓦解皮肤里沉淀的黑色素,没想到皮肤真