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

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

真的看不下去每次打开唐山事件下面一堆说不要性别对立,仅仅把这件事简单归纳为罪犯实施的某个犯罪行为,对这件事的诉求仅仅是对罪犯的严惩。

他们或是看不到,或是故意忽略这件事反映的性别问题。而且几乎无一例外,打开主页性别为男。因为拥有特权的人是看不到特权的,不是身处性别弱势是看不到这种结构性问题的。

这个结构性问题就是父权秩序对女性的压迫。具体到这件事上就是,男性想性骚扰女性,可能大多数女性为了自保都会装作无事发生(而且社会鼓励要求女生这样做),或许顶多在心里骂两句,因为她们恐惧,出于对性骚扰者随时可能做出暴力行为的恐惧。但是这个女生反抗了,她大骂骚扰者,骚扰者感觉受到了挑战:“你怎么能不服从?怎么能不忍气吞声?”所以他勃然大怒大打出手,这种愤怒是出于女性对父权秩序挑战的愤怒,大打出手是对于被骚扰者不服从的惩罚,“我骚扰你的时候你就应该忍着,如果你反抗是要受到惩罚的”是这件事情的底层逻辑。

所以真的很讨厌受害者有罪论,所有在女性可能会遭受侵害的境遇下对女性的要求都是在助长这种父权制的性别压迫,就是在对本就不平衡的天平给优势方加码。

ps:对于男性能理解女性处境完全不抱什么期望(女性能随时随地共情男性的倒不少,其实父权系统对女性的规训的结果),但是真的不希望我们女生被这些模糊掉性别议题的高赞评论所误导,女生对女生的自己的处境最清楚不过了,这些事情太有可能在你我任何一个女生身上发生。

