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本身和内核模式的驱动程序才能访问。
malloc内存分配机制
最新推荐文章于 2024-05-26 12:51:31 发布