虚拟存储器概念
虚拟存储器概念
复习定位
虚拟存储器使每个进程感觉自己拥有比实际物理内存大得多的可用内存。程序可以按地址顺序访问一个巨大的地址空间——但实际上只有当前需要的部分页面在物理内存中——其他页面暂时存储在磁盘上。当程序访问未在物理内存中的页面时——硬件触发缺页中断——内核将该页面从磁盘读入内存——进程才能继续执行。这就是"虚拟内存"的基本面目——也是操作系统利用局部性原理实现"小内存运行大程序"的巧妙方式。
为什么要虚拟存储器
在虚拟存储器出现前——程序必须在物理内存中完全装入才能运行。当程序的大超过物理内存大小时——程序无法运行。虚拟存储器利用局部性原理——程序执行时——它只会访问一小部分地址空间——其余部分暂时不需要——可以存放在磁盘上——需要时再从磁盘调入。
虚拟存储器的好处:
- 内存空间利用率高——不常用的代码和数据不会占用宝贵的内存。
- 多道程序并发度提高——每个程序占用较少的物理内存——内存中可以容纳更多的进程。
- 编程简单——程序员无需考虑物理内存大小——只需在大的逻辑地址空间中编程。
请求分页系统
在请求分页系统中——程序按需调入页面——程序刚启动时只有很少量的页面在内存中——程序执行时遇到不在内存的页面时向磁盘请求缺页中断。
缺页中断的处理流程:
- CPU访问某逻辑地址——MMU查询页表——发现该页有效位=0(存在位为假)——该页不在内存中。
- CPU触发缺页中断(Page Fault)——CPU切换到内核态——操作系统缺页中断处理程序被调用。
- 处理程序检查访问地址是否合法——如果该地址在进程的地址空间范围内——则继续处理;如果在范围外——发送SIGSEGV或访问冲突错(段错误)给进程。
- 操作系统找一个空闲的物理页框。
- 如果没有空闲页框——调用页面置换算法淘汰一个页面。
- 如果被淘汰的页面被修改过(脏位为真)——将其写入磁盘(交换区)。
- 操作系统从磁盘读取所需的页面到空闲页框。
- 更新进程的页表——添加新的映射关系——有效位设为1。
- 从该进程被中断的位置重新启动指令——继续执行。
请求分段系统
请求分段系统的思想与请求分页相同——但以段为单位进行换入换出——段的长度是可变的(不像页是4KB固定大小)。段页式系统结合了分段和分页的优点——按段划分模块——按页离散分配。
虚拟内存的性能考虑
有效访问时间(EAT) = 命中率×内存访问时间 + 缺页率×(磁盘访问时间)。
假设缺页率=0.001(1‰)——内存访问时间=100ns——磁盘访问时间=5ms——EAT ≈ 1×100ns + 0.001×5ms = 100ns + 5μs ≈ 5.1μs——比纯内存访问慢了约50倍。所以缺页率必须极低(<0.0001)才能让虚拟内存接近真实内存的性能。
复习检查
为什么虚拟存储器可以比物理内存大——因为它利用了局部性原理——程序中只有一部分是当前需要的——其余部分在磁盘上。
缺页中断和普通中断的主要区别——缺页中断在执行一条指令的过程中可能多次发生(如一条指令需要读写多个地址)——且缺页中断处理后需要重新执行被中断的指令(因为硬件需要读到数据)。
局部性原理——空间局部性(访问一个地址后其相邻地址也常被访问——如数组遍历)和时间局部性(刚访问过的地址可能很快又被访问——如循环变量)使程序在任何一个短时间段内——只访问其地址空间中的一个小子集——这是虚拟存储器能正常工作的大前提。
缺页中断处理的第9步——为什么CPU需要重新执行被中断的指令——因为该指令的取指或访存操作因为缺页而未能完成——必须重启——而不是继续执行下一条。
如果虚拟内存中缺页率太高——会导致系统颠簸(Thrashing)————CPU大部分时间都在等待磁盘I/O处理缺页——有效工作接近于零——应减少同时运行的程序数(降低多道程序度)给进程分配足够工作集页框。