气血不足容易早衰!
一招让你快速气血两旺:
导读一说起气血,一般人都觉得是很玄的东西。
中医认为,一个人健康的标准就是气血充足。人体的脏器就如同人一样,吃得饱了,干起活来才有劲。而血就是脏器的“饭”。
1、看眼睛
看眼睛实际上是看眼白的颜色,俗话说“人老珠黄”,其实指的就是眼白的颜色变得混浊、发黄,有血丝,这就表明你气血不足了。眼睛随时都能睁得大大的,说明气血充足;反之,眼袋很大、眼睛干涩、眼皮沉重,都代表气血不足。
2、看皮肤
皮肤白里透着粉红,有光泽、弹性、无皱纹、无斑代表气血充足。反之,皮肤粗糙,没光泽,发暗、发黄、发白、发青、发红、长斑都代表身体状况不佳、气血不足。
3、看头发
头发乌黑、浓密、柔顺代表气血充足,头发干枯、掉发、头发发黄、发白、开叉都是气血不足。
4、看耳朵
现在,人的身体素质越来越差。不信你去仔细看看,现在人的耳朵小,看上去越来越僵硬、而且形状上看上去已有些变形。就是孩子和年青人都很少能看到圆润、肥大、饱满的大耳朵了。而这些大耳朵在老人那里却很多见,这说明以前人的身体素质明显强于现代人。
小孩子看耳朵看形态,大人除了形态就主要看后天的情况了,主要看色泽、有无斑点、有无疼痛。如果呈淡淡的粉红色、有光泽、无斑点、无皱纹、饱满则代表气血充足。而暗淡、无光泽代表气血已经下降。如果耳朵萎缩、枯燥、有斑点、皱纹多,它代表了人的肾脏功能开始衰竭,你要注意了。
5、摸手的温度
如果手一年四季都是温暖的,代表人气血充足,如果手心偏热或者出汗或者手冰冷,都是气血不足。
6、看手指的指腹
无论孩子还是成人,如果手指指腹扁平、薄弱或指尖细细的,都代表气血不足,而手指指腹饱满,肉多有弹性,则说明气血充足。
7、看青筋
如果在成人的食指上看到青筋,说明小时候消化功能不好,而且这种状态已一直延续到了成年后。这类人体质弱,气血两亏。如果在小指上看到青筋,说明肾气不足。如果掌心下方接近腕横纹的地方纹路多、深,就代表小时候营养差,体质弱,气血不足。成年后,这类女性易患妇科疾病,男性则易患前列腺肥大、痛风等症。
8、看指甲上的半月形
正常情况下,半月形应该是除了小指都有。大拇指上,半月形应占指甲面积的1/4~1/5,其它食指、中指、无名指应不超过1/5。
如果手指上没有半月形或只有大拇指上有半月形的说明人体内寒气重、循环功能差、气血不足,以致血液到不了手指的末梢,如果半月形过多、过大,则易患甲亢、高血压等病。
9、看手指甲上的纵纹
只在成人手上出现,小孩不会有的。当成人手指甲上出现纵纹时,一定要提高警惕,这说明身体气血两亏、出现了透支,是肌体衰老的象征。
10、看牙龈
小孩子不明显,主要是成人。牙龈萎缩代表气血不足,只要发现牙齿的缝隙变大了,食物越来越容易塞在牙缝里,就要注意了,身体已在走下坡路,衰老正在加快。
11、看睡眠
成人如果像孩子一样入睡快、睡眠沉,呼吸均匀,一觉睡到自然醒,表示气血很足;而入睡困难,易惊易醒、夜尿多,呼吸深重或打呼噜的人都是血亏。
12、看运动
运动时如果出现胸闷、气短、疲劳难以恢复的状况,气血就不足,而那些运动后精力充沛、浑身轻松的人就很好。
最快的补血方法是什么?
补血的方法是食用高营养的各种汤以及用黑米、玉米、血糯米、大米做成的糊,再加进已加工成糊状的红枣、核桃、花生、莲子、桂圆、枸杞子等。所以病后初愈者、产后妇女、老人、孩子、身体虚弱的人,多喝各种直接消化吸收的糊,对养生及疾病的治疗特别好。
最好的补血食品是什么?
简单地说,只要吃到肚子里能消化吸收的食物,就是补血的,所以补血的前提是胃、肠道消化吸收的能力,就算吃的是粗茶淡饭,只要全部吸收,照样补血,而吃了高级的滋补品,胃、肠道不消化,依然什么用也没有。
寒凉的食物是不是都不能吃?
并不是所有的寒凉食物进入肚子里都会对身体产生负面影响,只要与人的体质、吃的季节相搭配,能起到中和、平衡的作用,就可以吃。比如夏天,人体大量出汗,而适量吃些大寒的西瓜,它能除燥热,又能补充人体因出汗多而丢失的水份、糖份,这时的西瓜对身体来讲就能起到协调、补血的作用,而天冷时吃西瓜,就易导致血亏。
寒、热食物要搭配着吃。
人见人爱的家庭补血方:
在日常的饮食中,还有很多的补血方,有兴趣的朋友,可以按下面介绍的方法去做,也可换换花样,让家人更爱吃。
红枣、桂圆、花生、红豆、红糖、白果、枸杞子都是人们常吃的补血、补肾的食品,将它们互相搭配,就成了很好的补血食疗方。红枣是补血最常用的食物,生吃效果最好。
红豆还可以在铁锅里炒黑后泡水喝,可以治疗胃寒,胃痛,再放入桂圆,就是补血、补气的茶了,特别适合教师、营业员等使用嗓子频率较高的人。如果再加上4~6粒的枸杞子,还能治疗便秘,但大便稀的人就不要加枸杞子了。
常喝红枣、桂圆、枸杞茶的女性朋友,皮肤白皙,美容效果不错。枸杞子不要放多,几粒即可,红枣和桂圆也就6~8粒就行了,每天早上上班后给自己泡一杯,不但补气血,还能明目,特别适合长期待在计算机前的工作狂们。
而没有在铁锅里炒硬、炒黑的红枣泡茶喝是没有用的,因为外皮包裹住了枣子,营养成分出不来,而经过炒制的红枣,经开水一泡,表皮都裂开了,里面的营养成分才会慢慢地渗出来。
红枣、花生、桂圆,再加上红糖,加水在锅里慢慢地炖,炖得烂烂的,经常吃,补血的效果很好。
红枣、红豆、放入糯米里一起熬粥,红豆比较不易烧烂,可以先煮红豆,红豆煮烂了,再放入糯米,红枣一起烧,也是一道补血的佳肴。


