malloc内存分配机制

转自:http://hi.baidu.com/zkheartboy/item/a1795c44307517d3c1a59253

 

通过malloc分配1k的内存,系统实际上分配了多大的内存?

malloc函数最终会请求windows的堆管理器(heap manager)在进程的默认堆上分配内存。
堆管理器通过快查链表(look-aside list)管理和分配内存,每条快查链表包含空闲的相同
长度的内存。

你可能会问,那整数有无限多个,就要有无限多个快查链表了?当然不会,在32位WINDOW
S操作系统上,每个堆有128条快查链表,控制的内存分配长度分别从8字节到1K。如果你要
分配1~8字节,实际会分配8字节,要分配1025字节及其以上实际就分配1K...(不完全这样
,最后一段有补充)

当堆管理器接受到一个7字节的分配请求,先看看8字节这条快查链表是否为空,如不为空
,直接从中取出一项来满足你。如果为空,它就会一下从windows底层分配8n(最后一段会
修正)长度的内存,向快查链表插入n项,再取出一项满足你,这样向底层请求的次数少了
,系统效率就高了。

另外,堆管理器还会多分配几个字节存储实际分配的内存长度,所以上面7字节的请求实际
应该分配8+4=12字节,并返回第5个字节的地址给你(假定以四字节表示长度值,具体要多
少位微软也没公布)。当调用free时,也是最终请求堆管理器释放内存,但通常情况下它
只会从返回地址的前几个字节找到分配时记录的长度信息,然后把这块内存的地址插入到
相应的快查链表中。

快查链表为于进程的系统地址空间部分,用户模式的进程对其没有访问权限,只有WINDOW
S本身和内核模式的驱动程序才能访问。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值