---恢复内容开始---
最终要的就是解决外部碎片!内部碎片:分配器发的内存大于请求,块中未使用的空间。
free()接受指针并释放块,不会给library通知块的大小,因此library得自己清楚。 library管理的空间成为heap,数据结构是空闲列表(本可以不需要列表),其包含了对内存管理区域中所有空闲块的引用。
假设:1.内存一旦给client分配内存,它就不能重定位到内存另一位置,直到free()。因此无法压缩free space。
2.分配器管理一个连续的字节区域,简单起见,这个区域是固定大小。
Low-level Mechanisms splitting and coalescing: 假如heap中30byte的10-20是used,则请求10byte以上请求都不行,以下的请求,分配器执行splitting:找内存中free chunk,一部分给调用者,一部分保留在列表。 而执行free后的合并操作:如果只是把释放这块加进去会显得整体分为3块空闲,依旧不能请求大空间,所以得合并。 Tracking the size of allocated regions 分配器在分配空间时将额外信息存储在header中。