一切的学习都是为了解决问题,而不是为了学习而学习。为了学习而学习,这种行为实在是太傻了,因为最终也学不好。
所以我们要弄清楚内存管理究竟能解决什么样的问题。
首先站在 Linux 的角度,有以下几个问题:
1、MMU 是什么?被设计出来是解决什么问题的?
2、CPU是如何访问到内存的?
https://mp.weixin.qq.com/s/SdsT6Is0VG84WlzcAkNCJA?
3、进程的 4G 虚拟地址空间是如何产生的?设计虚拟地址空间的目的?4G空间是如何划分的?
4、为什么要有DMA、NORMAL、HIGHMEM Zone?每个zone的大小是由谁决定的?
5、系统的内存是如何被内核和应用瓜分掉的?
6、底层的内存管理算法buddy是怎么工作的?它和内核里面的slab分配器是什么关系?
7、频繁的内存申请和释放是否会导致内存的碎片化?它的后果是什么?
8、Linux内存耗尽后,系统会发生怎样的情况?
9、应用程序的内存是什么时候拿到的?malloc()成功后,是否真的拿到了内存?应用程序的malloc()与free()与内核的关系究竟是什么?
10、什么是lazy分配机制?应用的内存为什么会延后以最懒惰的方式拿到?
11、我写的应用究竟耗费了多少内存?进程的vss/rss/pss/uss分别是什么概念?虚拟的,真实的,共享的,独占的,究竟哪个是哪个?
12、内存为什么要做文件系统的缓存?如何做?缓存何时放弃?
13、Free命令里面显示的buffers和cached分别是什么?二者有何区别?
14、交换分区、虚拟内存究竟是什么鬼?它们针对的是什么性质的内存?什么是匿名页?
15、进程耗费的内存、文件系统的缓存何时回收?回收的算法是不是类似LRU?
16、怎样追踪和判决发生了内存泄漏?内存泄漏后如何查找泄漏源?
17、内存大小这样影响系统的性能?CPU、内存、I/O三角如何互动?它们如何综合决定系统的一些关键性能?