免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123
最近访问板块 发新帖
楼主: zzbwang
打印 上一主题 下一主题

[FreeBSD] FreeBSD 5.4上一个进程不能使用超过2GB的内存? [复制链接]

论坛徽章:
0
21 [报告]
发表于 2006-03-13 15:08 |只看该作者
原帖由 congli 于 2006-3-13 14:35 发表

似懂非懂.


其实我们也是似懂非懂,
有很多细节还需要继续求证于文档和代码,老大有什么想法不妨也拿出来讨论一下,众人拾柴火焰高,

论坛徽章:
1
寅虎
日期:2013-09-29 23:15:15
22 [报告]
发表于 2006-03-13 15:38 |只看该作者
原帖由 雨丝风片 于 2006-3-13 15:08 发表


其实我们也是似懂非懂,
有很多细节还需要继续求证于文档和代码,老大有什么想法不妨也拿出来讨论一下,众人拾柴火焰高,

呵~和你们大不相同啊.你们在懂这边,而我却在非懂那边.距离实在相差太远啦
暂时只有看的份,让我再啃两个月书吧.

论坛徽章:
0
23 [报告]
发表于 2006-03-17 15:19 |只看该作者
没有哪位曾经在安装了4GB内存的32bit服务器上运行过FreeBSD吗?

论坛徽章:
0
24 [报告]
发表于 2009-08-19 17:50 |只看该作者
对,这里指的是虚拟地址空间。

32位的机器里, 一个进程的内存地址空间范围是0-3G共4个G, 其中最后一个G是内核态的地址空间, 所以给用户态的内存地址空间只留下了前3个G. 那么这样, malloc能够申请到3G以内的内存才对, 但是结果并非如此.
事实上我们申请连续的2G的内存都会失败的, 这是什么原因呢?先让我们看一看实际上进程的4G内存空间都放着或被map着什么:

0-1这前两G: 用户态地址空间
第2这一个G: 库函数映射等
第3这一个G: 内核态内存地址空间

还有很重要的一点:用户态地址空间中还包含了进程代码本身占用的地址空间, 栈的空间等等.
所以,进程的地址空间中没有连续的2G内存,所以申请不到。

如果我们申请的内存不要求是连续的,那么就能一共申请到超过2G的内存。

p = (char*)malloc( 1.8G字节 );
p = (char*)malloc( 800M字节 );
=>两次基本上申请都会成功.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP