1.首先运行 flag -n 10 -H 0 -p BEST -s 0 来产生一些随机分配和释放。你能预测 malloc()/free()会返回什么吗?你可以在每次请求后猜测空闲列表的状态吗?随着时间的推移,你对空闲列表有什么发现?
本题采用的是最优匹配策略,系统分配了一个100的空间,基址是1000.
第一步:分配3的空间,返回1000,list剩97
Free之后,list为3,97
第二步:分配5的空间,返回1003,list为3,92
Free之后,list为3,5,92
第三步:分配8的空间,返回1008,list为3,5,84
Free之后,list为3,5,8,84
第四步:分配8的空间,返回1008,list为3,5,84
Free之后,list为3,5,8,84
第五步:分配2的空间,返回1000,list为1,5,8,84
第六步:分配7的空间,返回1008,list为1,5,1,84
输入-c验证:
随着时间的推移,空间越来越碎片化了。Free的空间并没有自动合并起来。
3.如果使用首次匹配(-p FIRST)会如何?使用首次匹配时,什么变快了?
可以看到最终的结果是一模一样的。因为最优分配是遍历之后找合适且最小的块,首次分配是找到第一个合适的块。对于这组数字会得到相同的结果。但是首次匹配花费的时间变少了,因为它不用遍历所有的空闲块了,因此运行时间快了。
4.对于上述问题,列表在保持有序时,可能会影响某些策略找到空闲位置所需的时间。使用不同的空闲列表排序(-l ADDRSORT,-l SIZESORT +,-l SIZESORT-)查看策略和列表排序如何相互影响。
首次分配策略:
最优分配策略:
最差分配策略:
顺序不会影响最优或最差匹配策略,因为这两种策略都要遍历整个空间;但是会影响首次匹配策略。