|
|
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 |
|