练习题与扩展阅读
练习题
基础题
- 简述CPU缓存的层次结构,各级缓存的特点和速度差异。
- 什么是局部性原理?时间局部性和空间局部性分别是什么?举一个你编程中利用局部性原理优化性能的例子。
- 什么是虚拟内存?它有什么优势?
- 常见的内存问题有哪些?分别会导致什么后果?
- 什么是TLB?它的作用是什么?TLB miss会有什么影响?
实操题
- 编写两个二维数组遍历的程序,一个按行优先遍历,一个按列优先遍历,对比两者的运行时间,解释差异原因。
- 编写一个简单的程序,故意制造内存泄漏,然后用Valgrind或者AddressSanitizer检测这个内存泄漏,看能不能定位到问题。
- 查看你电脑的CPU缓存大小、行大小等信息:
- Linux:
lscpu命令 - Windows:任务管理器 → CPU详情
- Linux:
- 用top或者任务管理器观察你常用软件的内存占用变化,看看哪些软件有内存泄漏的迹象。
思考题
- 为什么CPU需要多级缓存?直接用一个大容量的高速缓存不行吗?
- 什么是伪共享?如何在编程中避免伪共享问题?
- 分页机制中,为什么使用多级页表而不是单级页表?
- 现在内存价格越来越便宜,还有必要优化程序的内存使用吗?为什么?
扩展阅读
书籍推荐
-
《深入理解计算机系统》
- 第6章存储器层次结构、第9章虚拟内存等章节,深入讲解了内存管理和缓存原理,是本章内容的绝佳补充
- 每个程序员都应该读的经典书籍
-
《计算机体系结构:量化研究方法》
- 第2章存储器层次结构,深入讲解了缓存、虚拟内存的设计和性能分析
- 适合想要深入理解计算机体系结构的开发者
-
《C专家编程》
- 第7章对内存、指针和内存管理有很精彩的讲解,适合C/C++开发者阅读
-
《垃圾回收的算法与实现》
- 全面讲解了各种垃圾回收算法的原理和实现,适合想要深入理解GC的开发者
在线资源
-
What Every Programmer Should Know About Memory
- 经典的内存知识科普文章,每个程序员都应该读一遍,深入讲解了内存硬件、缓存、虚拟内存等知识,以及如何写出对内存友好的代码
-
- 可视化讲解CPU缓存的工作原理,非常直观易懂
-
- Linux内核文档中关于缓存和内存屏障的讲解,适合底层开发人员阅读
-
- 讲解Go语言内存分配器的实现原理,适合Go开发者
工具推荐
- perf:Linux下的性能分析工具,可以分析缓存命中率、TLB命中率、CPU周期等性能指标
- Valgrind:强大的内存调试工具,可以检测内存泄漏、野指针、缓冲区溢出等问题
- AddressSanitizer:集成在GCC/Clang中的内存检测工具,性能比Valgrind好,检测能力强
- MAT(Memory Analyzer Tool):Java堆内存分析工具,快速定位内存泄漏
- pprof:Go和C++的性能分析工具,可以分析内存分配情况
- cachegrind:Valgrind的工具之一,可以模拟CPU缓存,分析程序的缓存命中率
参考答案
练习题的参考答案可以在附录/练习题参考答案.md中找到。建议先独立思考完成,再查看答案。