OS-12-内存管理
# 内存管理
2021-12-11
Tags: #OperatingSystem/Memory
程序运行不仅需要处理机, 还需要有地方来保存代码与数据, 这一节我们谈论计算机在运行时, 这些这些数据是如何管理的.
# 目标
- 电脑的内存总是有限的, 我们想要用有限的内存满足更多的程序的需要, 并且还想这些程序运行得越快越好.
- 在容量上, 为了营造一个内存"无限大"的假象, 我们可以从"开源", “节流"两方面来入手:
- 节流就是要减少不必要的内存浪费. 分段把程序分成大小不同的段, 避免了程序内部大段的空白. 分页则把程序分成大小相同的页, 在减少内部碎片的同时便于管理.
- 分页管理进一步带来了页表过大的问题: 一个进程完整地址空间的页表本身也可能有大段的空白. 这催生了对分段和分页的结合: 段页法通过对页表进行分段来减少页表的大小. 当然, 我们也可以对页表再次进行分页, 用多级页表来解决这个问题.
- 开源则是将不常用的内存数据暂时存储在磁盘, 来扩展内存的大小. 虚拟内存做到了这一点.
- 节流就是要减少不必要的内存浪费. 分段把程序分成大小不同的段, 避免了程序内部大段的空白. 分页则把程序分成大小相同的页, 在减少内部碎片的同时便于管理.
- 在速度上, 以上管理内存的方法都增加了系统的复杂性, 地址变换等工作减慢了调用内存数据的速度.
- 在分页里面, 我们可以增设Cache, 用TLB保存曾经使用过的地址变换结果, 减少内存访问次数.
- 在虚拟内存里面, 我们可以设置高低水位线, 在后台主动地释放一些内存(到磁盘), 避免重要进程在运行时触发Page Fault, 造成时间的大量浪费.
# 随之而来的问题
分配问题与替换问题是在进行内存管理时需要处理的共性问题:
分配问题就是对于有限资源(空闲内存)的管理与分配.
- 不均匀地分配内存空间会带来外部碎片, Best Fit / Worst Fit / First Fit / Next Fit … 就是一些匹配算法, 想要尽可能合理地分配空闲空间.
- 时不时地整理内存空间, 进行空间归并也是一个很好的方法, 但是它的开销很大.
- 除此以外, 我们还可以从数据结构的角度入手: 链表是管理空闲空间最简单的方法, 但像是"Binary Buddy Allocator”, 平衡二叉树等方法可以增加查找空闲空间的速度, 增加系统的可拓展性, 也可以更好地管理内存.
替换问题就是有限资源(内存, TLB)已经被塞满时, 该踢出哪个旧单元, 从而周转进新的单元.
- 这类问题的一个典型场景就是某个元素可以在两个地方周转: 一个地方小而快, 另一个地方大而慢. (E.g. Register&Memory, Cache(TLB)&SlowerMemory, Memory&Disk)
- 替换算法有很多: FIFO, 随机方法, LRU(Least Recently Used), LFU(Least Frequently Used), 近似LRU等等
- 在虚拟存储里面这是一个很重要的问题, 因为磁盘实在是太慢了, 置换算法的性能提升带来的收益是很可观的.
多级的思想: 存储器层次结构, 应当阅读<计算机组成与设计:硬件、软件接口>第五章.
程序在运行时的局部性原理是上面很多方法的基础, 局部性原理分为空间局部性和时间局部性.
并且, 我们做的所有内存管理工作都要尽可能对程序(员)透明, 在运行程序的时候, 我们不想考虑太多令人头疼的内存管理问题