# 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,外部碎片源于空闲块不连续 ✓ 正确答案
# 18. 内存池的应用,高频分配场景如何做性能优化? A 内存池无法复用对象 B 内存池会导致更多系统调用 C 内存池只适合低频分配 D 通过预分配、固定大小、线程本地与复用消除高频分配的系统调用与锁开销 ✓ 正确答案