免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6464 | 回复: 18
打印 上一主题 下一主题

请教:如何将动态申请的空间及时的还给系统 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-04-11 22:43 |只看该作者 |倒序浏览
我发现malloc出来的空间free之后并没有马上还给系统,而是必须在进程结束之后才还给系统,不知有没有别的更好的办法,既可以动态的申请空间,又可以随时的将空间还给系统

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
2 [报告]
发表于 2004-04-12 09:29 |只看该作者

请教:如何将动态申请的空间及时的还给系统

那你就实现自己的内存管理策略。

论坛徽章:
0
3 [报告]
发表于 2004-04-12 10:31 |只看该作者

请教:如何将动态申请的空间及时的还给系统

>;>; 我发现malloc出来的空间free之后并没有马上还给系统,而是必须在进程结束之后才还给系统
虽然不是那么绝对,但一般的编译器好像都是这么实现的。有没有编译选项可以改变这一行为,还没有看到有资料介绍这一点。

>;>; 不知有没有别的更好的办法,既可以动态的申请空间,又可以随时的将空间还给系统
你可以试试用 mallopt 函数调整动态内存分配的参数,即在程序开始加上如下一句:
  1.   mallopt( M_MMAP_THRESHOLD, 0 )
复制代码

这时,malloc函数其实是调用 mmap 来实现内存分配的,保证了释放时能够及时归还系统。需要包含头文件 malloc.h。注意这个函数不是 ANSI C标准中规定的,有些系统中可能没有,或者即使有这个函数,但是可能没有定义它的实现。如果用 GNU C 库的话不妨试试。

论坛徽章:
0
4 [报告]
发表于 2004-04-12 12:31 |只看该作者

请教:如何将动态申请的空间及时的还给系统

对了,楼上的朋友,我还想问一句,mmap是建立内存与磁盘文件映射关系的,如果我要用它实现malloc的功能,是不是说我得将内存映射到/dev/null上呢?另外是不是还存在内存共享的问题呢,即其他进程操作这个文件可能会改变我内存的数据呢(我这部分内存可能并不想共享)?
谢谢执教哦

论坛徽章:
0
5 [报告]
发表于 2004-04-12 12:50 |只看该作者

请教:如何将动态申请的空间及时的还给系统

我记得,free的内存系统并不会立即回收,只会简单的标记一下,你用top之类的命令察看的时候可以看的出来。因为这样可以加快下次程序malloc的速度。

论坛徽章:
0
6 [报告]
发表于 2004-04-12 12:56 |只看该作者

请教:如何将动态申请的空间及时的还给系统

>;>; 我还想问一句,mmap是建立内存与磁盘文件映射关系的,如果我要用它实现malloc的功能,是不是说我得将内存映射到/dev/null上呢?
/dev/zero

>;>; 另外是不是还存在内存共享的问题呢,即其他进程操作这个文件可能会改变我内存的数据呢(我这部分内存可能并不想共享)?
那就 mmap 时指定 flags 为  MAP_PRIVATE,而不是 MAP_SHARED。

还有,上面你测试的结果如何?达到你的要求了吗?

论坛徽章:
0
7 [报告]
发表于 2004-04-12 17:10 |只看该作者

请教:如何将动态申请的空间及时的还给系统

有点别的事情,还没来得及测试,试了之后我马上把结果贴出来。

论坛徽章:
0
8 [报告]
发表于 2004-04-12 17:49 |只看该作者

请教:如何将动态申请的空间及时的还给系统

我提供一点我的看法.
首先,malloc提供的占用地址可能是已经分配的区地址,它包含了除malloc返回空间其他的一些数据,因此当free时系统不会直接free,而是等待本区释放时才释放,这与unix的内存管理有关.如果希望将自己分配的动态空间中不包含其他数据,建议使用brk和sbrk函数自己分配区,并维护它.

论坛徽章:
0
9 [报告]
发表于 2004-04-12 18:40 |只看该作者

请教:如何将动态申请的空间及时的还给系统

malloc申请的内存free之后没有还给系统,而是必须在进程结束之后才还给系统???

如果是这样的话,我们还free它干吗?干脆就等进程结束系统自动收回不就得了。free岂不是多此一举?

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
10 [报告]
发表于 2004-04-13 08:21 |只看该作者

请教:如何将动态申请的空间及时的还给系统

绝对同意lcd的观点.free后,其实内存就已经是在系统的控制之下了.已经不是我们的进程独占的了.而是受系统的内存管理程序控制了.所以,也没必要区别是否打标记之类的.只要你free了,系统就不会因为你的进程没退出而产生内存泄漏.
如果不free的话,系统内存很容易就耗光了.这个我做过测试了.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP