免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 37330 | 回复: 103

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

论坛徽章:
1
寅虎
日期:2013-09-29 23:15:15
发表于 2006-03-25 15:37 |显示全部楼层
看<C专家编程>时,有一练习,程序如下:
  1.       1 #include <stdio.h>
  2.       2 #include <stdlib.h>
  3.       3
  4.       4 int main(){
  5.       5     int MB = 0;
  6.       6     while(malloc(1 << 20)) ++MB;
  7.       7     printf("Allocated %d MB total.\n", MB);
  8.       8 }
复制代码

运行该程序,看看进程可以分配多少的内存?

在默认内核下面,结果是:
Allocated 511 MB total.


先看看/usr/src/sys/i386/include/vmparam.h,其中定义的一个进程的最大数据段的大小MAXDSIZ就是512M。
/*
* Virtual memory related constants, all in bytes
*/
#define        MAXTSIZ                (128UL*1024*1024)        /* max text size */
#ifndef DFLDSIZ
#define        DFLDSIZ                (128UL*1024*1024)        /* initial data size limit */
#endif
#ifndef MAXDSIZ
#define        MAXDSIZ                (512UL*1024*1024)        /* max data size */
#endif
#ifndef        DFLSSIZ
#define        DFLSSIZ                (8UL*1024*1024)                /* initial stack size limit */
#endif
#ifndef        MAXSSIZ
#define        MAXSSIZ                (64UL*1024*1024)        /* max stack size */
#endif
#ifndef SGROWSIZ
#define SGROWSIZ        (128UL*1024)                /* amount to grow stack */
#endif


继续测试,根据handbook,在内核加入参数:
options MAXDSIZ="(1024*1024*1024)"
options DFLDSIZ="(1024*1024*1024)"

再运行该程序,结果是:
Allocated 1023 MB total.


接下来继续,把参数调大到2049看看: (感谢antijp指出先前的错误,现更正)
options MAXDSIZ="(2049ULL*1024*1024)"

结果是:
Allocated 2048 MB total.


PS:测试环境:FreeBSD 6.0-RELEASE,内存1GB.

后记:同一程序在Gentoo Linux上运行,结果是:
Allocated 3056 MB total.


感谢雨丝风片,antijp,gvim!欢迎大家讨论及指正

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

论坛徽章:
2
亥猪
日期:2014-03-19 16:36:35午马
日期:2014-11-23 23:48:46
发表于 2006-03-25 15:41 |显示全部楼层
options MAXDSIZ="(2048*1024*1024)"
options DFLDSIZ="(2048*1024*1024)"

把这个换成
options MAXDSIZ="(3221225472UL)"
options DFLDSIZ="(3221225472UL)"
试试呢。
看warning应该不是算法本身的限制吧,加上UL申请3G试试。

论坛徽章:
1
寅虎
日期:2013-09-29 23:15:15
发表于 2006-03-25 15:48 |显示全部楼层
好,马上试试.

论坛徽章:
1
寅虎
日期:2013-09-29 23:15:15
发表于 2006-03-25 16:42 |显示全部楼层
原帖由 gvim 于 2006-3-25 15:41 发表
options MAXDSIZ="(2048*1024*1024)"
options DFLDSIZ="(2048*1024*1024)"

把这个换成
options MAXDSIZ="(3221225472UL)"
options DFLDSIZ="(3221225472UL)"
试试 ...

能编译通过,但机器重启出问题.
init died (signal 0,  exit 1)
painc : Going nowhere without my init
cpuid = 0

最后机器15秒重启,重复...

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

论坛徽章:
0
发表于 2006-03-25 20:08 |显示全部楼层
怀疑BSD之前先怀疑自己,我是看到你在freebsdchina上面的帖子以后才到这里来的。另外,贴FreeBSD的代码的时候把__FBSDID那段东西贴出来,否则有些东西fxr上面不好找(我现在一般除非要搜索,否则就直接在freebsd上面用cvsweb)

论坛徽章:
1
寅虎
日期:2013-09-29 23:15:15
发表于 2006-03-25 20:34 |显示全部楼层
己编辑.

[ 本帖最后由 congli 于 2006-3-26 00:21 编辑 ]

论坛徽章:
0
发表于 2006-03-25 20:43 |显示全部楼层
我在freebsdchina的回复你没有仔细看

需要2G的话,要用2048U(LL)? * 1024 * 1024

论坛徽章:
1
寅虎
日期:2013-09-29 23:15:15
发表于 2006-03-25 20:45 |显示全部楼层
原帖由 antijp 于 2006-3-25 20:43 发表
我在freebsdchina的回复你没有仔细看

需要2G的话,要用2048U(LL)? * 1024 * 1024

谢谢指点!
试试再说.

论坛徽章:
2
亥猪
日期:2014-03-19 16:36:35午马
日期:2014-11-23 23:48:46
发表于 2006-03-25 22:47 |显示全部楼层
原帖由 antijp 于 2006-3-25 20:43 发表
我在freebsdchina的回复你没有仔细看

需要2G的话,要用2048U(LL)? * 1024 * 1024


他的意思是看FreeBSD最大可以分配多少空间。
限定最大数据空间为3G的情况下,实验结果是:相比Linux的3056 MB,freebsd不修改代码的情况下(也就是只调整config文件)启动时panic。

[ 本帖最后由 gvim 于 2006-3-25 22:49 编辑 ]

论坛徽章:
0
发表于 2006-03-26 20:18 |显示全部楼层
我也遇到了同样的问题,我在DELL2850服务器上安装了4GB内存,同时调整了/boot/loader.conf中的MAXDSIZ的值,发现当MAXDSIZ值设置到3GB以上时,服务器就不能启动。至今不知道什么原因。

楼主所作的试验我以前也做过,结果与楼主相同,原因不清楚。怀疑是BSD系统本身实现的问题。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP