免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 5757 | 回复: 20
打印 上一主题 下一主题

调用malloc函数什么时候会被killed? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-19 16:30 |只看该作者 |倒序浏览
我写了个测试一个进程能malloc多少空间的程序,出一个奇怪的问题

程序每次malloc 10MB时,可malloc到1200MB的空间,当失败时,进程就直接被killed



程序每次malloc 100MB时,可malloc到1100MB的空间,当失败时,进程不会被直接killed掉
而是一直输出:
malloc error!!!: Cannot allocate memory

这是为什么呢?

具体描述可见:
http://blog.chinaunix.net/space. ... blog&id=3045296

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
2 [报告]
发表于 2011-12-19 16:41 |只看该作者
被杀掉没什么奇怪, 不杀掉也没什么奇怪。
内核在物理内存紧张时就可能会随机杀进程; 至于为什么100M没事, 10M有事, 每次还都是肇事的进程, 就是内核相关代码的逻辑了

论坛徽章:
0
3 [报告]
发表于 2011-12-19 16:44 |只看该作者
zylthinking 发表于 2011-12-19 16:41
被杀掉没什么奇怪, 不杀掉也没什么奇怪。
内核在物理内存紧张时就可能会随机杀进程; 至于为什么100M没事 ...

随机杀进程?

那系统把不是调用malloc的进程杀掉也没用啊,

就算是不相关的进程杀掉,那malloc进程还是在一直运行啊?为什么会一直不杀掉?

谢谢

论坛徽章:
0
4 [报告]
发表于 2011-12-19 16:58 |只看该作者
满足不了,然后恼羞成怒

论坛徽章:
0
5 [报告]
发表于 2011-12-19 17:00 |只看该作者
鸡丝拌面 发表于 2011-12-19 16:58
满足不了,然后恼羞成怒

那应该一视同仁,呵

论坛徽章:
0
6 [报告]
发表于 2011-12-19 17:06 |只看该作者
juruqiang 发表于 2011-12-19 17:00
那应该一视同仁,呵

应该是采取就近策略,之前ok要尽量保证。

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
7 [报告]
发表于 2011-12-19 17:17 |只看该作者
juruqiang 发表于 2011-12-19 16:44
随机杀进程?

那系统把不是调用malloc的进程杀掉也没用啊,

在操作系统眼中, 杀谁是算法判断的, 比如谁占内存多, 或者其他因素; 无所谓杀掉也没用, 至少是释放了部分物理内存了, 可以满足其他进程部分要求了。
至于为什么100M的不杀掉, 很显然是在虚拟空间找不到连续的100M地址了, 以至于无法让内核觉得不安; 你可以测试一下, 10Mkill的时候发生在 memset 还是malloc

论坛徽章:
0
8 [报告]
发表于 2011-12-19 18:22 |只看该作者
本帖最后由 juruqiang 于 2011-12-19 18:23 编辑
zylthinking 发表于 2011-12-19 17:17
在操作系统眼中, 杀谁是算法判断的, 比如谁占内存多, 或者其他因素; 无所谓杀掉也没用, 至少是释放了 ...


怎么测?

printf("before malloc!");
malloc...
printf("after malloc!\n");

结果是:
......
before malloc! after malloc!
killed

看样子是在memset kill掉的,这表明什么呢??为什么会这样?


很显然是在虚拟空间找不到连续的100M地址了,那10M的不也一样吗?
malloc失败,不都是因为虚拟空间找不到连续的空间了吗???

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
9 [报告]
发表于 2011-12-19 18:40 |只看该作者
本帖最后由 zylthinking 于 2011-12-19 18:49 编辑
juruqiang 发表于 2011-12-19 18:22
怎么测?

printf("before malloc!");


既然 “memset kill”的, 怎么是 malloc 失败的呢? 既然 10M不是malloc失败的, 那100M的是哪里失败的呢??
既然两个失败的地方都不一样, 你还有什么可疑问的

首先你要明白, 操作系统随机杀进程, 是 物理内存不够用了, 它还在之前尝试swap out出一些老旧页面以腾出物理内存, 如果腾不出来, 才是物理内存不够用
要占用物理内存, 应用程序必须获得相应长度的虚拟内存空间; 获得不了虚拟内存空间, 操作系统压根不会尝试分配物理内存; 就算虚拟内存分配成功, 在实际内存单元前, 也不会分配物理内存
100M之所以没事, 是因为它分配虚拟内存空间那一步就失败了, 根本走不到分配物理内存那一步, 既然走不到, 那自然也不会让操作系统发愁没内存了, 它干嘛给你杀掉进程以腾出物理内存来?

论坛徽章:
0
10 [报告]
发表于 2011-12-19 18:46 |只看该作者
zylthinking 发表于 2011-12-19 18:40
既然 “memset kill”的, 怎么是 malloc 失败的呢? 既然 10M不是malloc失败的, 那100M的是哪里失败的呢 ...

为什么memset会使进程被kill掉?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP