面试题答案
一键面试固定大小块分配策略
- 原理:将内存池划分为若干固定大小的内存块,每个块大小预先设定且固定不变。当有内存分配请求时,直接从对应大小的空闲块链表中取出一块分配给用户;释放时,将该块重新链入对应大小的空闲块链表。
- 优点:分配和释放速度快,因为无需复杂的查找和分割操作;内存碎片问题相对较轻,由于块大小固定,不会产生小的无法利用的碎片。
- 缺点:灵活性差,只能满足特定大小的内存请求;若请求大小与预设块大小不匹配,会造成内存浪费,例如请求较小内存但只能分配固定大小的较大块。
可变大小块分配策略
- 原理:内存池中的块大小可根据实际分配请求动态调整。分配时,从空闲块列表中查找合适大小的块,若没有则可能分割较大块;释放时,将释放的块尝试与相邻空闲块合并以减少碎片。
- 优点:能适应各种大小的内存请求,灵活性高,内存利用率相对较高。
- 缺点:分配和释放操作复杂,需进行查找、分割、合并等操作,导致速度较慢;容易产生内存碎片,随着分配和释放操作的进行,内存空间会被分割成许多小的不连续块,影响后续的分配效率。
伙伴系统分配策略
- 原理:内存池被视为一个完整的大内存块,该块大小通常是2的幂次方。当有分配请求时,从大到小查找合适的空闲块,若找到的块过大则分裂为两个相等大小的“伙伴”块,其中一块分配出去,另一块留在空闲列表;释放时,检查释放块的伙伴是否也空闲,若空闲则合并为更大的块。
- 优点:内存碎片相对较少,通过伙伴合并机制可有效减少碎片化;分配和释放操作相对高效,由于基于2的幂次方大小管理内存块,查找和合并操作相对简单。
- 缺点:只能分配2的幂次方大小的内存块,限制了灵活性;对于非2的幂次方大小的请求,可能需要额外处理,如向上取整到最接近的2的幂次方大小,造成一定内存浪费。