存储器介绍
1. 存储器基本概念
1. 计算机中的存储器
- 存储器:存储器是计算机系统中的记忆设备,用来存放程序和数据
- 主存(\(Memory\)):也叫内存,多指存储器的整体,包括记录介质,有关电路和其他部件
- 辅存(\(Storage\)):也叫外存,多指记录介质本身,包括:磁盘、固态盘、磁带、存储阵列等
- 存储器在计算机中的地位和作用
- 向\(CPU\)提供数据和指令
- 控制输入输出设备的读写
- 基本术语
- 记忆单元:又称存储位元,位元(\(cell\)),是具有两种稳态的能够表示二进制数0和1的物理器件
- 存储单元:又称编址单位;存储器中具有相同地址的那些位构成一个存储单元,又称为一个编址单位
- 存储体:或称存储矩阵或存储阵列,所有存储单元构成一个存储阵列
- 存储器地址寄存器\(MAR\):用于存放主存单元 地址 的寄存器
- 存储器数据寄存器\(MDR\):用于存放主存单元 数据 的寄存器
- 机器字长:运算器中参加运算的寄存器的位数,即:数据通路的宽度
- 存储字:存储芯片中一个读写单位,一般等于存储器的数据线宽度
- 编址方式:对存储体中各存储单元进行编号的方法
- 传输单位:一次读写存储器的数据单位
- 对主存而言,指一次从主存读出或写入的数据位数
- 对辅存而言,数据通常按块传输,传输单位为块
2. 存储器分类
- 按 在计算机中的作用分类
- 寄存器型存储器
- 位置:亦称便笺式存储器,由寄存器构成,封装在\(CPU\)内
- 存放数据:用于存放当前正在执行的指令和使用的数据
- 实现技术:用触发器实现,速度快,容量小\(O(KB)\)
- 高速缓冲存储器(\(Cache\))
- 位置:位于\(CPU\)内部或位于主存和\(CPU\)之间
- 存放数据:用来存放当前正在执行的局部程序段和数据
- 实现技术:用\(SRAM\)实现,速度\(O(ns)\),容量\(O(MB)\)
- 主存储器
- 位置:位于\(CPU\)之外
- 存放数据:用来存放已被启动的程序及所用数据
- 实现技术:用\(DRAM\)实现,速度\(O(ns)\)、容量\(O(GB)\)
- 辅助存储器
- 位置:不能由\(CPU\)的指令直接访问
- 存放数据:用来存放暂不运行的程序、数据或存档文件
- 实现技术:用磁、光等存储器件实现,容量大,但速度慢\(O(ms)\)
- 按 存储介质分类
- 半导体存储器
- 速度快,用作 内存
- 记忆原理:双稳态触发器,电容
- 磁表面存储器
- 用陶瓷、非磁性金属或塑料作载磁体,磁化后具有两种不同的剩磁状态记录信息1和0
- 非易失,容量大并且每位价格低用作外存
- 光盘存储器
- 有机玻璃作载磁体,利用磁化、晶态/非晶态表示信息
- 非易失,可靠性高,保存时间长,容量大且易于更换
- 存储速度比硬盘低一个数量级
- 其他:铁电存储器、相变存储器、阻变存储器:掉电数据不丢失,速度快
- 按 存储方式分类
- 随机访问存储器\(RAM\)
- 存储器任意单元可随时访问且访问所需时间基本相同
- 访问时间与存储单元所处的物理位置无关
- 特点:速度快\(O(ns)\)
- 应用:主存和\(Cache\)
- 只读存储器\(ROM\)
- 正常工作时只读,能随机读出,不能随机写入
- 分类
- \(MROM\):只读
- \(PROM\):一次写入
- \(EPROM,E2PROM\):可多次改写
- 相联存储器\(CAM\)
- 按内容检索到存储位置进行读写
- 特点:速度快\(O(ns)\),价格高
- 应用:\(Cache\) 中的快表(\(TLB\))
- 直接存取存储器\(DAS\)
- 信息的组织同SAS,介于随机和顺序存取之间
- 可以直接定位到要读写的数据块,存取时间的长短与数据所在位置有关
- 速度慢\(O(ms)\)
- 应用:磁盘
- 顺序存储器\(SAS\)
- 存储时以数据块为单位存储,顺序地记录在存储介质上
- 数据按顺序从存储载体的始端读出或写入,存取时间的长短与数据所在位置有关
- 速度慢、容量大、成本低,用作后援外存
- 应用:磁带、电荷耦合器件\(CCD\)、\(VCD\)
- 按 信息的可保存性分类
- 断电后是否丢失数据
- 易失性存储器(挥发性存储器):断电后信息丢失:\(SRAM\)、\(DRAM\)
- 非易失性存储器(非挥发性存储器):断电后信息不丢失:\(ROM\)、磁盘、闪存
- 读出后是否保存数据
- 破坏性存储器:读出时原存信息被破坏,需要重写:\(DRAN\)
- 非破坏性存储器:读出时原存信息不破坏:\(SRAM\)
3. 内存的主要技术指标
- 存储容量:内存所能容纳的二进制位(bit)个数的总和,即构成内存的存储位元的总和
- 单位:\(B(Byte),KB(2^{10}), MB(2^{20}), GB(2^{30}), TB(2^{40})\)
- 计算公式:存储容量 \(=\) 存储单元个数 \(\times\)
- 存取时间\(T_A\):启动一次存储器操作到完成该操作所用时间
- 存储周期\(T_S\):连续两次启动同一存储器进行存取操作所需的最小时间间隔,亦称存取周期或访问周期
- \(T_A < T_S\),且两者的差别取决于存储信息的器件和电路,存储介质和控制线路需要恢复时间
- 存储宽度:一次访存操作可存取的数据位数或字节数,存取宽度由编址方式决定
- 存储带宽:每秒传输的最大数据量(位/秒)
- 改善计算机瓶颈的一个关键因素
- 可靠性:以两次故障之间的平均时间间隔\(MTBF\)作为参考依据
- 功耗:反映存储器件耗电多少
- 维持功耗:保持时功耗
- 工作功耗:读写时功耗
- 集成度:标识单个存储芯片的存储容量
4. 内存与外存的关系与区别
- 关系
- 区别
- 外存储器
- 存取速度慢
- 成本低、容量很大
- \(CPU\)不能直接访问(外存中的程序及数据必须先传送到内存,才能被\(CPU\)使用)
- 非易失性存储器(\(Nonvolatile\)),用于长久存放信息
- 内存储器
- 存取速度快
- 成本高、容量相对较小
- \(CPU\)可以直接对内存中的指令及数据进行读、写操作
- 易失性存储器(\(volatile\)),用于临时存放正在运行的程序和数据
5. 随机存取存储器\(RAM\)
- 随机存储器
- 静态随机存储器\(SRAM\)
- 只要加上电源,信息就可以一直保持
- 对电器干扰相对不是很敏感
- 比\(DRAM\)更快,但是也更贵
- 一般用作\(Cache\)
- 动态随机存储器\(DRAM\)
- 每隔一段时间必须刷新一次
- 对电器干扰较为敏感
- 比\(SRAM\)慢,但是便宜
- 一般用作主存储器
- 记忆原理
- \(DRAM\):电容,充放电
- \(SRAM\):触发器
- 存储矩阵分布
- 线选法(一维地址译码)存储矩阵
- 假定有\(k\)位地址,则地址译码驱动线的条数为\(2^k\)
- 一般\(SRAM\)采用线选法,只在单方向上译码,同时读出一条字线上的所有位
- 位片式(二维双译码)存储矩阵
- 假定有\(k\)位地址,则地址译码驱动线的条数为\(2^{k/2}+2^{k/2}\)
- 位片式可在字方向和位方向扩充,需要有 片选信号
- \(SRAM\)和\(DRAM\)存储器的特性
|
| |
存储原理 | 电容 | 触发器 |
集成度 | 高 | 低 |
芯片引脚 | 少 | 多 |
速度 | 慢 | 快 |
价格 | 低 | 高 |
刷新 | 有 | 无 |
应用 | 主存、帧缓冲区 | 高速缓存存储器 |
- \(PC\)
- 主存储器由若干内存条组成
- 内存条(存储模块)的组成:把若干片\(DRAM\)芯片焊装在一小条印制电路板上制成
- 内存条必须插在主板上的内存条插槽中才能使用
6. 只读存储器\(ROM\)
- 只读存储器
- 不可在线改写内容的的\(ROM\):用作\(BIOS\)
- 闪存\(Flash\):用作\(U\)盘,图形卡等
- 特点
- 工作过程中,信息只能读不能写
- 非破坏性读出,无需再生
- 也以随机存取方式工作
- 信息用特殊方式写入,一经写入,就可长久保存,不受断电影响。故是非易失性存储器
- 用途
- 用来存放一些固定程序。如监控程序、启动程序等。只要一接通电源,这些程序就能自动地运行
- 可作为控制存储器,存放微程序
- 还可作为函数发生器和代码转换器
- 在输入/出设备中,被用作字符发生器,汉字库等
- 在嵌入式设备中用来存放固化的程序
- 分类
- 固定掩膜\(MROM\):只能读,不能修改
- 结构简单、集成度高、价格便宜
- 使用不灵活、一经生产为成品,则无法修改
- 宜于标准化和大批量生产的定型产品
- 一次可改写的\(PROM\):只能修改一次,修改后只读
- 可根据需要编程一次,但写入不可逆,\(PROM\)原则上无法修改
- 熔断丝型\(PROM\)为主流,初始在行、列交叉点连接一段熔丝,存入0。若该位需写入1,则将熔丝熔断,但熔断后信息不能改变
- 对改写电流和工作电流有一定的要求
- 可多次改写的\(ROM\):可多次擦除、多次改写,改写之前要先擦除
- 光擦除电可编程只读存储器,亦称\(EPROM\)
- 电擦除电可编程只读存储器 \(E2PROM\)
- 块擦除电可编程的快擦写存储器\(Flash\space Memory\)
2. 主存储器
1. 主存储器逻辑设计
- 存储器基本原则
- 使用要求
- 存储器的性质:主存、\(Cache、CM、DRAM、SRAM、ROM\)
- 存储器的性能指标:速度、容量、字长
- 存储器的环境条件:温度、湿度、船载、机载
- 实际条件
- 现有芯片:集成度、速度、功耗、字位结构
- 技术条件:测试条件、设计水平
- 生产工艺:测试、组装、加工等技术水平
- 容量扩展
- 位扩展:字数不变(存储单元个数不变),位数扩展(字长加长):
- 需要芯片:\(\lceil N/n\rceil\)
- 引脚:芯片地址线及读/写控制线对应相接,而数据线单独引出,没有外部译码器
- 字扩展:位数不变(字长不变)、扩充容量(存储单元个数增加):\(m\times n\to M\times n(m < M)\)
- 需要芯片:\(\lceil M/m\rceil\)
- 引脚:地址线、读/写控制线等对应相接,片选信号分别与外部译码器各输出端相连(\(A_{11}\)作为地址选择线)
- 字位同时扩展:存储单元个数,字长同时增加,即存储器地址码位数多于芯片地址码位数,存储器存储单元中位元数大于芯片存储单元中位元数。给出地址后,同行芯片均工作\(m\times n\to M\times N(n < N, m < M)\)
- 需要芯片:\(\lceil M/m\rceil\times\lceil N/n\rceil\)
- 例:用1K×4位芯片构成4K×8位存储器,需要8个芯片,地址范围分别为:0000-3FFH, 400-7FFH,800-BFFH,C00-FFFH;地址线、读/写控制线等对应相接,片选信号则分别与外部译码器各个译码输出端相连
2. 存储器与\(CPU\)的连接
- 地址线的连接
- \(CPU\)地址线数决定了整个主存空间的寻址范围:\(CPU\)地址线数>存储芯片地址引脚线
- 通常将\(CPU\)地址线的低位和存储芯片地址线相连,高位用作字扩展时的片选信号的 译码
- 数据线的连接
- \(CPU\)数据线数决定了一次可读写的最大数据宽度:\(CPU\)数据线数>存储芯片数据引脚线
- 通常将\(CPU\)数据线连到多个位扩展的芯片中,使扩展后的位数与\(CPU\)数据线数相等
- 控制线的连接
- 若\(CPU\)读/写命令线和存储芯片的读/写控制线是一根,且电平信号一致,则可直接相连
- 若\(CPU\)读/写命令线分开,则需分别进行连接
- \(CPU\)和主存之间的两种通信方式
- 异步方式过程
- \(CPU\)送地址到地址线,主存进行地址译码
- \(CPU\)发读/写命令,然后等待存储器发回完成信号
- 主存收到读命令后开始读/写数,完成后发完成信号给\(CPU\)
- \(CPU\)接收到完成信号,从数据线读/写数
- 同步方式过程
- \(CPU\)和主存由 统一时钟信号 控制,无需应答信号
- 主存总是在确定的时间内准备好数据
- \(CPU\)送出地址和读命令后,总是在确定的时间取数据
- 存储器芯片必须支持同步方式
3. \(DRAM\)的刷新
- 刷新原因:\(DRAM\)靠 电容 上的电荷存储效应记忆信息,会泄漏电荷;为保证所存信息的正确性,需要用充电的方法及时使所有位元的电容上电荷恢复到泄漏前的状态,即刷新
- 刷新原则
- 定时刷新
- 刷新优于访存,但不能打断访存
- 刷新期间不允许访存
- \(DRAM\)刷新有关参数
- 信息保持时间\(T_{ref}\):从信息以电荷形式存入电容,到电荷经过一段时间泄漏,读放仍能鉴别出原存信息的时间
- 刷新周期\(T_{rc}\):对同一存储位元连续两次刷新,仍能保证鉴别出原存信息的最大允许间隔时间,即在\(T_{rc}\)内必须对每个单元刷新一遍;一般为\(ms\)级,亦称为刷新间隔时间;\(T_{rc} < T_{ref}\)
- 刷新操作周期\(T_{roc}\):刷新一行存储位元所需时间,通常和\(DRAM\)读写周期相同
- 刷新操作周期\(N_r\):存储芯片所有位元刷新一遍所需的刷新操作周期个数。它与芯片的内部结构有关。即每次可以刷新一行, \(N_r\)决定于存储矩阵的行数
- 刷新分类
- 集中式刷新:从刷新周期\(T_{rc}\)中抽出最后部分访存周期作为刷新操作周期集中进行刷新。亦称批刷新
- 缺点:集中式刷新使\(98.976\%\)的时间用于访存,这期间存储器的效能得以充分发挥,但有\(1.024\%\)的时间,即在\(8ms\)中有\(81.92\mu s\)不允许访存,\(CPU\)要处于等待状态,影响了计算机的工作效率
- 优点:控制逻辑简单,设计容易实现
- 分散式刷新:把集中到一起的不允许访存的刷新时间分散开,每个等分的最后一个访存周期用作刷新操作周期,以完成一行存储位元的刷新,其余时间则用于访存
- 缺点:控制逻辑复杂,设计不易实现
- 优点:降低了刷新和访存的冲突概率,提高了计算机的工作效率
- 透明式刷新:设一个系统的访存周期是存储器实际访存周期的两倍,并令系统访存周期的前半周期用于访存,后半周期用于刷新
- 缺点:存储器的效能仅利用\(50\%\),仅用于低速系统
- 优点:控制简单、设计容易,不需增加多少器件
1. 程序访问的局部性
计算机存储工作过程
- \(CPU\)运行时,需要的操作数大部分来自寄存器
- 需从(向)存储器中取(存) 数时,先访问\(cache\);若在,取自\(cache\)
- 若不在\(cache\),则访问\(RAM\);若在,则取自\(RAM\)
- 若不在\(RAM\),则访问磁盘,操作数从磁盘中读出\(\to RAM \to cache\)
程序访问的局部性
- 程序访问的局部性:在较短时间间隔内,程序产生的地址/所访问数据往往集中在存储器的一个很小范围内
- 产生原因
- 指令:按序存放,地址连续。如循环程序段等重复执行
- 数据:连续存放。如数组元素重复、按序访问
- 时间局部性:刚被访问过的存储单元很可能不久又被访问
- 空间局部性:刚被访问过的存储单元的邻近单元很可能不久被访问
2. 高速缓存\(Cache\)
- \(Cache\):为了加速访存,在\(CPU\)和主存之间设置的一个快速、小容量的存储器,根据 程序访问的局部性 存放最活跃(即被频繁访问)的程序块和数据
- \(Cache\)结构
- \(Cache\)是小容量、高速缓冲存储器,由\(SRAM\)组成
- \(Cache\)直接制作在\(CPU\)芯片内,速度几乎与\(CPU\)一样快
- 一般将\(Cache\)和主存的存储空间都划分为若干大小相同的块(主存中称为:块\(Block\)、\(Cache\)中称为:行\(line\))
- \(Cache\)原理
- 程序运行时,\(CPU\)使用的一部分数据/指令会预先成批拷贝到\(Cache\)中,\(Cache\)的内容是主存储器中部分内容的映象(副本)
- 当\(CPU\)需从主存读(写)数据或指令时,先查看\(Cache\)若有,则直接从\(Cache\)中取,不用访问主存若没有,则直接访问主存
- 命中\(Hit\):要访问的信息在\(Cache\)中
- 命中率 \(p\):在\(Cache\)中的概率
- 命中时间 \(T_c\):访问\(Cache\)所需时间,包括 判断时间 + \(Cache\)访问
- 失效\(Miss\):要访问的信息不在\(Cache\)中
- 缺失率:\(1 - p\)
- 失效损失 \(T_m\):从主存将一块信息替换到\(Cache\)所需时间,包括访问主存块,向上逐层传输块直至将数据块放入发生缺失的那一层所需时间
- 平均访问时间$ = p\times T_c + (1 - p)\times(T_m + T_c) = T_c + (1-p)\times T_m$
3. \(Cache\)和主存之间的映射
- 映射方式
- 直接映射:把主存的每一块映射到一个固定的\(Cache\)行中。即每个主存地址对应于高速缓存中唯一的地址,也称 模映射
- 映射关系:\(Cache\)行号 \(=\) 主存块号 \(mod\space Cache\) 行数
特点
- 易实现,命中时间短
- 淘汰/替换策略简单
- 不灵活,\(Cache\)存储空间得不到充分利用,命中率低
- 全相联映射:主存块可装到\(Cache\)任一行/槽中
- 映射关系:主存和\(Cache\)两个标记相等,说明要找的地址在对应槽中。比较所有标记都不等,则缺失
特点
- 没有\(Cache\)索引,因为是直接同时比较所有\(Cache\)行的标记
- 块冲突概率低:只要有空闲\(Cache\)块,都不会发生冲突
- 由于需要比较,实现复杂(比较逻辑的硬件代价大)、速度慢
- 组相联映射:将\(Cache\)所有行分组,把主存块映射到\(Cache\)固定组的任一行中。即:组间模映射、组内全映射
- 映射关系:\(Cache\) 组号 \(=\)主存块号 \(mod\space Cache\)组数
- 特点
- 结合直接映射和全相联映射的优点。当\(Cache\)的组数为\(1\)时,则为全相联映射;当每组只有一行时,则为直接映射
每组两个行(2路组相联)较常用。在较大容量的\(L2\) \(Cache\)和\(L3\) \(Cache\)中使用4路以上
- 关联度:主存块映射到\(Cache\)时,可能存放的位置个数
关联度大小
- 关联度最低:直接映射(关联度为1)
- 关联度最高:全相联映射(为\(Cache\)行数)
- 关联度居中:\(N\)路组相联映射(关联度为\(N\))
提高关联度通常能够降低缺失率,会增加命中时间
4. \(Cache\)的一致性问题
- \(Cache\)的一致性问题
- 当\(Cache\)中的内容进行更新时,而没有改变主存中的相应内容时,\(Cache\)和主存之间产生了不一致
- 当多个设备都允许访问主存时;例:\(I/O\)设备可通过\(DMA\)方式直接读写内存时,如果\(Cache\)中的内容被修改,则\(I/O\)设备读出的对应主存单元的内容无效;若\(I/O\)设备修改了主存单元的内容,则对应\(Cache\)行中的内容无效
- 当多个\(CPU\)都有各自私有的\(Cache\)并且共享主存时;例:某个\(CPU\)修改了自身\(Cache\)中的内容,则对应的主存单元和其他\(CPU\)中对应的\(Cache\)行的内容都要变为无效
- 解决方法
- \(Write\space Through\)(写直达、写通过、直写)
- 当一个写操作产生时,新值同时写到\(Cache\)和主存的块中,即 同步更新
- 实际操作:在\(Cache\)和主存之间使用写缓冲(\(Write\space Buffer\))当一个数据等待被写入主存时,先将其存入写缓冲;在把数据写入Cache和写缓冲后,处理器继续执行命令;当写主存操作结束后,写缓冲里的数据释放
- \(Write\space Back\)(写回、一次性写、回写)
- 当一个写操作产生时,新值仅被写到\(Cache\)中,而不被写入主存
- 实际操作:大大降低主存带宽需求,提高系统性能,控制可能很复杂,即 不同步更新每个\(Cache\)行都设置一个修改位 (
dirty bit
脏位) ,如果对应\(Cache\)行中的主存块被修改,就同时置修改位为“1”,如果修改位为“0”,则说明对应主存块没有被修改过只有当修改位为“1”的块从\(Cache\)中替换出去时,才把它写回主存
5. \(Cache\)替换算法
- 什么时候需要进行\(Cache\)替换
- 直接映射:映射唯一,无条件用新信息替换老信息
- \(N\)路组相联:每个主存数据有\(N\)个\(Cache\)行可选择,需考虑替换哪一行
- 全相联:每个主存数据可存放到\(Cache\)任意行中,需考虑替换哪一行
- 常用替换算法
- 先进先出\(FIFO\)算法:总是把最先进入的那一块替换掉
- 最近最少使用\(LRU\)算法:总是把最近最少用的那一块淘汰掉,利用时间局部性
- 最不经常使用\(LFU\)算法:利用计数器
- 每组4行时,计数器设2位。计数值越小,则说明越被常用
- 命中时,被访问行的计数器置0,其他行计数器加1,其余不变
- 未命中且该组未满时,新行计数器置为0,其余全加1
- 未命中且该组已满时,计数值最大的那一行中的主存块被淘汰,新行计数器置为0,其余加1
- 随机替换算法:随机地从候选的槽中选取一个淘汰,与使用情况无关
6. 多级\(Cache\)
- 多级\(Cache\)系统成为主流:在\(Cache\)系统中使用更多的层次结构,以掩盖\(CPU\)访存延迟,提高处理器的执行效率
- 多\(Cache\)系统设计的主要考虑因素
- 单级/多级
- 片内(On-chip)\(Cache\):将\(Cache\)和\(CPU\)作在一个芯片上
- 外部(Off-chip)\(Cache\):不做在\(CPU\)内而是独立设置一个\(Cache\)
- 单级\(Cache\):只用一个片内\(Cache\)
- 多级\(Cache\):同时使用L1 、L2 \(Cache\),有些系统还有L3 \(Cache\)
- L1 \(Cache\)更靠近\(CPU\),其速度比L2快,其容量比L2小
- 两级\(Cache\)系统的缺失损失分析:若L2 \(Cache\)包含所请求信息,则缺失损失为L2 \(Cache\)的访问时间;否则要访问主存,并同时取到L1 \(Cache\)和L2 \(Cache\)(缺失损失更大)
1. 虚拟存储器的基本概念
同时运行更多进程,内存需求增大,解决方法
- 扩展内存
- 容纳更多的进程,充分利用\(CPU\)
- 但是程序(或进程)对存储空间的需求在不断增加,扩展内存有可能无法解决
- 采用交换机制:交换方式和覆盖技术
- 当存储器中没有处于就绪状态的进程(某时刻所有进程都在等待I/O)时,处理器将一些进程调出写回磁盘,然后OS再调入新进程执行,或新作业直接覆盖老作业的存储区
- 分区(\(Partitioning\))和分页(\(Paging\))是交换的两种实现方式
- 缺点:对程序员不透明、空间利用率差
- 虚拟存储器:一种将内外存统一管理的存储管理机制就是虚拟存储管理。类似上述分页方式,不是把所有页面一起调到主存,而是采用 按需调页,在外存和主存之间以固定页面进行调度
分区
简单分区:使用长度不等的固定长分区,当一个进程调入主存时,分配给它一个能容纳的最小分区
- 缺点:固定长度的分区,可能会浪费主存空间。多数情况下,进程对分区大小的需求不可能和提供的分区大小一样
可变长分区:分配的分区大小与进程所需大小一样
- 缺点:开始较好,但到最后存储器中会有许多小空块。时间越长,存储器的碎片会越来越多,存储器的利用率下降
分页
- 基本思想:内存分成固定长且较小的存储块,每个进程也划分成固定长的程序块;程序块(页)可装到内存可用的存储块(页框)中;其中无需用连续页框来存放一个进程,操作系统为每个进程生成一个页表,通过页表实现逻辑地址向物理地址转换
- 逻辑地址:程序中指令所用的地址
- 物理地址:存放指令或者数据的实际内存地址
虚拟存储技术的实质
- 程序员在比实际主存空间大得多的逻辑地址空间编写程序,程序执行时,把当前需要的程序段和相应的数据块调入主存,其他暂不用的部分存放在磁盘上
- 指令执行时,通过硬件将逻辑地址(亦称虚拟地址或虚地址)转化为物理地址(亦称主存地址或实地址)
- 在发生指令或数据访问失效时,由操作系统进行主存和磁盘之间的信息交换
2. 虚拟存储器组织方式
- 页式虚拟存储器
虚存地址空间和主存地址空间按统一大小分成若干页,虚存称为虚页,主存称为实页,程序按页从磁盘调入主存(某一虚页调入某一实页)
页表:反映虚页与实页的映射关系,用来实现虚实地址的转换
- 建立在主存中,操作系统为每道程序建立一个页表
- 设置页表基址寄存器:保存页表在主存中的起始地址
虚拟存储器访问中可能出现的异常情况
- 缺页:页表中没有相应数据,则需要从磁盘中读信息到内存,若内存没有空间,则还要从内存选择一页替换到磁盘上,替换算法类似于\(Cache\),采用回写法,页面淘汰时,根据
dirty
位确定是否要写磁盘 - 保护违例:当存取权限与所指定的具体操作不相符时
- 缺页:页表中没有相应数据,则需要从磁盘中读信息到内存,若内存没有空间,则还要从内存选择一页替换到磁盘上,替换算法类似于\(Cache\),采用回写法,页面淘汰时,根据
快表
- 背景:每次虚拟存储器的访问带来两次存储器访问,一次访问页表,一次访问所需的数据(或指令),简单的虚拟存储器速度太慢,提高访问性能的关键在于依靠页表的访问局部性,解决办法是使用\(Cache\)来存储页表项,称为\(TLB\),它包含了最近使用的那些页表项
- 目的:减少到内存查页表的次数
- 使用:先到\(TLB\)查找
- hit1:到\(Cache\)找
- hit3:查找成功
- miss3:到主存找
- miss1:到页表找
- hit2:到\(Cache\)找
- hit3:查找成功
- miss3:到主存找
- miss2:缺页,则不在主存中,去磁盘等大型存储设备找
TLB | Page Table | Cache | Possibility |
hit | hit | miss | 可能,TLB命中则页表一定命中,但实际上不会查页表 |
miss | hit | hit | 可能,TLB缺失但页表可能命中,信息在主存且在Cache |
miss | hit | miss | 可能,TLB缺失但页表可能命中,信息在主存但可能不在Cache |
miss | miss | miss | 可能,TLB缺失页表可能缺失,信息不在主存一定也不在Cache |
hit | miss | miss | 不可能,页表缺失,信息不在主存,TLB中一定无该页表项 |
hit | miss | hit | 不可能,页表缺失,信息不在主存,TLB中一定无该页表项 |
miss | miss | hit | 不可能,页表缺失,信息不在主存,Cache中一定也无该信息 |
优点:实现简单,开销少。因为只有进程的最后一个零头(内部碎片)不能利用,故浪费很小
缺点:由于页不是逻辑上独立的实体,可能会出现如“一条指令跨页”等情况,使处理、管理、保护和共享都不方便
- 程序员或OS将程序模块或数据模块分配给不同主存段,一个大程序由多个代码段和多个数据段构成,按照程序的逻辑结构划分成多个相对独立的部分。(如过程、子程序、数据表、阵列等);段通常带有段名或基地址,便于编写程序、编译器优化和操作系统调度管理;段可作为独立逻辑单位被其他程序调用,以形成段间连接,产生规模更大的程序;分段系统将主存空间按实际程序中的段来划分,每个段在主存中的位置记录在段表中,并附以“段长”项说明;段表本身也是主存中的一个可再定位段;段本身是程序的逻辑结构所决定的一些独立部分,所以分段对程序员是不透明的(而分页对程序员却是透明的)
- 优点:段的分界与程序的自然分界对应,故段具有逻辑独立性,易于编译、管理、修改和保护,便于多道程序共享;某些类型的段(堆栈、队列)具有动态可变长度,允许自由调度
- 缺点:段长各不相同,起、终点不定,变化很大,给主存分配带来麻烦,且易在段间留下许多空余的零碎空间不好利用,造成浪费(如:长段调出后,调进的短段会造成碎片)
- 基本思想:段式和页式有机结合
- 程序按模块分段,段内再分页,进入主存仍以页为基本单位,逻辑地址由段地址、页地址和页内偏移量三个字段构成,用段表和页表(每段一个)进行两级定位管理,根据段地址到段表中查阅与该段相应的页表指针,再转向页表,然后根据页地址从页表中查到该页在主存中的页框地址,由此访问到页内某数据
3. 存储保护
- 存储保护:为避免主存中多道程序相互干扰,防止某程序出错而破坏其他程序的正确性,或某程序不合法地访问其他程序或数据区,应对每个程序进行存储保护
- 发生存储保护错的情况
- 地址越界(转换得到的物理地址不属于可访问范围):访问重定位、键保护、环保护
- 访问越权(访问操作与所拥有的访问权限不符):页表中设定权限
- 最基本的保护措施:规定每道程序只能访问属于自己所在的存储区和共享区
- 对于属自己存储区的信息:可读可写
- 对共享区或已获授权的其他用户信息:可读不可写
- 对未获授权的信息(如OS内核、页表等):不可访问
- 背景:\(CPU\)工作速度很快,主存速度比较慢(差1~2个数量级),\(CPU\)访问主存时,往往需要等待
- 解决方法
- 提高主存芯片本身的速度
- 在主存和\(CPU\)之间加入\(Cache\)
- 采用并行结构技术
- 多模块存储器(多体交叉)
- 包含多个小存储体/模块,每个体有自己的MAR、MDR和读写电路
- 多个存储模块可独立并行工作
- 能够提高数据访问速度
- 编址方式
- 连续编址(高位交叉访问)
- 实现方法:用主存地址码的高位区分存储体号,低位表示模块内的地址(连续字在一个模块中各,个体并行工作)
- 存储地址连续的数据落在同一存储体内,容易发生访存冲突,并行存取的可能性很小;访存冲突,就是同时有两个或两个以上访存地址指向同一存储体,不能同时进行访存
- 应用场景:用于非共享主存(即每个处理机仅享用统一编址主存的部分连续地址空间)和专用\(Cache\)的多处理机系统中
- 交叉编址(低位交叉访问)
- 实现方法:用主存地址码的低位区分存储体号,高位表示模块内地址(连续字分布在多个体中,各个体轮流编址、并行工作)
- 存储地址在同一存储体中不连续,以存储体个数(如:m)为模交叉编址,连续的程序或数据将交叉存放在m个存储体中,可实现以m为模的交叉并行存取,访存冲突的概率很小
- 应用场景:为充分发挥并行性,多数计算机都采用低位交叉编址方式