深入理解计算机系统(第3版) 第九章 虚拟内存

1.虚拟内存

为了更加有效地管理内存并且少出错,现代系统提供了一种对主存的抽象概念,叫做虚拟内存(VM)。

虚拟内存是硬件异常、硬件地址翻译、主存、磁盘文件和内核软件的完美交互,它为每个进程提供了一个大的、一致的和私有的地址空间。

通过一个很清晰的机制,虚拟内存提供了三个重要的能力:1)它将内存看成是一个存储在磁盘上的地址空间的高速缓存,在主存中只保存活动区域,并根据需要在磁盘和主存之间来回传送数据,通过这种方式,它高效地使用内存;2)它为每个进程提供了一致的地址空间,从而简化了内存管理;3)它保护了每个进程的地址空间不被其他进程破坏。

 

2.物理寻址

计算机系统的主存被组织成一个由M个连续的字节大小的单元组成的数组。每字节都有一个唯一的物理地址(physical address,PA)。第一个字节的地址为0,以此类推,直到M-1,给定这种简单的结构,CPU访问内存的最自然的方式就是使用物理地址,我们把这种方式称为物理寻址(physical addressing)。

深入理解计算机系统(第3版) 第九章 虚拟内存_第1张图片

 

3.虚拟寻址

使用虚拟寻址,CPU通过生成一个虚拟地址(virtual address,VA)来访问主存,这个虚拟地址在被送到内存之前先转换成适当的物理地址。将一个虚拟地址转换为物理地址的任务叫做地址翻译(address translation)。

就像异常处理一样,地址翻译需要CPU硬件和操作系统之间的紧密合作,CPU芯片上叫做内存管理单元(memory management unit,MMU)的专用硬件,利用存放在主存中的查询表来动态翻译虚拟地址,该表的内容由操作系统管理。

深入理解计算机系统(第3版) 第九章 虚拟内存_第2张图片

 

4.垃圾收集

垃圾收集器(garbage collector)是一种动态内存分配器,它自动释放程序不再需要的已分配块,这些块被称为垃圾(garbage)(因此术语就称之为垃圾收集器)。

自动回收堆存储的过程叫做垃圾收集(garbage collection)。

在一个支持垃圾收集的系统中,应用显示分配堆块,但从不显示地释放它们,在C程序的上下文中,应用调用malloc,但是从不调用free。反之,垃圾收集器定期识别垃圾块,并相应地调用free,将这些块放回到空闲链表中。

垃圾收集器将内存视为一张有向可达图(reachability graph),如下图,该图的节点被分成一组根节点(root node)和一组堆节点(heap node)。每个堆节点对应于堆中的一个已分配块。

有向边p -> q意味着块p中的某个位置指向块q中的某个位置。根节点对应于这样一种不在堆中的位置,它们中包含指向堆中的指针。这些位置可以是寄存器、栈里的变量,或者是虚拟内存中读写数据区域内的全局变量。

当存在一条从任意根节点出发到达p的有向路径时,我们说节点p是可达的(reachable)。在任何时刻,不可达节点对应于垃圾,是不能被应用再次使用的。垃圾收集器的角色是维护可达图的某种表示,并通过释放不可达节点且将它们返回给空闲链表,来定期的回收它们。

深入理解计算机系统(第3版) 第九章 虚拟内存_第3张图片

 

第九章小结

深入理解计算机系统(第3版) 第九章 虚拟内存_第4张图片

你可能感兴趣的:(system)