免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: congli

一个进程可以分配多大的内存? [复制链接]

论坛徽章:
1
寅虎
日期:2013-09-29 23:15:15
发表于 2006-03-27 16:07 |显示全部楼层
原帖由 hongzjx 于 2006-3-27 15:51 发表
呵呵,llzqq用shell来运行也可以吗?

呵~~需要编译.

论坛徽章:
1
寅虎
日期:2013-09-29 23:15:15
发表于 2006-03-27 16:08 |显示全部楼层
原帖由 llzqq 于 2006-3-27 15:27 发表
[root@bsd ~]#vi sh

#include <stdio.h>
#include <stdlib.h>

int main(){
        int MB = 0;
        while(malloc(1 << 20)) ++MB;
        printf("Allocated %d MB total ...

保存为m.c,
cc -o m m.c编译成m
./m

论坛徽章:
0
发表于 2006-03-27 16:48 |显示全部楼层
原帖由 hongzjx 于 2006-3-27 15:51 发表
呵呵,llzqq用shell来运行也可以吗?



晕,没编译。

论坛徽章:
2
亥猪
日期:2014-03-19 16:36:35午马
日期:2014-11-23 23:48:46
发表于 2006-03-27 16:55 |显示全部楼层
原帖由 congli 于 2006-3-27 14:11 发表
经过一翻折腾,终于找到了原因.感谢风雨^_^
默认情况下,系统会保留1GB空间(打开PAE,会保留2GB),所以导致MAXDSIZ=3GB启动时出现panic.


最后结果:

呵~比linux还要多^_^

PS:虽然找到原因,修改后对性能是否 ...


可是不应该啊。(我还没有进入内存管理部分,先把问题放在这里 )
疑问1:
为什么NetBSD不会crash。我看了相关文献和论文,FreeBSD的vm和NetBSD的uvm 策略差别不大。
疑问2:
"默认情况下,系统会保留1GB空间"这是保留的内核空间,但是进程可以用的最大空间还是3G,修改KVA_PAGES只是减小了内核保留的虚拟空间。比喻下应该是拆东墙补西墙的感觉

论坛徽章:
0
发表于 2006-03-27 17:00 |显示全部楼层
谈谈我对这个问题的看法。

在32位机器的4GB的地址空间中,高端的1GB是缺省留给内核使用的,低端的大致3GB的空间则留给进程自己使用。我们知道,对于一个传统的unix进程的内存布局而言,低端是text段,然后是data段,然后是向上生长的heap,位于高端的则是向下生长的stack。由于data和heap的大小在FreeBSD里是统一规划的,所以在此不做严格区分。

但对于现在的系统而言,heap和stack之间并非一马平川,这里面还有一部分是给mmap预留的空间。如下图所示,左边表示的是FreeBSD进程的内存布局,右边则是Linux进程的内存布局。

我们可以看到,FreeBSD进程的heap向上生长的极限并不是stack的顶部,而是mmap区域的底部。图中用红线表示。这个界限就是前面所说的MAXDSIZ参数的意义,也就是说,data段最大只能到达此处。和stack碰头的任务就交给mmap了,事实上,mmap区域向上生长的极限就是stack向下生长的极限,也就是由MAXSSIZ参数对应的stack下限地址。因此,一个系统中有多少空间用于mmap就由MAXDSIZ和MAXSSIZ两个参数限定了。

在前面的试验中,我们逐步增大MAXDSIZ,实际上就是在逐步压缩mmap的生存空间,直至系统中那些依赖于mmap的程序出现问题为止。

再来看看Linux进程的内存布局。它的mmap区域改成了从顶端向下生长, 于是,原来stack和heap碰头的事情就交给了mmap来做了。这样的效果就是如果mmap没干过什么的话,heap就可以一直生长到stack那儿!我认为,这也就是为什么同样的程序,在Linux上不做任何修改的情况下就能让heap长到3056MB的原因。

大家继续。。。

论坛徽章:
1
寅虎
日期:2013-09-29 23:15:15
发表于 2006-03-27 17:00 |显示全部楼层
原帖由 gvim 于 2006-3-27 16:55 发表


可是不应该啊。(我还没有进入内存管理部分,先把问题放在这里 )
疑问1:
为什么NetBSD不会crash。我看了相关文献和论文,FreeBSD的vm和NetBSD的uvm 策略差别不大。
疑问2:
"默认情况下,系统会保留 ...

的确是拆东墙补西墙的感觉

[ 本帖最后由 congli 于 2006-3-27 22:50 编辑 ]

论坛徽章:
0
发表于 2006-03-27 17:04 |显示全部楼层
原帖由 gvim 于 2006-3-27 16:55 发表
默认情况下,系统会保留1GB空间"这是保留的内核空间,但是进程可以用的最大空间还是3G,修改KVA_PAGES只是减小了内核保留的虚拟空间。比喻下应该是拆东墙补西墙的感觉 ...


偶现在暂时把怀疑的焦点聚集在了mmap区域身上,内核空间的“让步”也正是为了疏缓一下由于增大heap而带给mmap的生存压力。

论坛徽章:
2
亥猪
日期:2014-03-19 16:36:35午马
日期:2014-11-23 23:48:46
发表于 2006-03-27 17:05 |显示全部楼层
原帖由 雨丝风片 于 2006-3-27 17:00 发表
谈谈我对这个问题的看法。

在32位机器的4GB的地址空间中,高端的1GB是缺省留给内核使用的,低端的大致3GB的空间则留给进程自己使用。我们知道,对于一个传统的unix进程的内存布局而言,低端是text段,然后是 ...


我昨天试了下(NB)用的-static编译静态程序,运行程序可以多分得1M的虚拟空间。我估计mmap空间不会保留的那么大,以至于我困惑于实际分得的2869M和3072M还有很大的差距。(当然3072还需要去除text segment等东西。我实验的情况大约占了虚拟空间16M左右。)

论坛徽章:
0
发表于 2006-03-27 17:07 |显示全部楼层
原帖由 gvim 于 2006-3-27 17:05 发表


我昨天试了下(NB)用的-static编译静态程序,运行程序可以多分得1M的虚拟空间。我估计mmap空间不会保留的那么大,以至于我困惑于实际分得的2869M和3072M还有很大的差距。(当然3072还需要去除text segment等东西 ...



mmap保留多大是由MAXDSIZ决定的,data段不要的都给mmap,

论坛徽章:
2
亥猪
日期:2014-03-19 16:36:35午马
日期:2014-11-23 23:48:46
发表于 2006-03-27 17:12 |显示全部楼层
原帖由 雨丝风片 于 2006-3-27 17:07 发表



mmap保留多大是由MAXDSIZ决定的,data段不要的都给mmap,


内存分配是lazy allocation的吧。现在情况是data段都需要,难道系统需要为每个进程保留200M左右的mmap空间?不合理吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP