自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(39)
  • 收藏
  • 关注

Glibc内存管理--ptmalloc2源代码分析(三十四)

终于将《Glibc内存管理--ptmalloc2源代码分析》这个系列的文章完成了,最后附上全文的pdf和ppt,供大家交流分享。

2011-05-30 19:42:05 314

Glibc内存管理--ptmalloc2源代码分析(三十三)

5.8.3 sYSTRIm()和munmap_chunk()sYSTRIm()函数源代码如下:/* sYSTRIm is an inverse of sorts to sYSMALLOc. It gives memory back to the system (via negative arguments to sbrk) if there is unused...

2011-05-30 19:36:08 234

Glibc内存管理--ptmalloc2源代码分析(三十二)

5.8.2 _int_free()_int_free()函数的实现源代码如下:static void#ifdef ATOMIC_FASTBINS_int_free(mstate av, mchunkptr p, int have_lock)#else_int_free(mstate av, mchunkptr p)#endif{ INTERNA...

2011-05-30 19:33:04 343

Glibc内存管理--ptmalloc2源代码分析(三十一)

5.8 内存释放free5.8.1 public_fREe()public_fREe()函数的源代码如下:voidpublic_fREe(Void_t* mem){ mstate ar_ptr; mchunkptr p; /* chunk corresponding to mem */...

2011-05-30 19:26:48 260

Glibc内存管理--ptmalloc2源代码分析(三十)

5.7.2.5 malloc_consolidate()malloc_consolidate()函数用于将fast bins中的chunk合并,并加入unsortedbin中,其实现源代码如下:/* ------------------------- malloc_consolidate -------------------------...

2011-05-30 19:24:02 236

Glibc内存管理--ptmalloc2源代码分析(二十九)

5.7.2.4 sYSMALLOc()当_int_malloc()函数尝试从fast bins,last remainderchunk,small bins,large bins和top chunk都失败之后,就会使用sYSMALLOc()函数直接向系统申请内存用于分配所需的chunk。其实现源代码如下:/* ...

2011-05-30 19:14:24 236

Glibc内存管理--ptmalloc2源代码分析(二十八)

5.7.2.3 分配large bin chunk(二) 如果通过上面的方式从最合适的small bin或large bin中都没有分配到需要的chunk,则查看比当前bin的index大的small bin或large bin 是否有空闲chunk可利用来分配所需的chunk。源代码实现如下/* ...

2011-05-30 19:09:54 203

Glibc内存管理--ptmalloc2源代码分析(二十七)

5.7.2.3 分配large bin chunk(一)如果所需的chunk不属于small bins,首先会执行如下的代码段:/* If this is a large request, consolidate fastbins before continuing. While it might look excessive to ki...

2011-05-30 19:02:02 256

Glibc内存管理--ptmalloc2源代码分析(二十六)

5.7.2.2 分配small bin chunk 如果所需的chunk大小属于small bin,则会执行如下的代码:/* If a small request, check regular bin. Since these "smallbins" hold one size each, no searching within bin...

2011-05-30 18:50:13 162

Glibc内存管理--ptmalloc2源代码分析(二十五)

5.7 内存分配malloc() Ptmalloc2主要的内存分配函数为malloc(),但源代码中并不能找到该函数,该函数是用宏定义为public_mALLOc(),因为该函数在不同的编译条件下,具有不同的名称。public_mALLOc()函数只是简单的封装_int_malloc()函数,_int_malloc()函数才是内存分配的核...

2011-05-30 18:46:34 299

Glibc内存管理--ptmalloc2源代码分析(二十四)

5.6.7 grow_heap,shrink_heap,delete_heap,heap_trim 这几个函数实现sub_heap和增长和收缩,grow_heap()函数主要将sub_heap中可读可写区域扩大;shrink_heap()函数缩小sub_heap的虚拟内存区域,减小该sub_heap的虚拟内存占用量;delete_...

2011-05-30 18:30:39 206

Glibc内存管理--ptmalloc2源代码分析(二十三)

5.6.5 new_heap()New_heap()函数负责从mmap区域映射一块内存来作为sub_heap,在32位系统上,该函数每次映射1M内存,映射的内存块地址按1M对齐;在64为系统上,该函数映射64M内存,映射的内存块地址按64M对齐。New_heap()函数只是映射一块虚拟地址空间,该空间不可读写,...

2011-05-30 18:19:05 317

原创 Glibc内存管理--ptmalloc2源代码分析(二十二)

5.6.3 Arena_get2()在5.6.2节中提到,arena_get宏尝试查看线程的私用实例中是否包含一个分配区,如果不存在分配区或是存在分配区,但对该分配区加锁失败,就会调用arena_get2()函数获得一个分配区,下面将分析arena_get2()函数的实现。static mstateinternal_function#if _...

2011-05-30 18:08:30 287

Glibc内存管理--ptmalloc2源代码分析(二十一)

5.6 多分配区支持由于只有一个主分配区从堆中分配小内存块,而稍大的内存块都必须从mmap映射区域分配,如果有多个线程都要分配小内存块,但多个线程是不能同时调用sbrk()函数的,因为只有一个函数调用sbrk()时才能保证分配的虚拟地址空间是连续的。如果多个线程都从主分配区中分配小内存块,效率很低效。为了解决这个问题,ptmalloc...

2011-05-30 18:03:54 335

Glibc内存管理--ptmalloc2源代码分析(二十)

5.5.3  ptmalloc_lock_all(),ptmalloc_unlock_all(),ptmalloc_unlock_all2()/* Magic value for the thread-specific arena pointer when malloc_atfork() is in use. */#define ATFORK_AREN...

2011-05-30 17:57:11 280

Glibc内存管理--ptmalloc2源代码分析(十九)

5.5.2 ptmalloc_init()函数 ptmalloc_init()函数比较长,将分段对这个函数做介绍。 static voidptmalloc_init (void){#if __STD_C const char* s;#else char* s;#endif int secure = 0; if(...

2011-05-30 17:37:24 341

Glibc内存管理--ptmalloc2源代码分析(十八)

5.5 Ptmalloc初始化 Ptmalloc的初始化发生在进程的第一个内存分配请求,当ptmalloc的初始化一般都在用户的第一次调用malloc()或remalloc()之前,因为操作系统和Glibc库为进程的初始化做了不少工作,在用户分配内存以前,Glibc已经分配了多次内存。在ptmalloc中malloc()...

2011-05-30 17:28:11 230

原创 Glibc内存管理--ptmalloc2源代码分析(十七)

5.4 配置选项 Ptmalloc的配置选项不多,在3.2.6节已经做过概要描述,这里给出mallopt()函数的实现:#if __STD_Cint mALLOPt(int param_number, int value)#elseint mALLOPt(param_number, value) int param_number; int val...

2011-05-30 17:13:29 168

原创 Glibc内存管理--ptmalloc2源代码分析(十六)

5.3    核心结构体分析每个分配区是structmalloc_state的一个实例,ptmalloc使用malloc_state来管理分配区,而参数管理使用struct malloc_par,全局拥有一个唯一的malloc_par实例。 5.3.1  malloc_state...

2011-05-30 17:05:21 333

原创 Glibc内存管理--ptmalloc2源代码分析(十五)

5.2.3 Unsorted bin       Unsortedbin可以看作是small bins和large bins的cache,只有一个unsorted bin,以双向链表管理空闲chunk,空闲chunk不排序,所有的chunk在回收时都要先放到unsorted bin中,分...

2011-05-30 16:46:34 284

原创 Glibc内存管理--ptmalloc2源代码分析(十四)

.2.2  Large bins在SIZE_SZ为4B的平台上,大于等于512B的空闲chunk,或者,在SIZE_SZ为8B的平台上,大小大于等于1024B的空闲chunk,由sorted bins...

2011-05-30 16:34:19 311

Glibc内存管理--ptmalloc2源代码分析(十三)

 5.2 分箱式内存管理对于空闲的chunk,ptmalloc采用分箱式内存管理方式,根据空闲chunk的大小和处于的状态将其放在四个不同的bin中,这四个空闲chunk的容器包括fast bins,unsorted bin,small bins和large bins。Fast bins...

2011-05-30 15:57:37 191

Glibc内存管理--ptmalloc2源代码分析(十二)

5. 源代码分析分主要对源代码实现技巧的细节做分析,希望能进一步理解ptmalloc的实现,做到终极无惑。主要分析的文件包括arena.c和malloc.c,这两个文件包括了ptmalloc的核心实现,其中arena.c主要是对多线程支持的实现,malloc.c定义了公用的malloc(),free()等函...

2011-05-30 15:26:50 387

Glibc内存管理--ptmalloc2源代码分析(十一)

4. 问题分析及解决通过前面几节对ptmalloc实现的粗略分析,尝试去分析和解决我们遇到的问题,我们系统遇到的问题是glibc内存暴增,现象是程序已经把内存返回给了Glibc库,但Glibc库却没有把内存归还给操作系统,最终导致系统内存耗尽,程序因为OOM被系统杀掉。请参考3.2.2节对ptmalloc的设计假设与3.2.7节对ptmalloc的使用注意事项,原因有如下几点:...

2011-04-24 16:30:16 257

Glibc内存管理--ptmalloc2源代码分析(十)

3.2.7 使用注意事项 为了避免Glibc内存暴增,使用时需要注意以下几点:后分配的内存先释放,因为ptmalloc收缩内存是从top chunk开始,如果与top chunk相邻的chunk不能释放,top chunk以下的chunk都无法释放。 Ptmalloc不适合用于管理长生命周期的内存,特别是持续不定期分配和释放长生命周期的内存,这将导致ptmalloc内存暴增。...

2011-04-24 16:27:36 222

Glibc内存管理--ptmalloc2源代码分析(九)

3.2.6 配置选项概述Ptmalloc主要提供以下几个配置选项用于调优,这些选项可以通过mallopt()进行设置:1.    M_MXFASTM_MXFAST用于设置fast bins中保存的chunk的最大大小,默认值为64B,fast bins中保存的chunk在一段时间内不会被合并,分配小对象时可以首先查找fast bins,如果fast bins找到了所需大小的ch...

2011-04-24 16:25:20 343

Glibc内存管理--ptmalloc2源代码分析(八)

3.2.5 内存回收概述free() 函数接受一个指向分配区域的指针作为参数,释放该指针所指向的chunk。而具体的释放方法则看该chunk所处的位置和该chunk的大小。free()函数的工作步骤如下:free()函数同样首先需要获取分配区的锁,来保证线程安全。 判断传入的指针是否为0,如果为0,则什么都不做,直接return。否则转下一步。判断所需释放的c...

2011-04-24 16:22:54 208

原创 Glibc内存管理--ptmalloc2源代码分析(七)

3.2.4 内存分配概述分配算法概述,以32系统为例,64位系统类似。小于等于64字节:用pool算法分配。64到512字节之间:在最佳匹配算法分配和pool算法分配中取一种合适的。大于等于512字节:用最佳匹配算法分配。大于等于mmap分配阈值(默认值128KB):根据设置的mmap的分配策略进行分配,如果没有开启mmap分...

2011-04-24 16:20:29 189

原创 Glibc内存管理--ptmalloc2源代码分析(六)

3.2.3.4 sbrk与mmap 从进程的内存布局可知,.bss 段之上的这块分配给用户程序的空间被称为heap (堆)。start_brk指向heap的开始,而brk指向heap的顶部。可以使用系统调用brk()和sbrk()来增加标识heap顶部的brk值,从而线性的增加分配给用户的heap空间。在使malloc之前,brk的值等于start_brk,也就是说heap大小为0。ptm...

2011-04-24 16:11:26 251

Glibc内存管理--ptmalloc2源代码分析(五)

3.2.3内存管理数据结构概述 3.2.3.1  Main_arena与non_main_arena 在Doug Lea实现的内存分配器中只有一个主分配区(main arena),每次分配内存都必须对主分配区加锁,分配完成后释放锁,在SMP多线程环境下,对主分配区的锁的争用很激烈,严重影响了malloc的分配效率。于是Wolfram Gloger在Doug Lea的基础上改进使得Gli...

2011-04-24 15:57:29 419

原创 Glibc内存管理--ptmalloc2源代码分析(四)

3.2 Ptmalloc内存管理概述3.2.1简介Linux中malloc的早期版本是由Doug Lea实现的,它有一个重要问题就是在并行处理时多个线程共享进程的内存空间,各线程可能并发请求内存,在这种情况下应该如何保证分配和回收的正确和高效。Wolfram Gloger在Doug Lea的基础上改进使得Glibc的malloc可以支持多线程——ptmalloc,在glibc-2....

2011-04-18 00:33:13 471

原创 Glibc内存管理--ptmalloc2源代码分析(三)

3. 概述3.1 内存管理一般性描述当不知道程序的每个部分将需要多少内存时,系统内存空间有限,而内存需求又是变化的,这时就需要内存管理程序来负责分配和回收内存。程序的动态性越强,内存管理就越重要,内存分配程序的选择也就更重要。3.1.1内存管理的方法可用于内存管理的方法有许多种,它们各有好处与不足,不同的内存管理方法有最适用的情形。1.  C风格的内存管理程序C风格的内存...

2011-04-18 00:26:51 360

Glibc内存管理--ptmalloc2源代码分析(二)

2.2 操作系统内存分配的相关函数上节提到heap和mmap映射区域是可以提供给用户程序使用的虚拟内存空间,如何获得该区域的内存呢?操作系统提供了相关的系统调用来完成相关工作。对heap的操作,操作系统提供了brk()函数,C运行时库提供了sbrk()函数;对mmap映射区域的操作,操作系统提供了mmap()和munmap()函数。sbrk(),brk() 或者 mmap() 都可以用来...

2011-04-18 00:13:54 377

Glibc内存管理--ptmalloc2源代码分析(一)

1. 问题项目组正在研发的一个类似数据库的NoSql系统,遇到了Glibc的内存暴增问题。现象如下:在我们的NoSql系统中实现了一个简单的内存管理模块,在高压力高并发环境下长时间运行,当内存管理模块的内存释放给C运行时库以后,C运行时库并没有立即把内存归还给操作系统,比如内存管理模块占用的内存为10GB,释放内存以后,通过TOP命令或者/proc/pid/status查看进程占用的内存有...

2011-04-18 00:03:35 709

linux进程内存布局

 内存管理是操作系统的核心之一,最近在研究内核的内存管理以及 C 运行时库对内存的分配和管理,涉及到进程在内存的布局,在此对进程的内存布局做一下总结:  1. 32 位模式下的 linux 内存布局 图上的各个部分描述得比较清楚,不需再做过多的描述。从上图可以看到,栈至顶向下扩展,并且栈是有界的。堆至底向上扩展, mmap 映射区域至顶向下扩展, mmap 映射区域和堆相对扩展...

2011-02-08 01:28:59 290

如何高效处理邮件

     作为开发工程师每天需要处理的紧要的邮件可能不是太多,但无关紧要的邮件可能会有一大堆,针对这种情况,根据个人的一些体会,建议这样处理每天的邮件: 过滤低优先级的电子邮件。创建一个“我不是专属收件人”的过滤器,比如过滤公司内部群发的一些邮件到一个特定文件夹,每次检查该文件夹时只需要查看相应标题,感兴趣的可以仔细看看。如果太忙,就直接忽略这个文件夹中的邮件。 ...

2010-12-19 20:11:14 433

项目开发中的测试

          开发过程中需要做多少的测试才是足够的呢?我想要是没有标准,做再多的测试也是不够的,在测试的广度和深度上都要有个折中,在不同的阶段要有不同的重点,开发人员和测试人员要分工合作,发挥各自的优势。           对开发人员来说,对代码相对更熟悉一些,虽然在项目开发中有不同的分工,开发在测试出一个bug并修复的成本比测试人员测试出一...

2010-12-12 20:07:05 281

程序编码与调试

程序员在软件开发过程中离不开编码和调试,这两个过程也是相辅相成的,我就个人的体会来谈谈这两个方面。 编码篇: 1,程序为什么会有bug?其中一个比较关键的原因是程序员的主观因素造成的,比如编码习惯不好,粗心,不理解系统,系统太复杂没有想清楚设计,没有考虑到某些意外情况,单元测试不到位等等。 2,编码前想清楚设计的细节,对设计细节越...

2010-12-12 20:01:36 610

在Ubuntu10.10上升级内核到2.6.36使用systemtap

     一直在linux平台上做开发工作已经几年了,但对linux内核都没有认真研究过,个人对linux的了解都停留在系统api的使用层面,对linux的底层设计了解甚少。在身边的同事,不凡有熟悉linux内核的高手,在他们的耳濡目染下,也激发了自己研究linux内核的...

2010-12-12 19:57:30 287

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除