虚拟存储器
思维导图¶
分区方案¶
简单分区:¶
-
原理:使用长度不等的固定长分区,当一个进程调入主存时,分配给它一个能容纳的最小分区
-
缺点:固定长度的分区,可能会浪费 主存空间。多数情况下,进程对分区大小的需求不可能和提供的分区大小一样
可变长分区(Partitioning)¶
-
原理:分配的分区大小与进程所需大小一样
-
特点:开始较好 ,但到最后存储器中会有许多碎片。时间越长,存储器的碎片会越来越多,存储器的利用率下降
-
程序员自己手动管理内存,可以改善内存碎片化问题(例如一次性 malloc 或 new、stl 新建容器好几 kb 大小......
分页(Paging)¶
-
基本思想
-
内存分成固定长且较小的存储块(页框/page frame)
-
每个进程也划分成固定长的程序块(页/page)
-
程序块(页/page)可装到内存可用的存储块(页框/page frame)中
-
无需用连续页框来存放一个进程
-
操作系统为每个进程生成一个页表:页和页框一一对应的关系表
-
通过页表(page table)实现逻辑地址向物理地址转换(Address Mapping)
虚存技术的实质¶
程序员在比实际主存空间大得多的逻辑地址空间编写程序¶
程序执行时,把当前需要的程序段和相应的数据块调入主存,其他暂不用的部分存放在磁盘上¶
指令执行时,通过硬件将逻辑地址(亦称虚拟地址或虚地址)转化为物理地址(亦称主存地址或实地址)//分页查表¶
在发生指令或数据访问失效时,由操作系统进行主存和磁盘之间的信息交换¶
每个进程都有专属于自己的从 0 到 FFFFFFFFH 的地址空间¶
快表 / 转换后备缓冲器 / TLB (Translation Lookaside Buffer)¶
原理:¶
-
使用 Cache 来存储页表项,称为 TLB,它包含最近使用的那些页表项,加速虚实地址转换
-
多用全相联:命中率高,小、成本不高
-
采用随机替换策略:降低替换算法开销
-
采用回写策略:减少访问内存的次数
TLB 页表项¶
-
Tag 位
-
Index 位,组相联时才有
-
Physical Adress,对应物理页框号
-
其他标志位
-
Valid 位,1 位
-
Dirty 位,1 位
-
Ref
-
Access
TLB 缺失¶
基本概念¶
主存分配¶
-
操作系统:固定(ROM)
-
用户区:分区(RAM)
三种地址空间:¶
-
虚拟地址空间
-
主存地址空间
-
辅存地址空间
地址映射:把虚拟地址空间映射到主存地址空间¶
地址变换:程序运行时,把虚拟地址变换成主存物理地址¶
为什么需要虚存¶
同时运行更多进程,内存需求增大¶
允许多个程序有效而安全地共享存储器,消除内存因小而有限的存储器容量给程序设计造成的障碍¶
-
可以更有效的共享处理器和主存
-
虚拟存储器实现程序地址空间到物理空间的转换,加强了各个程序地址空间之间的保护
允许单用户程序大小超过主存储器的容量¶
- 虚拟存储器自动管理主存和辅存组成的两级层次结构
虚存组织方式¶
页式¶
-
原理:
-
虚存地址空间和主存地址空间按统一大小分成若干页,虚存称为虚页,主存称为实页
-
程序按页从磁盘调入主存(某一虚页调入某一实页)
-
指令给出虚拟地址/逻辑地址
-
每个页表项记录对应的虚页情况
-
Valid 为 0 说明“miss”(称为 page fault / 缺页)
-
CPU 执行指令时,先将逻辑地址转换为物理地址
-
地址转换由 MMU 实现
-
页大小比 Cache 中 Block 大得多
-
采用全相联映射
-
通过软件来处理“缺页”
-
采用 Write Back 写策略
-
地址格式
-
虚存的地址格式 (逻辑地址格式):
-
直接映射虚拟地址
-
高位,虚拟地址比物理地址长的位数,算在 Tag 位里
-
Tag 位,标记位 长度 = log _2 ( 主存中 页 的 数量 / TLB 中 页表项 的 数量 )
-
Index 位,Cache 槽号 长度 = log _2 ( TLB 中 页表项 的 数量 )
-
Offset 位,页内地址 长度 = log _2 ( 页 的 大小 ) (按编址单位算)
-
全相联虚拟地址
-
高位,虚拟地址比物理地址长的位数,算在 Tag 位里
-
Tag 位,标记位 长度 = log _2 ( 主存中 页 的 数量 )
-
Offset 位,页内地址 长度 = log _2 ( 页 的 大小 ) (按编址单位算)
-
n 路组相联虚拟地址
-
高位,虚拟地址比物理地址长的位数,算在 Tag 位里
-
Tag 位,标记位 长度 = log _2 ( 主存中 页 的 数量 / 组的数量)
-
组号位 长度 = log _2 ( 组 的 数量 )
-
Offset 位,页内地址 长度 = log _2 ( 页 的 大小 ) (按编址单位算)
-
-
主存的地址格式 (物理地址格式):
-
实页号 / 物理页号
-
页内地址
-
-
页表(Page Table) 建立一个映射关系表来存放虚拟地址与物理地址之间的映射关系,该映射关系表被称为页表,用来实现虚实地址的转换
-
建立在主存中,操作系统为每道程序建立一个页表
-
设置页表基址寄存器:保存页表在主存中的起始地址
-
页表项
-
装入位
-
修改(Dirty)位
-
替换控制位
-
访问权限位
-
禁止缓存位
-
实页号
-
-
页表的项数 = 页表的容量 = 最大页表项 = 虚存大小 / 页大小
-
页表大小 = 页表的项数 * 页表项大小
-
异常情况
-
缺页( page fault)
-
产生条件:当 Valid(有效位 / 装入位)为 0 时
-
相应处理:从磁盘中读信息到内存,若内存没有空间,则还要从内存选择一页替换到磁盘上,替换算法类似于 Cache,采用回写法,页面淘汰时,根据“dirty”位确定是否要写磁盘
-
异常处理结束后:缺页发生时,当前指令的执行被阻塞,当前进程挂起;缺页处理结束后,回到原指令继续执行
-
-
保护违例( protection_violation_fault )
-
产生条件: 当 Access Rights (存取权限)与所指定的具体操作不相符时
-
相应处理:在屏幕上显示“内存保护错”信息
-
异常处理结束后:当前指令执行被阻塞,当前进程终止
-
Access Rights (存取权限)可能的取值有哪些?
-
R = Read-only
-
R/W = read/write
-
X = execute only
-
-
特点
-
优点:实现简单,开销少。因为只有进程的最后一个零头(内部碎片)不能利用,故浪费很小
-
缺点:由于页不是逻辑上独立的实体,可能会出现如“一条指令跨页”等情况(CISC),使处理、管理、保护和共享都不方便