Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

练习题与扩展阅读

练习题

基础题

  1. 简述CPU缓存的层次结构,各级缓存的特点和速度差异。
  2. 什么是局部性原理?时间局部性和空间局部性分别是什么?举一个你编程中利用局部性原理优化性能的例子。
  3. 什么是虚拟内存?它有什么优势?
  4. 常见的内存问题有哪些?分别会导致什么后果?
  5. 什么是TLB?它的作用是什么?TLB miss会有什么影响?

实操题

  1. 编写两个二维数组遍历的程序,一个按行优先遍历,一个按列优先遍历,对比两者的运行时间,解释差异原因。
  2. 编写一个简单的程序,故意制造内存泄漏,然后用Valgrind或者AddressSanitizer检测这个内存泄漏,看能不能定位到问题。
  3. 查看你电脑的CPU缓存大小、行大小等信息:
    • Linux:lscpu 命令
    • Windows:任务管理器 → CPU详情
  4. 用top或者任务管理器观察你常用软件的内存占用变化,看看哪些软件有内存泄漏的迹象。

思考题

  1. 为什么CPU需要多级缓存?直接用一个大容量的高速缓存不行吗?
  2. 什么是伪共享?如何在编程中避免伪共享问题?
  3. 分页机制中,为什么使用多级页表而不是单级页表?
  4. 现在内存价格越来越便宜,还有必要优化程序的内存使用吗?为什么?

扩展阅读

书籍推荐

  1. 《深入理解计算机系统》

    • 第6章存储器层次结构、第9章虚拟内存等章节,深入讲解了内存管理和缓存原理,是本章内容的绝佳补充
    • 每个程序员都应该读的经典书籍
  2. 《计算机体系结构:量化研究方法》

    • 第2章存储器层次结构,深入讲解了缓存、虚拟内存的设计和性能分析
    • 适合想要深入理解计算机体系结构的开发者
  3. 《C专家编程》

    • 第7章对内存、指针和内存管理有很精彩的讲解,适合C/C++开发者阅读
  4. 《垃圾回收的算法与实现》

    • 全面讲解了各种垃圾回收算法的原理和实现,适合想要深入理解GC的开发者

在线资源

  1. What Every Programmer Should Know About Memory

    • 经典的内存知识科普文章,每个程序员都应该读一遍,深入讲解了内存硬件、缓存、虚拟内存等知识,以及如何写出对内存友好的代码
  2. CPU Cache Explained

    • 可视化讲解CPU缓存的工作原理,非常直观易懂
  3. 内存屏障和缓存一致性

    • Linux内核文档中关于缓存和内存屏障的讲解,适合底层开发人员阅读
  4. Go 内存管理

    • 讲解Go语言内存分配器的实现原理,适合Go开发者

工具推荐

  1. perf:Linux下的性能分析工具,可以分析缓存命中率、TLB命中率、CPU周期等性能指标
  2. Valgrind:强大的内存调试工具,可以检测内存泄漏、野指针、缓冲区溢出等问题
  3. AddressSanitizer:集成在GCC/Clang中的内存检测工具,性能比Valgrind好,检测能力强
  4. MAT(Memory Analyzer Tool):Java堆内存分析工具,快速定位内存泄漏
  5. pprof:Go和C++的性能分析工具,可以分析内存分配情况
  6. cachegrind:Valgrind的工具之一,可以模拟CPU缓存,分析程序的缓存命中率

参考答案

练习题的参考答案可以在附录/练习题参考答案.md中找到。建议先独立思考完成,再查看答案。