课程作业-第十七章:
17.1首先以标志flag -n 10 -H 0 -p BEST -s 0运行程序来产生一些随机的分配和空闲。你能预测malloc()/free()会返回什么吗?你可以在每次请求后猜测空闲列表的状态吗?随着时间的推移,你对空闲列表有什么发现?
答:
使用以下命令./malloc.py -n 10 -H 0 -p BEST -s 0来模拟内存的随机分配和释放过程。模拟程序设定了一块大小为100的空间,其基地址为1000,头部大小为0,并采用了最优匹配的分配策略。
首先尝试分配一个大小为3的空间,模拟程序返回了起始地址1000,此时内存列表中剩余一个大小为97的空闲块。当释放这块空间后,模拟程序返回0表示释放成功,此时内存列表中包含两个空闲块,大小分别为3和97。
接下来,分配一个大小为5的空间,得到地址1003,此时内存列表更新为两个空闲块,大小分别为3和92。再次释放后,内存列表中出现了三个空闲块,大小分别为3、5和92。
然后,分配一个大小为8的空间,模拟程序返回地址1008,此时内存列表更新为三个空闲块,大小分别为3、5和84。释放后,内存列表中的空闲块数量增加到四个,大小分别为3、5、8和84。
在第四次分配时,尽管存在一个大小为8的空闲块,但模拟程序仍然返回了地址1008,这可能是由于模拟程序的设计或特定规则导致的。释放后,内存列表的状态保持不变。
第五次分配大小为2的空间时,模拟程序返回了地址1000,这意味着它从大小为3的空闲块中分割出了一部分。此时,内存列表更新为四个空闲块,大小分别为1、5、8和84。
最后,在第六次分配中,请求一个大小为7的空间,模拟程序返回了地址1008,并将之前大小为8的空闲块分割为两个块。此时,内存列表中的空闲块大小变为1、5、1和84。
如下图所示:
可以使用带有-c参数的命令./malloc.py -n 10 -H 0 -p BEST -s 0 -c来查看模拟的详细结果。结果显示,模拟过程与之前的分析是一致的。然而,模拟程序在空闲块的管理上并没有实现合并功能,可能会导致随着时间的推移,内存碎片逐渐增多。如下图所示:
17.3如果使用首次匹配(-p FIRST)会如何?使用首次匹配时,什么变快了?
答:
使用命令./malloc.py -n 10 -H 0 -p FIRST -s 0 -c,可以观察到首次分配策略的实际效果。如下图所示:
与BEST分配策略相比,FIRST分配策略在分配内存时,所需搜索的元素数量明显减少。这是因为首次分配策略仅需找到第一个满足需求的空闲块即可,无需像最优分配策略那样每次都要遍历所有空闲块。因此,使用FIRST分配策略时,查找空闲块所消耗的时间将大幅减少。
17.4对于上述问题,列表在保持有序时,可能会影响某些策略找到空闲位置所需的时间。使用不同的空闲列表排序(-l ADDRSORT,-l SIZESORT +,-l SIZESORT-)查看策略和列表排序如何相互影响。
答:
经过对比不同分配策略在不同空闲列表排序方式下的分配情况,发现以下规律:
①对于最优(BEST)和最差(WORST)这样的分配策略,空闲列表的排序方式并不会对其效率产生任何影响。无论空闲块如何排列,这两种分配策略在每次分配时都需要全面遍历所有的空闲块。
②但是对于首次(FIRST)分配策略来说,情况就有所不同。空闲列表的排序方式会直接影响其分配效率。这是因为首次分配策略的核心思路是找到首个足够大的空闲块,因此空闲块的排列顺序对于其分配效率至关重要。
综上所述,分配策略的效率与其具体的执行思路紧密相关,而空闲列表的排序方式则是对部分分配策略效率产生影响的因素之一。
具体的模拟结果如下图所示:
(1)BEST分配策略:
(2)FIRST分配策略:
(3)WORST分配策略: