malloc底层实现

只是为了记住而随便写写。

malloc

malloc底层是用brk&&sbrk and mmap&&munmap实现的。

小内存

分配的空间比较小(比如threshold为128KB,比128KB小),那就用的brk&&sbrk,在堆上分配内存(这俩函数是用来调整program break的,其实就是堆顶)

比如先分配了一块A,又分配了一块B,这时候把A free掉,其实堆顶是没动的,因为B还在那儿占着呢。A就被管理起来了(维护在一个空闲块链表里),如果你再调用了malloc请求空间,大小合适的话A就会重新被利用起来。

然后,你又把B free掉了。因为这俩块儿是挨着的,首先管理空闲块的链表,要把他俩合起来(这不用说为什么了吧,半半拉拉的像什么样)。然后这俩合起来如果比较大(比如门限值128KB,超128KB了),又恰好,这块在堆顶呢,就调用brk把堆顶调低了,这块不要了。

大内存

大内存用mmap分配。这种分配方式分配内存的位置,在堆和栈之间那块内存映射区(有些地方管这里叫文件映射区)。

比较

在堆上分配和在映射区分配各有优劣。首先,在堆上就会形成内存碎片,但也有好处,被重用的空闲块被访问的时候,大概率不会缺页(因为以前被用过嘛,而且同一页可能正被附近的块用着呢)。mmap的大内存就不一样了,每次分配肯定就会触发缺页中断。

所以大内存,要用就用mmap舒舒服服分一大片,不用了munmap掉,这么大内存别浪费了,别的什么地方运行时load动态库说不定还要用。小内存呢,就放堆上,舒舒服服,重用还不容易缺页。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值