glibc内存管理下载

系统大全为您分享
X86平台LINUX进程内存布局如下:  上面个段的含义如下:  text:存放程序代码的,编译时确定,只读;  data:存放程序运行时就能确定的数据,可读可写;  bss:定义而没有初始化的全局变量和静态变量;  heap:一般由程序员分配,如果知识兔不释放的话在程序结束的时候可能被OS回收;  stack:有编译器自动分配释放,存放函数的参数、局部变量等;  Mmap:映射区域;  程序可以直接使用系统调用来管理heap和mmap,但更多的时候是使用C分享的malloc和free来动态地分配和释放内存。Linux上的stack的限制大致是8M,而在Windows上为2M.  C风格的内存管理程序:  也就是malloc和free,主要是通过brk或者mmap添加额外的虚拟内存。对于那些需要保持长期存储的程序使用malloc来管理内存可能会非常令人失望,如果知识兔有大量的不固定的内存引用,经常难以知道他们如何被释放。  池式内存管理:  应用程序可以更简单地管理内存;内存分配和回收更快;可以预先分配错误处理池,以便程序在常规内存被耗尽时仍然可以恢复;有非常易于使用的标准实现。  内存池只适用于操作可以分阶段的程序;通常不能和第三方库很好滴合作;如果知识兔程序的结构发生变化则不得不修改内存池;必须记住需要从哪个池进行分配。  引用计数:  不能忘记调用引用计数函数;无法释放作为循环数据结构的一部分;在多线程环境中更难也更慢。  垃圾回收:  永远不必担心内存的双重释放或者对象的生命周期;  无法干涉何时释放内存;比其他形式的内才能管理更慢;如果知识兔忘记将不再使用的指针设置为null,  内存管理器的设计目标:  最大化兼容性;  最大化可移植性(能很好地和OS交流);  浪费最小的空间(管理自身的数据结构也是需要内存的,还有一个需要注意的是碎片);  最快的速度(2/8原则,主要用来优化热点);  最大化可调性(能适应多种分配的需求,或者是通过配置来适应);  最大化局部性(这里考虑的是CPU的cache和内存之间的关系);  最大化调试功能(作为程序员就不用说了);  最大化适应性(在不修改配置时候的适应性);  ptmalloc实现了malloc和free以及一组其他函数,以分享动态内存管理的支持。分配器处于用户程序和内核之间,用来响应用户的分配请求,向操作系统申请内存,然后知识兔将其返回给用户程序。为了保持高效的分配,分配器一般都会预先分配一大块内存,并通过某种算法管理。用户释放掉的内存也并不是立即就返回给操作系统。ptmalloc在设计的时候折中了高效性、高空间利用率、高可用性等设计目标。其设计假设如下:  用mmap来分配长生命周期的大内存;  特别大的内存分配总是使用mmap;  短生命周期的内存分配使用brk;  尽量只缓存小的、临时使用的内存,而大的内存则直接归还给系统;  小内存块只有在malloc和free的时候进行合并;  收缩堆的条件是当前free的快的大小加上前后能合并的chunk的大小大于64K,并且知识兔堆顶的大小达到阀值;  需要长期存储的程序不适合ptmalloc;  总体上的结构如下:  而实际存在数据的是Chunk,使用中的Chunk的结构如下:  其中:  P:表示前一个Chunk是否在使用中;  M:标志Chunk是从那个内存区域获得的虚拟内存;  A:标志是否是主分配区;  空闲的Chunk在内存中的结构如下:  在glibc中使用bin来管理空闲的chunk,细节就不说了。当空闲的chunk被链接到bin中的时候,ptmalloc会检查他前后的chunk是否也是空闲的,如果知识兔是的话,就会合并成一个大的chunk.bin的结构如下:  ptmalloc为了提高分配的速度,会把一些小的chunk先放到Fast bins中。fast bins中的chunk并不改变它的使用标志P,这样也就无法将他们合并,当用户分配小的内存的时候,ptmalloc首先会在fast bins中查找响应的空闲块,然后知识兔再去查找Unsorted bins中空闲的chunk.被合并后的chunk、或者是不能放在fast bins中的chunk会首先放在Unsorted bin中,如果知识兔在分配的时候在Unsorted bin中无法满足要求,则将Unsorted bin中的chunk加入到bins中。  因为在分配内存的时候是用低地址到高地址分配的,这样一个分配到的大的内存(用来模拟sub-heap)的上面很有可能是有一块空闲的内存,也就是Top chunk.Top chunk是在fast bin和bins之后才考虑的,所以这段区间并不在bins这些结构中。如果知识兔ptmalloc设法在top chunk中分配一段空间时且top chunk不够大,这时会重新分配一个新的sub-heap,并将top chunk迁移到新的sub-heap上。新的sub-heap与已有的sub-heap用单向链表连接起来。如下:  当要分配的空间足够大的时候,ptmalloc会使用mmap来直接使用内存映射来讲页映射到进程空间。这样分配的chunk在被free时将直接接触映射,再次对这样的内存区域的引用将会引起段错误。  Last remainder chunk是另外一种特殊的chunk,在分配一个small chunk的时候,如果知识兔在small bins中找不到合适的chunk,如果知识兔last remainder chunk的大小大于所需的small chunk大小。那么它将会分裂成两个,一个供用户使用,另一个变成了新的Last remainder chunk.  ptmalloc的响应用户内存分配请求的具体步骤:  获取主分配区的锁,如果知识兔失败就查找非主分配区,再不行就创建新的非主分配区;  将用户请求的大小转换为实际需要分配的chunk空间的大小;  如果知识兔chunk_size<=max_fast则转4,否则,跳转5;  尝试在fast bins中分配,如果知识兔成功则结束返回;  如果知识兔chunk_size<=512B则下一步,否则跳转6;  查找对应的small bins,如果知识兔找到则分配成功;否则转7;  合并fast bins中的chunk,遍历unsorted bin中的chunk,如果知识兔只有一个chunk,并且知识兔这个chunk在上次的分配中被使用过,并且知识兔所需分配的chunk大小属于smallbins,并且知识兔chunk的大小满足要求,则直接将该chunk进行切割,分配结束;否则将其放入bins;  在large bins中查找;如果知识兔失败转9;  如果知识兔top chunk满足要求,则从中分配出一块;否则转10;  如果知识兔是主分配区,调用sbrk增加top chunk的大小;否则分配一个新的sub-heap;或者直接使用mmap来分配;如果知识兔需要用mmap分配转11,否则转12;  使用mmap系统调用为程序的内存空间映射一块空间,然后知识兔将指针返回给用户程序;  判断是否第一次调用malloc,若是主分配区,则进行一次初始化工作。否则根据10的规则来分配。  为了避免Glibc内存暴增,使用时需要注意一下几点:  后分配的内存先释放(top chunk的考虑);  不适合用于管理长生命周期的内存,特别是持续不定期分配和释放长生命周期的内存;  不要关闭ptmalloc的mmap分配阀值动态调整机制;  多线程分阶段执行的程序不适合使用ptmalloc(更适合使用内存池);  尽量减少程序的线程数量和避免频繁分配、释放内存;
ptmalloc对内存泄露非常敏感;  防止程序分配过多的内存而使得程序被因为OOM被系统杀掉。 
 
  
  以上就是系统大全给大家介绍的如何使的方法都有一定的了解了吧,好了,如果知识兔大家还想了解更多的资讯,那就赶紧点击系统大全官网吧。 
 
本文来自系统大全http://www.win7cn.com/如需转载请注明!推荐:win7纯净版

下载仅供下载体验和测试学习,不得商用和正当使用。

下载体验

请输入密码查看下载!

如何免费获取密码?

点击下载

评论