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

文 | 小林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 举报 写留言 🖊   
✋热门推荐
  • 整理的一些特殊英文文案ॱଳॱᵀʰᵉʳᵉ ⁱˢ ⁿᵒ ᵒⁿᵉ ᵉˡˢᵉ, ʸᵒᵘ ᵃʳᵉ ᵉᵛᵉʳʸʷʰᵉʳᵉ. 入目无别人,四下皆是你.Fⁱʳᵉʷᵒᵒᵈ, ʳ
  • 认清现实好吗,你就是个普普通通没钱没权的追星狗,安静的舔你的屏,买你的代言,支持影视票房和播放量就好,其它的真的不用你插手,你真不是那块料? 向往饭圈的平静美
  • 拼多多是真正的官方项目,2•供应链不一样,拼多多全面开放供应链!拼多多「社交电商」项目万级项目即将公测自用省钱,分享赚钱0门槛管道模式,即将火爆整个朋友圈,炸开
  • 岂无要津水,咫尺有波澜。“曾经沧海难为水,除却巫山不是云。
  • #豆子综艺宅急送# 周日综艺都在这里啦![憧憬]《来自手机的你》 芒果tv 12:00嘉宾:沈凌 刘烨 肖骁 冷凇博士 薇娅 周笔畅#青春有你2# 爱奇艺
  • 微笑是身体处于舒适状态的生理反应,婴儿的微笑也具有社会性,会影响成年人,可以密切与母亲的关系,母婴不断地强化这种应答,从中获得满足,这也是婴儿的心理需求。2~3
  • 刘恒(前202年—前157年)是汉朝的第3个皇帝(不包括两位汉少帝的情况下),汉族,汉高祖刘邦第4子,汉惠帝刘盈弟,母薄姬,被立为代王,建都晋阳。刘恒(前202
  • 经历丰厚是从来不需要逢人便讲的,遇上了自然便会知道了。‎人生很‎短,‎不要‎愧​‎对‎自己~​岁月‎不长,​‎不要亏​‎待‎自己~​‎往​‎后余生,‎不要​‎辜
  • 西方权wei媒体普遍认为,男人每天的词汇量是 7000 个,而女人有 2 万个词汇量。然后就导致,男人进化了四肢,退化了发声,女人则正好相反。
  • 怀有仁爱之心谓之慈,广行济困之举谓之善,慈善是仁德与善行的统一。 行善助人是舍,心安积德是得。
  • 那些真心悔改的人之所以能悔改不是因为你说的对或者你能辩论,能叫人真心悔改的是耶稣。假如给你一次重生的机会,你最想做的事情是什么?如果发现了你最想要的,就把它马上
  • 4⃣️第一次泡脚 第一次按摩 不一样的感觉……疼了一个星期5⃣️麦当劳新出的咸蛋黄麦旋风 好恰好恰6⃣️KTV中特别的风景线…睿智父亲教女儿做微积分好感动的画面
  • #中国纪年# 【1263癸亥宋理宗景定四年】龙泉窑青瓷莲瓣纹水注口径2.5cm,底径4.4cm,高7.3cm。1974年出土于甲渠候官遗址第22号房址内。
  • 今天魏老师来和我说我们做错了,我真的很不好意思。 [二哈]既然蝶儿要出单独dlc,那当代夏小梅茉莉已经被小刘查了,蝶儿肯定是勇宝查了[二哈][二哈][二哈]期待
  • 原来三顿连续不认真吃饭就会低血糖,好的我其实从小那么壮也不是铁打的。”“是”[哈哈]长疹子的第40个小时,校医院老师一口咬定这是蚊虫叮咬,我一定会很好奇维C配短
  • 七年之后,我达到了随心所念无事无非,随口所说无利无害的境界,老师才引我跟他同席而坐。九年之后,无论是随心之所念,还是随口之所言,我都不管是非利害,都毫无分别了。
  • 临近约定时间,我用手机给你发信息,发现手机欠费了(又到了交月租费的时候了)准备去找你的时候,看到你发给我的信息,说有急事,希望我快点联系你(我有点慌,你从来不会
  • 会中我们的指导老师李喜梅老师首先进行了发言并从老师的角度为大家分享会计分院学生会的工作态度以及荣誉,希望大家能够将作风在延续中发展。接下来是学生会主席张晔的精彩
  • #霉霉回应与侃爷通话录音曝光# Taylor Swift和Kanye West的电话全程录音日前遭黑客曝光,霉霉稍早回应表示:“与其让回答我对于这个视频的感受,
  • ⚡️图5为主卧/图6为次卧,可合租可整租我询价请加微信315135208 周五从希思罗出发的猫孩子们,最远飞兰州的也于周日晚安全到达!因个人原因转让,价格好商量