malloc 源码剖析

malloc 源码剖析

ID:37712076

大小:32.92 KB

页数:10页

时间:2019-05-29

malloc 源码剖析_第1页
malloc 源码剖析_第2页
malloc 源码剖析_第3页
malloc 源码剖析_第4页
malloc 源码剖析_第5页
资源描述:

《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

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。