chap9 虚拟内存 virtual memory
CSAPP 读书笔记系列chap9 虚拟内存
这一次说的是虚拟内存VM,是计算机系统提供的一个对内存的抽象,目的是为了更有效地管理内存和少出错,也是一个计算机上很成功的抽象.
9.1 物理和虚拟寻址
对于计算机(以及其他智能设备)来说,虚拟地址通过 MMU(Memory management unit)把虚拟地址(Virtual Address, VA)转换为物理地址(Physical Address, PA),再由此进行实际的数据传输。
可以使用vmstat 命令来查看Linux中虚拟内存的情况,见http://www.cnblogs.com/qingmingsang/articles/6832157.html
地址空间
地址空间也就是一个非负整数地址的有序集合,例如{0, 1, 2, 3 … }
计算机中的虚拟地址为:{0, 1, 2, 3, …, N-1}
- 这里 N = 2^n
而物理空间地址(内存)为{0, 1, 2, 3, …, M-1}
- 这里 M = 2 ^ m-1
* 注意 M < N *,所以内存为VM的缓存
VM 的具体能力为:
使用 DRAM内存(主存) 当做一个存储在磁盘上的地址空间的缓存,在内存中只保存活动的区域,根据需要再在内存和磁盘中传输数据,可以更有效率的使用内存.
为每个进程提供统一的线性地址空间,简化内存管理
保护进程之间地址空间不会相互影响,保护内存管理;例如用户程序不能访问内核信息和代码
下面具体再说
9.2 虚拟内存作为缓存工具
概念上来说,虚拟内存就是存储在磁盘上的 N 个连续字节的数组。磁盘上的数据被分割成块block,一些block,会缓存在 DRAM 中,在 DRAM 中的每个缓存块(cache block)就称为页(page)
- 虚拟页VP(virtual page): VM分配
- 物理页PP(Physical page): 内存分配
其中 VP 和 PP 的大小是一样的,都为P字节 P=2^p,
因为其HIT MISS 的惩罚很高,页一般都很大;通常是 4KB,有的时候可以达到 4MB
另外,DRAM是全相联(Fully associative)的:每一个虚拟页(virual page)可以放在任意的物理页(physical page)中,没有限制。
同时,其替换算法要求也是很高的;且通常使用写回 Write-back 而非 直写Write-through 机制
- Write-through: 命中后更新缓存,同时写入到内存中
- Write-back: 直到这个缓存需要被置换出去,才写入到内存中(需要额外的 dirty bit 来表示缓存中的数据是否和内存中相同,因为可能在其他的时候内存中对应地址的数据已经更新,那么重复写入就会导致原有数据丢失)
如下图所示:
图中VP中的地址有三个状态:
未分配的:VM还没分配的页,不与任何的数据关联.不占磁盘空间
未缓存的: 未缓存的在物理内存的已分配的页,占磁盘空间
缓存的:缓存的在物理内存的已分配的页,占磁盘空间
而VM和内存之间的映射是通过页表 实现的
页表(page table)
每个页表实际上是一个数组,数组中的每个元素称为页表项(PTE, page table entry),每个页表项负责把虚拟页映射到物理页上。
在 内存DRAM 中,每个进程都有自己的页表
例如下面的一个图:
页表VM和PM映射
所以这里也会像cache那样发生命中和不命中
- 命中(Page Hit)
- 访问到页表中蓝色条目的地址时,因为在 DRAM 中有对应的数据,可以直接访问。
- 由于局部性原理,命中的几率会很高,虚拟内存其实是非常高效的机制.
不命中(Page Fault),也就是常说的缺页
访问到 灰色条目的时候,因为在 DRAM 中并没有对应的数据,所以需要执行一系列操作(从磁盘复制到 DRAM 中),具体为:
触发 Page fault,也就是一个异常
- Page fault handler 异常处理器 会选择 DRAM 中需要被置换的 page,并把数据从磁盘复制到 DRAM 中
- 重新执行访问指令,这时候就会是 page hit
然后程序一般是在一个较小的活动页面集合(工作集)上工作的,可以很好地使用局部性.
9.3 虚拟内存作为内存管理的工具
因为在 内存DRAM 中,每个进程都有自己的页表,也就是一个独立的虚拟地址空间
例如下图中
多个虚拟页面可以映射到同一个共享的物理页面上,PP6是一个共享的物理页面
此外,因为有了统一的抽象,不需要纠结细节,所以VM 还可以提高以下功能:
- 简化链接: 每个进程的内存映象都是相同的基本格式,不管实际的代码和数据存放的物理位置
- 简化加载
- 简化共享: 也是进程间通信的一个方式,如上图
- 简化内存分配: 由于页表的形式,内存分配只是需要在VM上进行,而不管P&#x