资源描述:
《malloc 源码剖析》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、@@内容摘要:这个函数应该是所有使用C/C++的人最熟悉的malloc调用的实现,c语言标准库提供的malloc函数.如果你使用linux,dougleamalloc已经默认作为glibc的malloc,新的版本可能用的是ptmalloc(dlmalloc的多线程版本),如果你用的bsd4.2及以前系统libc用的kingsley的malloc;BSD(包括freebsd,netbsd,openbsd)4.2以后版本libc用的是PHKmalloc;如果你用的windows系统用的是microsoft的分配器算法;不过其他各个系统很容易使用dougleamalloc替换现有mal
2、loc函数.本文以dlmalloc2.7.0版本为基础,先以伪代码的形式介绍sYSTRIm函数的主要流程。其中一些次要情节已略!@@/*如果你使用linux,dougleamalloc已经默认作为glibc的malloc,新的版本可能用的是ptmalloc(dlmalloc的多线程版本)如果你用的bsd4.2及以前系统libc用的kingsley的malloc;BSD(包括freebsd,netbsd,openbsd)4.2以后版本libc用的是PHKmalloc;如果你用的windows系统用的是microsoft的分配器算法;不过其他各个系统很容易使用dougleamallo
3、c替换现有的malloc*///c语言标准库提供的malloc函数;请注意malloc的几个return出口;void*mALLOc(size_tbytes){//0~4bytes->nb=16;>4bytes->nb=bytes+2个4字节头,然后对其到8byteschecked_request2size(bytes,nb);//如果在fastbin中有可用的块直接从fastbin中分配if((unsignedlong)(nb)<=(unsignedlong)(av->max_fast)){fb=&(av->fastbins[(fastbin_index(nb))]);if((
4、victim=*fb)!=0){//静态变量成员fastbin初始化为0*fb=victim->fd;check_remalloced_chunk(victim,nb);returnchunk2mem(victim);}}//如果是<512bytes的小块请求,从smallbin中取一块if(in_smallbin_range(nb)){//根据nb大小定位到smallbinidx=smallbin_index(nb);bin=bin_at(av,idx);//如果该大小的bin[i]列表不为空if((victim=last(bin))!=bin){if(victim==0)//
5、静态变量成员smallbin初始化是0malloc_consolidate(av);//第一次进来这里调用init_state函数进行初始化else{//有空闲块/*victim
6、/bin->first_chunk->chunk->chunk->...->last_chunk
7、/--------------------------------->
8、*///按上图将victim从链表中删除,设置victim的下一块的pbit=inuse//将victim块返回给应用returnchunk2mem(victim);}}}else{//>512bytes,先释放fastbin中的块
9、idx=largebin_index(nb);if(have_fastchunks(av))//初始化的时候静态变量0,这个条件成立,malloc_consolidate(av);//合并fastbin中的chunk,放入unsorted_bin}//这里是唯一将chunks放入bin的地方//处理最近被释放或剩余的chunks,如果上次小请求没有完全匹配//分割出小chunk就会发生//最外面的for(;;)需要,因为我们无法知道在malloc结束前有合并操作//因此需要多尝试一次,最多多循环一次for(;;){/*unsortedchunks,所有的从一个chunk中分割出来
10、的剩余chunk首先放到unsortedchunks链表中,下次malloc调用中有一次被再次使用的机会。作为一个队列维护。当free或malloc_consolidate函数中将剩余chunk放入unsortedchunks链表,而在malloc函数中被分配或放入其他正常bin中。*///循环unsorted中每一块,与插入顺序相反,从后面开始匹配查找while((victim=unsorted_chunks(av)->bk)!=unsorted_chunks(av)){bck