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

文 | 小林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!

《欣欣向荣的国度》请点击上面蓝色字

关注诗人宁文公众号

东方大国的崛起及长期繁荣昌盛,已成为历史和世界的必然选择。中国人民是伟大的人民,同时,也是善良、勤劳、正直、不怕吃苦和甘于奉献的人民。好人必有好报,黄土地必是福地!https://t.cn/A6XDlTfk  东方大国的崛起及长期繁荣昌盛,已成为历史和世界的必然选择。中国人民是伟大的人民,同时,也是善良、勤劳、正直、不怕吃苦和甘于奉献的人民。好人必有好报,黄土地必是福地![合十][强][抱拳]

打造个人IP,不是要所有粉丝觉得你是好人。更不是只卖一样产品,就以为够了

而是把宝贵时间精力,放在精准的意向客户,放在听你行动拿到结果的人身上

而是把产品体系设计有不同价位:涵盖低中高价格,去适应不同的用户需求。低价引流课让用户开始信任你,通过运营做低转高购买训练营,最后,你的高价产品就要在这一小部分最喜欢你的人身上挖掘

至于那些一直观望不愿意付费的粉丝,那就成为你短视频公众号公开内容,里的一个数据。

这才是个人IP的溢价,也是我们打造个人IP的意义

如果你还是想做个人IP里的好人,记得来找文静帮你清醒一下〰️


发布     👍 0 举报 写留言 🖊   
✋热门推荐
  • 楼市崩盘前,日本是世界第二经济强国,这时的日本城市化率已经达到77.4%,而中国现在还不到60%,现在发达国家城市化普遍在80%左右,所以中国还是有不小的发
  • #Converse##MadeByU#2019.12.09-2019.12.152019年第48周穿搭征稿【投稿方式】在本条微博下带图评论投稿非微博会员无法带图
  • 紫荆皮苦平,善于活血消肿,又能解毒,《本草述》云其“活血、解毒,功能并奏”;黄荆子味苦性温,能温经散瘀、行气除痰、祛风止痛,《本草拾遗》称“杖疮起疔甲,(黄荆子
  • 一路和乌云赛跑,走到一半的时候瓢泼大雨,连个躲雨的地方都没有我被淋的透透的长这么大还是第一次淋雨,我骑车电动车好怕车子露电心惊胆战的,雨实在是太大了,没有办法我
  • 希望明天抽到这个题 草稿都打好了[哪吒得意]我要选择的题目是我喜欢的明星我喜欢的明星是XX他是一个善良大方 温柔可爱的人他对自己的工作一丝不苟 尽职尽责他非常努
  • 马来西亚马来西亚旅游艺术及文化部部长拿督莫哈末丁希望通过这次演出交流,双方能在文化交流合作上搭建更广阔的舞台。在如今的娱乐快消时代,《琵琶行》属于少见的适合各个
  • 电视剧中很多偶像剧的老套路,但却让我觉得和其他偶像剧不一样,至少是这么多年了每看一次都能打动我的电视剧,仔仔的笑容够让我看很多很多年。直知道自己生病,知道自己只
  • 撇开Rick和Morty两个,我记得最清楚的就是这一集,Jerry和Beth看到了平行时空里的自己,他们17岁那年没有选择生下那个孩子,Jerry成为了大明星,
  • 坤坤声音雄厚了不少,成熟了不少,长大了,嘻嘻[嘻嘻]我最喜欢卷毛坤坤,可爱的,可爱的[色]坤坤可能不太在意那些舆论了,成大事的人都要经历大风大浪的,但这就是流量
  • 患者下焦阴阳两虚,以金针调理;上焦阴阳偏盛,银针泻之,兼针对病灶;大便的情况不佳,再以金针改善,并针对脑部病灶。 2018年08月31日:刻下症:左足疼痛好转舌
  • #王源[超话]##王源代言肯德基[超话]##王源联合国大会高级别会议# @TFBOYS-王源 你是夜空中最亮的星辰@TFBOYS-王源 你是江海内最美的潮汐@T
  • 我是真的很喜欢她,希望能有个好心人给她一个家。太太的另一篇花吐本结尾也很惊艳了不如说虽然整体看似是在发刀,其实细节又温馨又温柔,到结尾只会让人觉得他们确实走上了
  • 《马云指挥交响乐 演奏完毕后用双手捂住了脸》我和2501人都在看,快来一起围观 只要事业做的好,做的成功,是成功的企业家,有影响力的,有贡献的创业者做啥都洒脱,
  • 荷兰语好文分享[转载] HOE ONDERHANDEL IK VOOR EEN GOED SALARIS? 7 SPELREGELS - 1/7 Uw in
  • 因为我当时发着高烧,刚好成为了莫炜图接近我的最好时机(我们还没有在一起)然后一旁还有替我很着急但我眼里满是莫炜图让她很不开心的饭招娣...于是发烧的这一个月里,
  • 还不如说说驴妈和千代的故事,或者自己独自美丽,活了那么久努力回应人的心愿肯定对人性善恶有不一样的看法和如何应对吧。原来我这几百年的岁月,不过是这样一个简单的故事
  • 不小心,还是在向晚的风里忘了初衷,忘了那些年,青春的约定……那些悄悄流逝的岁月,如一片片随风飘落的花瓣与落叶,有一份从容的美,泛着淡淡的清香。每片落叶上面都铭刻
  • 咖啡冻的口感跟仙草基本一样,味道的话更像是3合1速溶咖啡,有甜味,应该是大部分人可以接受的味道。还有就是一定注意⚠️这个叫糖,其实是药,因为是韩国最厉害的日东药
  • 批1450 真品货,支持任何机构拆机验货,精工光动能男表,专柜7000左右,内置采用原装进口精工v172光动能机芯,光照充电后储存能量使用180天,无光照正常使
  • 银色款:适合初老或者提前抗老的大胸弟,补水效果非常棒,而且有紧致提拉的效果。银色款:适合初老或者提前抗老的大胸弟,补水效果非常棒,而且有紧致提拉的效果。