malloc之后再进行free,free的内存空间一定被OS回收了吗?(转自知乎)

1. 这道题是15年鹅厂研发类实习生的笔试题,我不知道答案。

2. 知乎上有人问同样的问题,在此贴出来学习。原文链接

提问者:

我对malloc和free的理解:
malloc时,假如申请了1KB的空间,那么操作系统有可能给你一个大于1KB的数值用以备用。同时,malloc时会用一个tag记录本次申请空间的大小,free的时候仅仅将tag清零。
但我有两个问题,比如在基于glibc的Linux中:
1.malloc之后如果不free,那么进程正常(或异常)结束后,操作系统是否一定会对这块内存进行回收呢?
2.malloc之后如果调用了free,那么有没有什么情况下,操作系统不对这块内存进行回收呢?或者说暂时不进行回收呢?

回答者(得分最高):

1 会的,内存也是资源,操作系统会回收的。若不回收,你每次都异常退出去,多来几次,那岂不是你的内存直接就没了。

2. 若是glibc,你所free掉的内存,不一定会马上被OS回收,这是合理的。

试想一下,你每次free掉的内存都还给OS的话,尤其是在小字节的情况下,那么造成的情况,就是一大块的内存被你弄的千疮百孔,也就是说一块内存,里面有很多gap。而在操作系统的虚拟内存管理中,更是管理着的是固定大小的内存,如4K,那你还给我1 Byte,OS显然是很尴尬的。

于是为了避免这样的问题,那么内存管理一般会有一个free block list,free掉的东西就放在这里来。那么你可能会释放很散乱的内存过来,没关系,我们在这里会尝试合并这些散乱的block,而malloc首先找的也是free block list,而非从OS申请新的内存。那么此时如果找到了一块儿合适的自然最好,如果找到的是比要的更大,那么一部分malloc,另一部分放回去。而上面有同学提到了小内存的问题,而这也是free block list在头部会有一些所谓的administrative data,所以用标准的malloc和free管理小内存是不高效,因为越小越容易造成gap。当然,由于malloc和free是如此普遍,自然会尝试着让它变的更好,所以也有各种优化,如对free block list进行chunk size排序等,不过这里就不提了,再谈下去,问题就很大了,这块儿也是有专门的Memory Management书籍讨论的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值