深入理解计算机系统阅读笔记-第十章

第十章 虚拟存储器

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

了解虚拟存储器对程序员有如下帮助:
1、虚拟存储器是核心的。虚拟存储器遍及计算机系统所有层面,在硬件异常、汇编器、链接器、加载器、共享对象、文件和进程的设计中都很重要。理解虚拟存储器将帮助你更好地理解系统是如何工作的。
2、虚拟存储器是强大的。虚拟存储器给予应用程序强大的能力,可以创建和破坏存储器块、将存储器块映射到磁盘文件的某个部分,以及与其他进程共享存储器。理解虚拟存储器将帮助你利用它的强大功能在你的应用程序中添加动力。
3、虚拟存储器是危险的。每次应用程序引用一个变量、间接引用一个指针,或者调用一个诸如malloc这样的动态分配程序时,它就会和虚拟存储器发生交互。如果虚拟存储器使用不当,应用将发生复杂的错误,

10.1 物理和虚拟地址

计算机系统的主存被组织成一个由M个连续字节组成数组。每个字节有唯一的物理地址(physical address,PA)。起始地址为0。CPU通过物理地址访问存储器的方式称为物理寻址(physical addressing)。下图展示了使用物理寻址的系统,指令是从物理地址4处寻址4个字节。执行过程:CPU执行这条加载指令时,它会生成一个有效的物理地址,通过存储器总线,把它传递给主存。主存取出从物理地址4处开始的4个字节,并将它返回给CPU,CPU会将它存放在一个寄存器里。

 现代通用处理器不使用物理寻址,而是使用虚拟寻址(virtual addressing)其框图如下:

CPU通过生成一个虚拟地址(virtual address,VA)来 访问主存,这个虚拟地址在被送到存储器之前,通过存储器管理单元(memory management unit,MMU)专用硬件,利用存放在主存中的查询表成物理地址。

10.2 地址空间

地址空间(address space)是一个非负整数地址的有序集合,如果地址是连续的,称为线性地址空间(linear address space)。本书假设使用的都是线性地址空间。

在一个带虚拟存储器的系统中,CPU从一个有N=2^n个地址的地址空间中生成虚拟地址在,这个地址空间称为虚拟地址空间(virtual address space)。地址空间的大小是由表示最大地址所需要的位数来描述的。如,一个包含N=2^n个地址的虚拟地址空间就叫做一个n位地址空间。体统一般都是32位或64位虚拟地址空间。

系统还有一个物理地址空间(physical address space),它与物理存储器的M个字节相对应。M不要求是2的幂,但为了简化讨论,我们假设M=2^m.

地址空间的概念很重要,因为它清除地区分了数据对象(字节)和他们的属性(地址)。可以概括总结,允许每个数据对象有多个独立的地址,其中每个地址都选自一个不同的地址空间。这就是虚拟存储器的基本思想。主存中的每个字节都有一个选自虚拟地址空间的虚拟地址,和一个选自物理地址空间的物理地址。

10.3 虚拟存储器作为缓存的工具

虚拟存储器被分割为称为虚拟页(virtual page,VP)的大小固定的块。VP的大小为P=2^p字节。物理存储器被分割为物理页(physical page, PP),小小也为P字节。

任意时刻,虚拟页面的集合都分为三个不相交的子集:
1、未分配的:VM系统还未分配(或创建)的页,没有任何数据和它们关联,因此页不占用任何磁盘空间。
2、缓存的:当前缓存在为了存储器中的已分配页;
3、未缓存的:没有缓存在物理存储器中的已分配页。

下图是一个有8个虚拟页的小虚拟存储器。虚拟页0、3未被分配,所以在磁盘上不存在。虚拟页1、4、6被缓存在物理存储器中。页2、5、7已经被分配,但当前并未缓存到DRAM。

10.3.1 DRAM高速缓存的组织结构

这里用SRAM缓存表示CPU和主存之间的L1、L2高速缓存,用DRAM缓存表示虚拟存储器系统的缓存,它在主存中缓存虚拟页。

10.3.2 页表

虚拟存储器系统必须判断虚拟页是否存放在DRAM中,如果是,必须确定这个虚拟页存放在哪个物理页中。如果不命中,必须判断这个虚拟页存放在磁盘的哪个位置,在物理存储器中选择一个牺牲页,并将虚拟页从磁盘拷贝到DRAM中,替换这个牺牲页。提到的这些功能是由软硬件结合实现的,包括操作系统、MMU中的地址翻译硬件,和一个存放在物理存储器中叫做页表(page table)的数据结构。页表将虚拟页映射到物理页。每次地址翻译硬件将一个虚拟地址转换为物理地址时,都会读取页表。操作系统负责维护页表的内容,以及在磁盘与DRAM之间来回传送页。

下图是一个页表的基本结构,有8个虚拟页和4个物理页。4个虚拟页被缓存在DRAM中,VP0和VP5未被分配,VP3和VP6已经分配,但未被缓存。页表的左边有一个有效位,用于标识是否被缓存。

10.3.3 页命中

CPU读取缓存在DRAM中的虚拟页称为页命中

10.3.4 缺页

CPU读取没有缓存的虚拟页称为缺页(page fault)。缺页会触发缺页异常,调用内核中的缺页异常处理程序,该程序会选择一个牺牲页,然后替换。

10.3.5 分配页面

下图展示当操作系统分配一个新的虚拟存储器页时,对我们示例页表的影响。如调用malloc的结果。在这个示例中,通过在磁盘上创建空间,并跟新PTE5,使他指向磁盘上这个新创建的页面,从而分配VP5

10.3.6 局部性再次搭救

尽管在整个运行过程中程序引用的不同页面的总数可能超过物理存储器总的大小,但是局部性原则保证了任意时刻,这些页面将趋向于在一个较小的活动页面(active page)集合上,这个集合叫做工作集(working set)。

10.4 虚拟存储器作为存储器管理的工具

前面都假设只有一个页表,实际上,操作系统为每个进程都提供了一个独立的页表,因而也就是一个独立的虚拟地址空间。如下图,多个虚拟页面可以映射到同一个共享物理页面上。

10.4.1 简化链接

独立的地址空间允许每个进程为它的存储器映像使用相同的基本格式,而不管代码和数据实际存放在物理存储器的何处。例如每个Linux进程都使用下图所示的格式。

 文本区总是从虚拟地址0x08048000开始,栈是从地址0xbfffffff向下延展,共享库代码总是 从地址0x40000000开始,而操作系统代码和数据总是从0xc0000000开始。这样的一致性极大地简化了链接器的设计和实现,允许链接器生成全链接的可执行文件,这些可执行文件是独立于物理存储器总代码和数据的最终位置的。

10.4.2 简化共享

独立地址空间为操作系统提供了一个管理用户进程和操作系统自身之间共享的一致机制。通常,每个进程有私有的代码、数据、堆以及栈区域,是不和其他进程共享的。此时操作系统创建页表,将相应的虚拟页映射到不同的物理页面。

然而,有时,还是需要进程来共享代码和数据。如每个进程必须调用相同的操作系统内核的代码,而每个C程序都会调用标准库中的程序。操作系统通过将不同进程中适当的虚拟页面映射到相同的物理页面,从而安排多个进程共享这部分代码的一个拷贝,而不是在每个进程中都包括单独的内核和C标准库的拷贝。

10.4.3 简化存储器分配

当一个运行在用户进程中的程序要求额外的堆空间时(如

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值