分配器与碎片

共 18 题
#

1. dlmalloc 边界标记(boundary tag)在合并空闲块中的作用?

A boundary tag 只存块大小,不含空闲标志
B 合并需要遍历整个堆
C 释放时通过边界标记判断相邻块是否空闲并快速合并,减少外部碎片 ✓ 正确答案
D boundary tag 用于存储分配器指针
#

2. jemalloc arena 在多线程下的 NUMA-aware 分配?

A jemalloc 将堆分为多个 arena,并让线程优先从本地 NUMA 节点分配 ✓ 正确答案
B arena 使所有线程共享一个全局锁
C jemalloc 完全忽略 NUMA,所有分配都随机
D arena 只用于单线程
#

3. jemalloc 与 mimalloc 在 Windows 与 Linux 跨平台上的差异?

A mimalloc 使用 arena 设计,jemalloc 使用 free list 设计
B jemalloc 是微软为 Windows 开发的
C 两者都只能在 Linux 上运行
D jemalloc 依托 arena 与 size class 强调可扩展性,mimalloc 依托 free list 与分段强调低延迟 ✓ 正确答案
#

4. jemalloc 在 64-bit 系统上 size class(如 8B、16B、32B、48B、64B、80B...)?

A size class 是任意大小的,分配时动态搜索
B size class 只影响大对象
C 所有对象都走同一 size class
D 小对象按固定 step 分类(8/16/32/48/64/80...)以平衡对齐与内部碎片 ✓ 正确答案
#

5. slab allocator 在 Linux kernel 中分配同 size 对象的优势?

A slab 只能分配不同大小的对象
B 同 size 固定分配减少碎片并提供对象复用,分配 O(1) ✓ 正确答案
C slab 主要造成大量内部碎片
D slab 分配需要遍历整个页表
#

6. glibc ptmalloc 的 tcache 如何加速小对象分配,tcache 的 double-free 检测(key 字段)如何工作?

A tcache 只缓存大于 1MB 的对象
B tcache 是全局共享的,所有线程共享一份
C tcache 是线程本地的单项缓存,加快小对象分配;key 字段用于检测 double-free ✓ 正确答案
D tcache 没有 double-free 检测
#

7. tcmalloc central cache 与 per-thread cache 在高并发下的争用?

A per-thread cache 与 central cache 是同一块内存
B 所有分配都通过 central cache 加锁完成
C per-thread cache 无锁本地分配,central cache 通过批量操作降低锁竞争 ✓ 正确答案
D central cache 完全无锁
#

8. dlmalloc best-fit vs first-fit vs next-fit 三种策略?

A 三种策略完全等价
B first-fit 一定比 best-fit 碎片少
C next-fit 碎片总是最优
D best-fit 碎片最小但遍历开销大,first-fit 快但易产生小碎片 ✓ 正确答案
#

9. dlmalloc、ptmalloc2、jemalloc、tcmalloc 四种常见分配器差异?

A ptmalloc2 是单线程分配器
B 四种分配器都一样
C dlmalloc 是单线程基础分配器,jemalloc/tcmalloc 用线程本地缓存提升并发 ✓ 正确答案
D tcmalloc 是 glibc 默认分配器
#

10. tcmalloc span(连续 page 段)在分配器中的角色?

A span 与 page 无关
B span 是单个字节
C span 是连续 page 组成的分配单元,小对象从 span 按 size class 切分 ✓ 正确答案
D span 只用于大对象
#

11. malloc 的分配器,glibc ptmalloc 的 chunk、bins 与 tcache 如何工作?

A 只有一种 bin
B bins 是线程本地缓存,优先于 tcache
C chunk 是内存页
D 分配时先查 tcache,再查 fastbins/unsorted/small/large bins ✓ 正确答案
#

12. 伙伴系统与 SLAB 内核内存分配器如何分工?

A 两者互不依赖
B 伙伴系统负责对象缓存,SLAB 负责物理页
C 伙伴系统按 2 的幂次分配物理页,SLAB 在其上缓存固定大小对象 ✓ 正确答案
D SLAB 直接管理物理页,不依赖伙伴系统
#

13. fastbins、unsorted bin、small/large bins 在 malloc/free 时的查找顺序,为什么 tcache 命中时不会再去 bins 中查找?

A 顺序为 tcache→fastbins→unsorted→small/large,tcache 命中即返回不再查 bins ✓ 正确答案
B 总是先查 large bins 再查 tcache
C tcache 命中后仍会遍历所有 bins
D 查找顺序与性能无关
#

14. jemalloc 的 extent 与 dirty page decay,为什么进程释放内存后 RSS 不立即下降,arena 缓存与 madvise 的协同机制如何?

A 释放后内存缓存在 arena,RSS 不立即下降,decay 后通过 madvise 归还内核 ✓ 正确答案
B 释放后 RSS 立即下降
C decay 与 madvise 无关
D jemalloc 从不缓存内存
#

15. 为何 mimalloc 在 Visual Studio 2019+ 默认开启?

A mimalloc 是第三方非微软分配的
B mimalloc 只支持 Linux
C mimalloc 性能比所有分配器都差
D mimalloc 是微软开发的低延迟分配器,性能优于旧 CRT,被纳入 VS2019+ 供选用并推荐使用 ✓ 正确答案
#

16. 内存碎片,内部碎片与外部碎片的成因与缓解如何?

A 内部碎片无法缓解
B 两者都是 CPU 造成的
C 外部碎片只影响内部堆
D 内部碎片源于对齐/固定 size class,外部碎片源于空闲块不连续 ✓ 正确答案
#

17. 内存池与对象池如何减少分配开销?

A 对象池每次都重新构造对象
B 每次分配都调用系统调用
C 通过预分配一定内存并复用对象,减少系统调用与构造开销 ✓ 正确答案
D 内存池会增加碎片
#

18. 内存池的应用,高频分配场景如何做性能优化?

A 内存池无法复用对象
B 内存池会导致更多系统调用
C 内存池只适合低频分配
D 通过预分配、固定大小、线程本地与复用消除高频分配的系统调用与锁开销 ✓ 正确答案