本文来自《深入理解操作系统》第九章
虚拟内存
对主存的抽象概念,虚拟内存是硬件异常、硬件地址翻译、主存、磁盘文件和内核软件的完美交互,为每一个进程提供一个大的,一致的、私有的地址空间。
- 三大能力
- 将主存看成是一个存储在磁盘上的地址空间的高速缓存,在主存中只保存活动区域,并根据需要在磁盘和主存之间来回传送数据,高效的使用了主存
- 为**每一个进程提供了一致的地址空间,**简化了内存管理
- 保护了每一个进程的地址空间不被其他进程破坏
物理寻址、虚拟寻址
物理寻址
计算机主存被组织成一个由M个连续的字节大小的单元组成的数组,每字节都有一个唯一的物理地址(Physical Address )
图所说明的是一条加载指令:读取从物理地址4处开始的4字节,当CPU执行这条加载指令时,会生成一个有效物理地址,通过内存总线传递给主存,主存取出物理地址4处开始的4字节,并返回给CPU,cpu将其存放在寄存器中
虚拟寻址
CPU生成一个虚拟地址(Virtual Address)访问主存,这个虚拟地址在被送到内存之前先转换成适当的物理地址,将一个虚拟地址转换为物理地址的任务叫做地址翻译(Address translation).CPU芯片上叫做内存管理单元(Memory Management Unit,MMU),利用存放在主存的查询表来动态翻译虚拟地址,查询表的内容由操作系统管理
- 地址空间
地址空间(Address Sapce)是一个非负整数地址的有序集合
CPU从一个有N=2n个地址的地址空间中生成虚拟地址,这个地址空间称为虚拟地址空间:{0,1,2,…N-1}
一个地址空间的大小是由表示最大地址所需要的位数来描述的,一个包含N=2n个地址的虚拟地址空间就叫做n位地址空间,32位或64位虚拟地址空间
虚拟内存作为缓存的工具
在任意时刻,虚拟页面的集合被分成三个不相交的子集:
- 未分配的:VM系统还未分配的页。未分配的块没有任何数据和他们向关联,不占用磁盘空间
- 缓存的:当前已缓存在物理内存中的已分配页
- 未缓存的:未缓存在物理内存中的已分配页
- DRAM缓存
DRAM比SRAM慢大约10倍,磁盘比DRAM慢大约100 000倍,因此DRAM缓存的不命中比SRAM中的不命中要昂贵的多,因为DRAM缓存的不命中由磁盘来服务,SRAM缓存不命中由基于DRAM的主存来服务
- 页表
同任何缓存一样,虚拟内存系统必须有某种方法来判定一个虚拟页是否缓存在DRAM中的某个地方。如果是,系统还必须确定这个虚拟页存放在哪个物理页中。如果不命中,系统必须判断这个虚拟页存放在磁盘的哪个位置,在物理内存中选择一个牺牲页,并将虚拟页从磁盘复制到DRAM中,替换这个牺牲页。
页表将虚拟页映射到物理页, 每次地址翻译硬件将一个虚拟地址转换为物理地址是,都会读取页表,操作系统负责维护页表的内容,以及在磁盘和DRAM之间来回传送页0
有效位表明该虚拟页当前是否被缓存在DRAM中
- 设置了有效位,地址字段就表示DRAM中相应的物理页的起始位置,这个物理页中缓存了该虚拟页
- 没有设置有效位,表明这个空地址表示该虚拟页还未被分配,否则指向该虚拟页在磁盘上起始位置
-
缺页
DRAM缓存不命中称为缺页
在缺页之前我们的示例页表的状态。CPU引用了VP 3中的一个字,VP 3并未缓存在DRAM中。地址翻译硬件从内存中读取PTE3,从有效位推断出 VP 3未被缓存,并且触发一个缺页异常。
接下来,内核从磁盘复制VP3到内存中的PP 3,更新PTE 3,随后返回。当异常处理程序返回时,它会重新启动导致缺页的指令,该指令会把导致缺页的虚拟地址重发送到地址翻译硬件。但是现在,VP3已经缓存在主存中了,那么页命中也能由地址翻译硬件正常处理了。
-
在磁盘和内存之间传送页的活动叫做交换(Swapping)或页面调度(paging)。页从磁盘换入(页面调入)DRAM和从DRAM换出(页面调出)磁盘
局部性
在任意时刻,程序将趋于在一个较小的活动页面集合上工作,这个集合叫做工作集,或常驻集合。
在最开始,将工作集页面调入到内存中后,接下来对这个工作集的引用将导致命中,不会产生额外的磁盘流量
如果工作集的大小超出物理内存的大小,程序将会产生抖动,此时页面将会不断换进换出
虚拟内存作为内存管理的工具
多个虚拟页面可以映射到同一个共享物理页面上。
VM简化了链接和加载,代码和数据共享,以及应用程序的内存分配
地址翻译
-
页表地址翻译
-
页面命中时,cpu硬件执行的步骤:
1.处理器生成一个虚拟地址,并把它传送给MMU
2.MMU生成PTE地址,并从高速缓存/主存请求得到它
3.高速缓存/主存向MMU返回PTE
4.MMU构造物理地址,并把它传送给高速缓存/主存
5.高速缓存/主存返回请求的数据字给处理器
-
缺页要求和操作系统内核协作完成
1.处理器生成一个虚拟地址,并把它传送给MMU
2.MMU生成PTE地址,并从高速缓存/主存请求得到它
3.高速缓存/主存向MMU返回PTE
4.PTE中的有效位是零,所以MMU触发了一次异常,传递CPU中的控制到操作系统内核中的缺页异常处理程序。
5.缺页处理程序确定出物理内存中的牺牲页,如果这个页面已经被修改了,则把它换出到磁盘。
6.缺页处理程序页面调人新的页面,并更新内存中的PTE。
7.缺页处理程序返回到原来的进程,再次执行导致缺页的指令。CPU将引起缺页的虚拟地址重新发送给MMU。因为虚拟页面现在缓存在物理内存中,所以就会命中,在 MMU执行了图9-13b中的步骤之后,主存就会将所请求字返回给处理器。