测试主机内存程序,申请第8个100M内存时失败(每次100M),但这个测试程序又可以起好几个,每个都是申请第8个100M失败?

eng 2003-08-25 11:21:22
测试主机内存程序,申请第8个100M内存时失败(每次100M),但这个测试程序又可以起好几个,每个都是申请第8个100M失败?
why?
aix 5 + gcc 物理内存 2G
ulimit -a 全部unlimited


是不是系统对每个进程申请的内存资源有限制,在那个地方设置?
我有个程序要申请1G以上,但每次都800M时,申请失败,因此我写个测试程序,但测试程序又可以起好几个,就是说在一个程序申请不到内存时,其他程序还可以申请到,why? 如何解决,请各位帮忙!
附:测试源码
#include <stdio.h>


/*100M*/
typedef struct
{
char buf[104857600];
}UNIT;

typedef struct node_100M
{
UNIT item;
struct node_100M * next;
}NODE;
/*申请内存,n为节点个数,每个节点为100M*/
NODE* Apply_Mem(NODE ** xx,int n)
{
NODE* pCurrent;
char err_text[512];
int i;


pCurrent=(NODE*)malloc(sizeof(NODE));
if(pCurrent==NULL)
sprintf(err_text,"第1次申请客户主表内存失败!");
else
sprintf(err_text,"第1次申请客户主表内存成功!");
printf("%s\n",err_text);
*xx=pCurrent;

for(i=1;i < n;i++)
{
pCurrent->next=(NODE*)malloc(sizeof(NODE));

if(pCurrent->next==NULL)
{
sprintf(err_text,"第%d次申请客户主表内存失败!",i+1);
printf("%s\n",err_text);
return(NULL);
}
else
{
sprintf(err_text,"第%d次申请客户主表内存成功!",i+1);
printf("%s\n",err_text);
}
pCurrent=pCurrent->next;
}
return pCurrent;
}
void dis_xx(NODE ** xx)
{
NODE *p,*q;
int i=0;
p = *xx;

*xx=NULL;
printf("开始释放内存!\n");

while(p!=NULL)
{
q=p->next;
free(p);
printf("第%d次释放100M!\n",i+1);
p=q;
i++;
}
return ;

}
/*检查是否内存泄漏*/
int MemCheck(int begin)
{
static char *saved=NULL;
/*char *p = new char[4];*/
char *p;

p=(char*)malloc(4*sizeof(char));

if (begin)
{
saved = p;
/*delete p;*/
free(p);
} else
if (p != saved) {
return (p - saved);
}
return 0;
}

int main()
{

int i=0;
NODE a;
NODE* xx;

printf("测试小型机可分配内存数:\n\n");
printf("size of 分配单位 is %d M\n\n",sizeof(a)/1024/1024);

MemCheck(0);
if(Apply_Mem(&xx,8)==NULL)
{
printf("分配内存信息失败!\n");
}


printf("please enter then any key to release the memory...\n\n");
getchar();
dis_xx(&xx);
i=MemCheck(1);
printf(" i is :%d\n",i);
printf("结束!\n");
return 1;
}
...全文
51 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
fierygnu 2003-08-27
  • 打赏
  • 举报
回复
恭喜恭喜,解决了就好。AIX很难伺候的,呵呵。
eng 2003-08-27
  • 打赏
  • 举报
回复
The large address-space model allows specified programs to use more than 256 MB of data. Other programs continue to use the default address-space model. To allow a program to use the large address-space model, specify a non-zero maxdata value. You can specify a non-zero maxdata value either by using the ld command when you're building the program, or by exporting the LDR_CNTRL environment variable before executing the program.

大内存模式允许指定的程序使用超过256M内存空间,其他程序仍然使用默认的地址空间模式。为maxdata指定相应的值,可以使程序使用大地址空间模式。
cc -bmaxdata:0x80000000 sample.o
or
export LDR_CNTRL=MAXDATA=0x40000000
eng 2003-08-27
  • 打赏
  • 举报
回复
谢谢 fierygnu ,getrlimit我再试试。

也就是刚才问题已经解决了,请参考:
http://www.chinaunix.net/forum/viewtopic.php?p=983206#983206
http://www.sybase.com/detail/1,6904,1024625,00.html
fierygnu 2003-08-27
  • 打赏
  • 举报
回复
这段代码有问题,应该是:
struct rlimit rl, *rlp=&rl;
rlim_cur肯定不是你现在取的值,复杂应该一个100M的块都不能分配。这也是我怀疑你的rlp的原因。

另外,swap是多少你还没说...
eng 2003-08-27
  • 打赏
  • 举报
回复
to fierygnu(va_list) :
嗯不好意思,因为没明白你原来什么意思。
...
struct rlimit *rlp;
...
getrlimit(RLIMIT_RSS,rlp);
printf(" rlp.rlim_max is %d\n",rlp->rlim_max);
printf(" rlp.rlim_cur is %d\n",rlp->rlim_cur);
...

getrlimit(RLIMIT_DATA,rlp);
printf(" rlp.rlim_max is %d\n",rlp->rlim_max);
printf(" rlp.rlim_cur is %d\n",rlp->rlim_cur);
linaxing 2003-08-26
  • 打赏
  • 举报
回复
用setrlimit()来提高 rlim_cur
fierygnu 2003-08-26
  • 打赏
  • 举报
回复
我问的问题好象你没有关注。。。

要知道虽然ulimit返回的值是无限制,但根据你的memory和swap的大小,系统实际可以分配的内存是有限的。
至于你的getrlimit,我想知道你的rlp是如何定义和传递的。
eng 2003-08-26
  • 打赏
  • 举报
回复
main()
{
char *p;
int i;

printf("测试单个进程可分配内存数:\n\n");
printf("size of 分配单位 is %d M\n\n",10);
for (i=0;i<10000;i++)
{
p=(char *)malloc(1024*1024*10);
if(p==NULL)
{
printf("分配内存信息失败!\n");
printf("press any key to continue ...\n");
getchar();
break;
}
printf("%d=%d\n",i,p);
}
printf("单个进程可分配最大内存数为%dM\n",10*i);
return 0;
}
760M,我参考上面这位大虾的程序,仍未找出原因。
我的环境变量里 设的有 export LDR_CNTRL=MAXDATA=0x30000000
同时ulimit -a 全部无限制
我用getrlimit 返回 cur 80多M, max 2G多
fierygnu 2003-08-25
  • 打赏
  • 举报
回复
用getrlimit的RLIMIT_DATA看看进程的堆大小是否有限制。
eng 2003-08-25
  • 打赏
  • 举报
回复
不好意思,全乱了,看不太清楚,不过就是这个意思。
fierygnu 2003-08-25
  • 打赏
  • 举报
回复
另外你的getrlimit的rlp是怎么赋值的?
fierygnu 2003-08-25
  • 打赏
  • 举报
回复
你的swap空间是多少?用df -k输出看看。
eng 2003-08-25
  • 打赏
  • 举报
回复
getrlimit(RLIMIT_RSS,rlp);
printf(" rlp.rlim_max is %d\n",rlp->rlim_max);
printf(" rlp.rlim_cur is %d\n",rlp->rlim_cur);
+++++++++++++++++++++++++++++++++++++++++++++

rlp.rlim_max is 1061791083
rlp.rlim_cur is 31391749

+++++++++++++++++++++++++++++++++++++++++++++

getrlimit(RLIMIT_DATA,rlp);
printf(" rlp.rlim_max is %d\n",rlp->rlim_max);
printf(" rlp.rlim_cur is %d\n",rlp->rlim_cur);
+++++++++++++++++++++++++++++++++++++++++++++

rlp.rlim_max is 1061791083
rlp.rlim_cur is 31391749

+++++++++++++++++++++++++++++++++++++++++++++
输出都一样max : 1061791083
cur : 31391749

fierygnu 2003-08-25
  • 打赏
  • 举报
回复
getrlimit返回什么?
eng 2003-08-25
  • 打赏
  • 举报
回复
if(Apply_Mem(&xx,8)==NULL)
{
printf("分配内存信息失败!\n");

传入8,即分配800M时申请不到,传入7,就ok!我把节点大小调整为10M,就是每个结点10M,则传入75ok,76就申请失败,申请不到760M!
fierygnu 2003-08-25
  • 打赏
  • 举报
回复
什么时候出这个错误?
eng 2003-08-25
  • 打赏
  • 举报
回复
strerror(errno) is "not enough space "
errno=12

aix 5.1

23,110

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