游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3153|回复: 4

请问一个内存中申请堆空间的方法

[复制链接]

2

主题

19

帖子

19

积分

新手上路

Rank: 1

积分
19
发表于 2007-8-5 19:38:00 | 显示全部楼层 |阅读模式
windows系统中有HeapCreate申请用户级的堆空间,
然后用HeapAlloc和HeapFree在所申请的堆中分配内存,
这样做一是可以保证所申请的内存可以被统一干净地释放掉,防止内存泄露
二是可以防止内存碎片的产生

我想问linux下该怎么实现类似的方法呢?或者linux有什么防止内存泄露或防止内存碎片的方法?
据我所认识的,linux下不存在“用户级的堆空间”,系统分配每个程序只有一个堆,
有个内核函数叫do_brk(),可以用来扩展程序堆空间,不过这好像没什么意义不是我所要的
有一种说法说linux下不存在内存碎片问题,不过准确的说法大概应该这样:
“对于内核来说,给用户空间分配内存以页计,因此不会出现小于一页的碎片。但是glibc的malloc实现也许是一个问题,原始的内存分配系统调用是 brk或者mmap,但是malloc在连续的堆里实现自己的策略,在多次malloc/free以后,堆里也许会有很多碎片,如果你对glibc的算法不满,可以根据自己的应用编写堆分配算法。”—— 来自linuxsir.org
因此服务器程序运行久了总会降低性能(如果只用malloc/free的话……)
我想问大家在实际应用的时候都有哪些防止内存碎片的方法?
望不吝赐教先谢了!


附:do_brk()简介
    do_brk()是一个内核函数,用于间接调用管理进程的内存堆的增加和缩减 (brk),它是一个mmap(2)系统调用的简化版本,只处理匿名映射(如未初始化数据)。
    do_brk()改变进程的地址空间。地址是代表数据段结束的一个指针(事实上是进程的堆区域)。 do_brk()的参数是一个绝对逻辑地址,这个地址代表地址空间新的结尾。更实际地说,我们在编写用户程序的时候从来就不应该使用这个函数。使用这个函数的用户程序就不能再使用malloc(),这是一个大问题,因为标注库的许多部分依赖于malloc()。 如果在用户程序中使用do_brk()可能会导致难以发现的程序崩溃。
    do_brk(addr, len)函数给从addr到addr+len建立虚拟内存区vm_area_struct(该区的起始地址为addr;结束地址为addr+len),该虚拟内存区作为进程的堆来使用。 malloc将从此区域获取内存空间(虚拟内存), free()将会把malloc()获取的虚拟空间释放掉(归还到该进程的堆的空闲空间中去)
——摘自不知道谁的博客:http://hi.baidu.com/zengzhaonong/blog/item/ccc6ed1fd4c26b61f724e42a.html

30

主题

357

帖子

388

积分

中级会员

Rank: 3Rank: 3

积分
388
QQ
发表于 2007-8-7 16:24:00 | 显示全部楼层

Re:请问一个内存中申请堆空间的方法

对于频繁创建和销毁的对象,可以自己做个内存管理,即对象池。很多资料都有介绍对象池的算法实现。

103

主题

1432

帖子

1458

积分

金牌会员

Rank: 6Rank: 6

积分
1458
QQ
发表于 2007-8-7 17:08:00 | 显示全部楼层

Re:请问一个内存中申请堆空间的方法

重启一下,什么都解决了。

2

主题

19

帖子

19

积分

新手上路

Rank: 1

积分
19
 楼主| 发表于 2007-8-7 22:05:00 | 显示全部楼层

Re:请问一个内存中申请堆空间的方法

你们的服务器是自己设计对象池的吗?
boost pool内存池有没有人用?
或者stl就足够了
最终的解决办法总是要重启的吧
没有HeapCreate自己管理内存的效果大概都没差多少

2

主题

19

帖子

19

积分

新手上路

Rank: 1

积分
19
 楼主| 发表于 2007-8-7 22:11:00 | 显示全部楼层

Re:请问一个内存中申请堆空间的方法

slab:在操作系统的运作过程中,经常会涉及到大量对象的重复生成、使用和释放问题。对象生成算法的改进,可以在很大程度上提高整个系统的性能。在Linux系统中所用到的对象,比较典型的例子是inode、task_struct等,都又这些特点。一般说来,这类对象的种类相对稳定,每种对象的数量却是巨大的,并且在初始化与析构时要做大量的工作,所占用的时间远远超过内存分配的时间。但是这些对象往往具有这样一个性质,即他们在生成时,所包括的成员属性值一般都赋成确定的数值,并且在使用完毕,释放结构前,这些属性又恢复为未使用前的状态。因此,如果我们能够用合适的方法使得在对象前后两次背使用时,在同一块内存,或同一类内存空间,且保留了基本的数据结构,就可以大大提高效率。slab算法就是针对上述特点设计的。
http://blog.csdn.net/joshua_yu/archive/2006/01/27/589441.aspx
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-25 13:05

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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