Appearance
题目
在下列动态分区分配算法中,最容易产生内存碎片的是( )。
错因
A
首次适应从地址低端开始扫,遇到第一个够大的就分——它的副作用是低地址区被切得很碎,但比起最佳适应,整体碎片化程度反而温和得多:每次只切一刀(够大就用),不刻意挑最贴合的,留下来的碎片大小分布更均匀。把它当成"最碎"的,多半是被"低地址越来越碎"的现象误导。
B
最坏适应每次都从最大空闲区里切——切完剩下的还相对大块,最不容易剩下细碎块。直觉上"挑最大的切显得浪费"会被误判成"碎片多",但实际效果相反:剩余分区平均较大、可用性高,外部碎片最不严重。
D
循环首次适应是首次适应的变种,每次从上次结束位置开始扫——目的就是让低地址不要总被切,使整体分区分布更均匀。它的碎片化情况和首次适应类似(不会比它更碎),都比不上最佳适应那么夸张地小。
总解析
四种动态分区算法,按"产生外部碎片"程度排序:
| 算法 | 选哪个空闲区 | 切下来后剩余分区的特征 | 外部碎片 |
|---|---|---|---|
| 首次适应 First Fit | 从低地址扫,第一个够大的 | 低地址被切碎,整体一般 | 中 |
| 循环首次适应 Next Fit | 从上次位置扫,第一个够大的 | 比 First Fit 均匀一点 | 中 |
| 最佳适应 Best Fit | 最贴合的(剩余最少) | 每次切完剩极小的"边角块",几乎不可用 | 最严重 |
| 最坏适应 Worst Fit | 最大的空闲区 | 切完剩下还相对大,可用性高 | 最轻 |
直觉解释:"最佳"听起来好,实际很差——每次都把空闲区精准削成一个细缝,这些细缝小到没法再装下后续任何请求,只能闲置在内存里。久而久之,内存里全是这种"刚好不够下一次用"的小碎块,外部碎片爆炸。
最佳适应的命名是从"本次分配看最省"角度起的,但全局看反而是碎片最多的方案。
最终答案是 C。
编者注(解题技巧):四种适应算法里名字反直觉的两个直接背:最佳适应碎片最多、最坏适应碎片最少。"最佳/最坏"看的是单次分配视角,问"全局碎片"时答案正好是反的。