LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1162|回复: 14

高手请帮忙,关于大量频繁动态使用内存的问题

[复制链接]
发表于 2004-10-14 15:24:58 | 显示全部楼层 |阅读模式
巨郁闷,程序很大,大量频繁地调用calloc和free倒弄内存。
程序中有好几个线程。进程启动后,由于需要,有时会根据客户端条件
杀死一些线程(如网络通讯),然后根据外部条件再次启动线程。
再次启动线程后,线程会再次把第一次calloc一下内存,这次到弄时就会出现段错误,高手们给点建议(除了把动态申请内存改为静态)
发表于 2004-10-15 13:53:50 | 显示全部楼层
既然要频繁的分配内存.那就先分配,不释放,等到整个进程退出的时候再一块释放.不过这需要你自己管理内存.还要多进程的同步问题.
发表于 2004-10-15 15:24:02 | 显示全部楼层
free并不真正立即释放内存,频繁的使用至少作个内存缓冲池吧,而且大使用最好使用mmap
发表于 2004-10-15 17:27:40 | 显示全部楼层
自已写一个garbage collector.
发表于 2004-10-16 15:20:41 | 显示全部楼层
貌似程序本身有问题啊
 楼主| 发表于 2004-10-18 17:32:09 | 显示全部楼层
程序以前是在qnx下的,移植到linux,以前没有错误。
第二次启动线程时,要分配好几次不同大小的内存。当分配的内存数大于上百个字节时,就显示已杀死。
线程跟进程一样把。动态分配也是在堆中分配吧?
不知道有没有跟线程没有指定堆栈大小关系
以前制定了较大的一个先程堆栈,
 楼主| 发表于 2004-10-19 18:25:21 | 显示全部楼层
请教 lzlz:怎么在用户态作缓冲池?
有类似于核心态的alloc_skb()函数吗?
mmap在用在分配内存时(不是映射文件时)具体用法
给点帮组 先谢了!
发表于 2004-10-19 19:58:32 | 显示全部楼层
我提点建议
你可以考虑:
把缓冲区new出来做成链表
用的时候从链表里取
不用了放到链表里去。
程序退出的时候再free
 楼主| 发表于 2004-10-20 08:41:17 | 显示全部楼层
你说的是不是相当于以下代码:
#define base 1024;
char *buf[30]
for (i=0;i<50;i++)
{
   buf=malloc(i*base)
}
然后需要时从中赋值就行?
 楼主| 发表于 2004-10-20 09:04:30 | 显示全部楼层
我想自己实现一个新的系统调用
在分配前调用用于实现整理内存(类似于bdflush)。不知可否
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表