UNIX编程学习——malloc与free的实现(C)
以下是K&R第二版中文版原话:
malloc不是分配一个编译时已知的固定大小的数组,而是当需要时向操作系统申请空间。由于程序中的其他地方需要申请空间,并不一定通过调用malloc实现,因此由malloc管理的空间不一定是连续的。因此空闲的存储空间以空闲块列表的方式保存,每个块包含有一个长度、指向下一个的指针和自己的存储空间。这些块以地址的上升顺序排列在一起,最后一块(最高地址)指向第一块。
当有申请请求时,扫描空闲块列表以找到一个足够大的块,这个算法称为“最先匹配”;与之对应的算法是“最优匹配”它寻找满足条件且最小的块。如果这个块刚好与请求的大小相符合,将它从链表中移走并返回给用户。如果这个块太大,那么将它分成两部分:大小合适的块返回给用户,剩下的部分留在空闲块列表中,如果找不到一个足够大的块,那么就从操作系统中申请一个大块加入空闲块列表中。
释放过程也是首先搜索空闲块列表,以找到可以插入被释放块得合适位置。如果被释放块得任一端是一个空闲块,那么将这两个块合成一个更大的块,以确保不会有太多的碎片。因为空闲块列表是以地址的递增顺序链接在一起的,所以很容易判断相邻的块是否空闲。
浙公网安备 33010602011771号