前言
为了更加有效的管理内存并且少出错,现代系统提供了一种对主存的抽象概念,叫做虚拟内存(VM)
虚拟内存
- 是硬件异常、硬件地址翻译、主存、磁盘文件和内核软件的完美交互,它为每个进程提供了一个大的、一致的和私有的地址空间。
虚拟内存提供了三个重要的能力:
- 它将主存看成是一个存储在磁盘上的地址空间的高速缓存,在主存中只保存活动区域,并根据需要在磁盘和主存之间来回传送数据,通过这种方式,高效的使用主存
- 它为每个进程提供了一致的地址空间,从而简化了内存管理
- 它保护了每个进程的地址空间不被其它进程破坏
malloc程序,动态内存分配器
9.1 物理和虚拟寻址
计算机系统的主存被组织成为一个由M个连续的字节大小的单元组成的数组。每字节都有一个唯一的物理地址(Physical address,PA)
- 第一个字节的地址为0
- CPU访问内存最自然的方式就是使用物理地址。我们把这种方式成为物理寻址
现代处理器使用的是一种称为虚拟寻址(virtual addressing)的寻址形式。
使用虚拟寻址,CPU通过生成一个虚拟地址来访问主存,这个虚拟地址在被送到内存之前先转换成适当的物理地址
将一个虚拟地址转换成物理地址的任务叫做地址翻译。就像异常处理一样,地址翻译需要CPU硬件和操作系统之间的紧密合作。
CPU芯片上叫做内存管理单元(Memory Managerment Unit)的专用硬件,利用存放在主存中的查询来动态翻译虚拟地址,该表的内容由操作系统管理
9.2 地址空间
9.3 虚拟内存作为缓存的工具
概念上,虚拟内存被组织为一个由存放在磁盘上的N个连续的字节大小的单元组成的数组。每字节都有一个唯一的虚拟地址,作为到数组的索引。
磁盘上数组的内容被缓存在主存中。
- VM系统通过将虚拟内存分割为称为虚拟页(Virtual Page,VP)的大小固定的块
- 物理内存被分割为物理页(Physical Page,PP),大小和虚拟页一致,被称为页帧(Page Frame)
在任意时刻,虚拟页面的集合都分为三个不想交的子集。
- 未分配的
- 缓存的
- 未缓存的
9.4 虚拟内存作为内存管理的工具
9.5 虚拟内存作为内存保护的工具
9.6 地址翻译
9.7 案例研究
9.8 内存映射
Linux通过将一个虚拟内存区域与一个磁盘上的对象(object)关联起来,以初始化这个虚拟内存区域的内容,这个过程称为内存映射(memory mapping)。虚拟内存区域可以映射到两种类型的对象中的一种。
9.9 动态内存分配
9.10 垃圾收集
垃圾收集器(garbage collector)是一种动态内存分配器,它自动释放程序不再需要的已分配块。这些块被称为垃圾(garbage)。
自动回收堆存储的过程叫做垃圾收集(garbage)。在一个支持垃圾收集的系统中,应用显示分配堆块,但是从不显示地释放它们。
垃圾收集器将内存视为一张有向可达图(reachability graph),该图的节点被分成一组根节点(root node)和一组堆节点(heap node),每个堆节点对应于堆中的一个已分配块。