发布     👍 0 举报 写留言 🖊   
✋热门推荐
  • 我个人觉得其实如果作为一个薪水阶层,因为短期在股票上突然赚了很多钱,你 把所有工作都辞掉跑来做投资,我认为是一个不太明智的选择,尤其是在这种市 场状态下,因为
  • 。巴萨队史上带队出战比赛最多的五位教练分别是:克鲁伊夫430场、里杰卡尔德273场、里努斯·米歇尔斯264场、瓜迪奥拉247场和范加尔200场,这其中四名教练都
  • 宜家佛山商场佛山市南海区桂城街道18号宜家家居交通:地铁广佛线千灯湖站B出口招聘岗位全屋设计顾问工作职责· 向宜家企业顾客提供咨询和设计服务,给出相关解决方案;
  • 早上水肿的时候喝一杯,最合适不过了,都市丽人必备‼️在家的时候,倒上牛奶就变成拿铁了~对我这样懒癌星人太合适了☕️挂耳咖啡饮用方式 1️⃣拿出时萃小甜圈,放入杯
  • 第二阶段:2022年1月1日至2022年3月15日,以削减采暖季增加的大气污染物排放量为目标,原则上各有关地区钢铁企业错峰生4、保能源供应 四季度国内煤炭将增产
  • 项目位于东区城桂路,中山政治、金融、文化、教育、休闲、娱乐中芯,拥有中山至优质的居住环境、教育配套、医疗配套及交通配套。(1)增强政策观念、提高政治水平(2)扩
  • 首家门店于2014年底在上海闵行龙柏新村开业,家乐福将其定位为“商品数远超普遍便利店的便利超市”以及年初便利蜂这个新便利店品牌出现的刷屏,都让人感受了便利店业态
  • “五四”运动时期在日本留学开始撰写介绍科学社会主义与欧洲工人运动的文章。据报道,在新冠疫情期间,华大向非洲国家供应了超过200万人份的新冠病毒检测试剂,并在非洲
  • ——南宋·姜夔《鹧鸪天·丁巳元日》8、檐流未滴梅花冻,一种清孤不等闲。——宋·朱敦儒《鹧鸪天·西都作》5、江南未雪梅花白,忆梅人是江南客。
  • 考培工种:中医康复理疗师,中医养生美容师,公共营养师,养生保健师,母婴保健师,养老护理师,小儿推拿保健师,整脊调理师,健康管理师,产后康复师等 【职培推荐】小儿
  • 所愿皆所得,所得皆如愿,漫漫的长路,不随造化悲喜,物哀处,持一份淡泊心,皆有生灭,世相不过是在轮回,欣喜时,守一份平常心,际遇因缘,诸念皆是转瞬而变。所愿皆所得
  • 小伙伴们,拍照欣赏美景的时候,记得禁止进入踩踏,做个文明的游人,请留住这一片风景给更多的人欣赏!十里轮蹄尘不断,几多粉黛花无色……粉黛乱子草原产于北美大草原,它
  • 所以,母亲来小住的时候,只要得知姨姨们不来陪伴,我便开始催促自己快点忙完回家去。今天早上吃早餐,她又说起这事。
  • 告诉自己,淡然一些,看开一点,没有一种快乐,是专为我们设计,没有一种痛苦,是单为我们预留。告诉自己,淡然一些,看开一点,没有一种快乐,是专为我们设计,没有一种痛
  • 很多人说5G最大的用处是在工业界,在各个专业的领域,就以被广为宣传的远程医疗来说吧,这是在3G时代就在画的大饼,这么多年过去了现在还没广泛应用呢,也说明另一个问
  • #命运# 好的四柱,要上下情协,左右同志,清而不浊,流通有情8、看五行的“活”与“死”以火来说,若是“活”火,在命局中就要有木来养;忌水来克特别是怕将根铲了。解
  • #碧缇福[超话]# ■小庞冲刺总监军令状 ■这条朋友圈请所有人见证!!! 我是“银河战队”的联合创始人 我是“ ”美伢团队中魄力 领导力最强的领袖 我的优势
  • 今天到家也挺晚的,吃完饭怡宝提议要骑车,确实好久没骑,久违的自行车冒险。。。 回家途中…… -爸爸,揭阳大桥顶做泥莫踏脚车甲行人起去?北河大桥咧好? -(巴拉巴
  • 纸媒代表着一种情怀,美陈行业一个充满挑战的行业,而我们的美陈人是一批伟大的人群,是一群有激情有梦想的人,如果没有情怀支撑着,相信很多的美陈人坚持不到最后,我们的
  • [允悲][污]闹市中的静谧之处丨长嘉汇弹子石老街各位,都说重庆火辣辣,但是这个宝藏地可算是被我发现了这里是我在重庆见到过最爱的景区在这里真的可以享受远离喧嚣的宁