1. 存储器概述
- 存储器:计算机中存放指令和数据的主要场所。
- 存储器的容量越大,表明它能存储的信息越多。
- 存储器的访问速度越快,计算机处理信息的速度就越快。
1.1 存储器分类
1.1.1按存储介质分类
- 磁存储器: 以磁性材料作为存储介质。
- 例子:磁芯、磁盘、磁带存储器
- 特点:体积大,存取速度慢,但磁存储器单位容量成本最低。
- 半导体存储器: 以半导体器件组成的存储器。
- 类别细分:
- 双极型存储器:主要包括TTL型和ECL型。
- 金属氧化物半导体存储器:简称MOS存储器,又可分为静态MOS存储器(SRAM)和动态MOS存储器(DRAM)
- 闪存
- 特点:体积小,存储速度快,但单位容量成本相对较高。
- 光存储器: 利用介质的光学特性读出数据。
- 例子:CD-ROM 、DVD-ROM和磁光盘。
- 特点:便于携带,成本低廉,适用于电子出版物的发送。
1.1.2 按存储方式分类
- 随机存储器:可以按照地址随机读写数据存储单元,且存取访问时间与存储单元的位置无关。
- 例子:早期的磁芯存储器和当前大量使用的半导体存储器都是随机存储器。
- 顺序存储器: 存储单元中的内容只能依地址顺序访问,且访问的速度和存储单元的位置有关。
- 例子:磁带存储器。
- 直接存储器: 既有随机存取特性,也有顺序存取特性。先直接选取信息所在区域,然后按顺序方式存取。
- 例子:磁盘存储器。
1.1.3 按信息的可改写性分类
- 读写存储器: 既能读出也能写入信息的存储器。
- 只读存储器(ROM): 只能读出信息,不能写入信息的存储器。
- 例子:光盘存储器、半导体只读存储器、CD-ROM、DVD-ROM
1.1.4 按信息的可保存性分类
- 易失性存储器: 断电后,所保存的信息会丢失的存储器。
- 例子:半导体RAM
- 非易失性存储器: 断电后,所保存的信息不会丢失的存储器。
- 例子:半导体ROM、闪存(常用于固态硬盘和U盘)、磁盘、光盘存储器
1.1.5 按信息是否被破坏分类
- 破坏性读出存储器: 信息读出后,原存储信息被破坏。
- 例子:DRAM
- 非破坏性读出存储器: 信息读出后,原存储信息不被破坏。
- 例子:SRAM、磁盘、光盘。
1.1.6 按功能的存储速度分类
- 寄存器存储器: 主要用来存放地址、数据及运算的中间结果。
- 高速缓冲寄存器: 又称高数缓冲cache,是隐藏在寄存器和主存之间的一个高速小容量存储器,用于存放CPU即将或经常使用的指令和数据。
- 一般采用静态RAM构成。
- 用于缓冲CPU与慢速主存之间的性能差异,提高存储系统的访问速度。
- 主存储器: 简称主存,是CPU除寄存器和cache外唯一能直接访问的存储器,用于存放指令和数据。
- CPU通过主存地址直接、随机地读取主存储器。
- 主存一般由半导体存储器构成,但注意主存并不是单一的内存,还包括BIOS、硬件端口等。
- 外存储器: 计算机主机外部的存储器。
- 外存容量很大,但存取速度相对较低。
- 例子:磁盘、磁带、光盘存储器、磁盘阵列和网络存储系统。
- 外存用来存放当前暂不参与运行的程序和数据,以及一些需要永久性保存的数据信息。
1.2 存储器技术指标
- 存储容量: 存储器可以存储的二进制信息总量称为存储容量。
- 位表示法: 以存储器中的存储单元总数和存储字位数的乘积表示。
- 1K×4位表示有1K个存储单元,每个存储单元有4的bit位。
- 字节表示法: 以存储器中的单元(不是存储单元,存储单元位数不一定是8)总数表示。
- 一个存储单元由8个二进制位组成,称为一个字节,用B表示。
- 128B代表该芯片由128个单元。
- 单位成本: 单位成本 = 总成本/总容量
- 存取速度:
- 存取时间/读写周期:又称存储器的访问时间,是指启动一个存储器操作(读或写分别对应取与存)到该操作完成所经历的时间。
- 读写时间可能不同**,DRAM读慢写快,闪存读快写慢。**🎈
- 存取周期(存储周期): 连续启动两次访问操作之间的最短时间间隔。
- 存储器带宽(数据传输率): 单位时间内存储器所能传输的信息量,常有的单位包括位/秒或字节/秒
- 数据传输率 = 数据位宽/存取周期
1.3 存储系统层次结构
1.4 主存的基本结构
考点:主存由RAM和ROM两者组成
- 半导体元件及原理
- MOS管被接通后,电容的信息可以传输出去。
- 存储器芯片的基本原理
- CS为片选线:主存存在很多存储器芯片,片选线位低电平说明选中了这个存储器。
- MAR稳定后,译码器才会打开工作。
- MDR稳定后,MDR才会给数据总线传输数据。
- 与译码器相连的是字选线,与MDR连接的是数据线(位线)。
- 译码器和驱动器是在一起的。
- 驱动器:加强电信号,使高电平稳定有效。
- 引脚:地址线、数据线、片选线、读/写控制线、供电引脚、接地引脚。
- 地址线位数:根据存储器的存储单元的个数决定。存储单元个数会随着存储字位数的改变而改变。
- 数据线位数:根据存储器的存储单元(也称存储字)的位数决定。
🍊1.5 主存中数据的存放
- 存储字长: 一个存储单元存储的二进制代码的位数。可能与字长不一样。是字节的整数倍。例如:字节,半字,字,双字。
- 数据字长: CPU内部用于整数运算的数据通路的宽度。因此字长等于CPU内部用于整数运算的运算器位数和通用寄存器宽度。是字节的整数倍。
- 存储地址: 按照访问存储单元的大小,主存地址可以分为字节地址、半字地址、字地址。
- 注意点:
- 图中8号字节地址,半字地址为4,字地址为2,这三个地址在逻辑空间的起始位置都是8号字节单元,区别只是存储单元的大小不同。
- PC只有字节地址。所以如果指令字长为4字节,PC每次要加4
- 大端和小端方式:
- 大端方式(常见):将数据的高位字节存储在低地址端。
- 小端方式:将数据的高位字节存储在高地址端。
- 数据的边界对齐:
按边界对齐的存储方式。
优点:访问速度快
按边界不对齐的存储方式。
优点:节省存储空间。
2. 半导体存储器
- 半导体存储器的主要特点是存取速度快、体积小、性能可靠,已成为实现主存的首选器件。
2.1 静态MOS存储器(SRAM)
- 静态MOS存储器:存储体以静态MOS存储元为基本单元组成的存储器。
2.1.1 静态MOS存储单元
- 存储单元是存储器中的最小存储单位,也称为存储元。
- 作用:存储一位二进制信息。
- 电路要求:
- 具有两种稳定状态。
- 两种稳定状态经外部信号控制可以相互转换。
- 经控制后能读出其中的信息。
- 无外部原因,其中的信息能长期保存。
- 6管MOS存储单元(双稳态触发器)
D为数据输出输入口
- 读出数据,触发器状态保存稳定,是非破坏性读出,无需重写。读写速度更快。
- 只要不断电,触发器的状态就不会改变。
2.1.2 SRAM缺陷
- MOS管过多,存储密度低。(一个存储单元有6个MOS管)
- 功耗太大,单位容量成本高。
2.1.3 存储单元扩展
2.1.4 1️⃣存储矩阵
2.1.5 静态MOS存储器的结构
- 驱动器:
- 一条选择线带很多存储位时负载过大,需要使信号稳定。
- 在地址译码器输出端增加驱动电路。
- 保证每一个存储位都能正常工作。
- I/O电路:
- 存储体与数据总线之间的电路。
- 读出时具有放大信号的作用。
2.1.6 静态MOS存储器芯片实例
2.2 动态MOS存储器(DRAM)
- 动态MOS存储器:存储体以动态MOS存储元为基本单元组成的存储器。
- 在静态MOS存储单元的基础上,去掉MOS管中的功耗管,通过引入存储电容暂存电荷的方式来保存数据。
2.2.1 单管动态MOS存储单元
- 单管动态MOS存储单元:仅仅使用一个MOS管和一个电容构成存储单元。
- 电容放电信息被破坏,是破坏性读出,读出后应有重写操作,也称”再生“。
- 读出1:MOS管接通,电容放电,数据线上产生电流。
- 读出0:MOS管接通后,数据线上无电流。
- 每个存储元制造成本更低,集成度高(相同大小的地方,可以当下更多单管动态MOS存储单元),功耗低。
- 电容内的电荷只能维持2ms,即便不断电,2ms后信息也会消失,所以2ms之内必须刷新一次(给电容充电)。
2.2.2 1️⃣DRAM的刷新
- 最大刷新周期:信息存储到数据丢失之前的这段时间。常见为2ms
- 刷新周期: 存储器实际完成两次完整刷新之间的时间间隔。
- 动态存储器的刷新按行进行,为减少刷新周期,可以减少行数,增加列数。
- 选用行列地址,减少选通线的数量。
- 刷新时,内存不会相应CPU的访问。
- 读操作自带刷新功能,但读操作需要同时给出行地址和列地址。刷新只需要行地址。
- 刷新方式:
- 集中刷新:2ms内集中安排时间全部刷新。
- 缺点:存在较长时间的”死区“。
- 分散刷新:每次读写完都刷新一行。
- 缺点:刷新过于频繁,严重影响了系统的速度,不适合高速存储器。
- 异步刷新:2ms内每行刷新一次即可。效率最高。是集中刷新和分散刷新的结合。根据刷新周期和行数求出每行刷新信号产生的间隔,在这个时间段的最后阶段进行刷新操作。
- 集中刷新:2ms内集中安排时间全部刷新。
2.2.3 1️⃣DRAM的地址复用技术
2.2.4 动态MOS存储芯片实例
2.3 SRAM和DRAM比较
2.4 只读存储器(ROM)
- 只读存储器:信息只能读出,不能随意写入的存储器。
- 特点:通过一定的方式将信息写入之后,信息就固定在其中,且具有非易失性,即使电源断电,保存的信息也不会丢失。
- 主要存放一些不需要修改的程序,如微程序、子程序、某些系统软件和应用软件。
、
EPROM可以采用随机存取方式,CDROM不采用随机存取方式。
-
逻辑上,内存由RAM+ROM组成,且两者统一编码。这里的ROM其实就是BIOS芯片(基本输入输出系统)
-
主存既包括内存,也包括BIOS等。
-
3. 🍊存储器的位/字拓展
3.1 主存和CPU的连接线路
- 地址线的连接:A17-0
- 数据线的连接:D31 ~ D0
- 控制线的连接:MREQ# 和 R/W#
3.2. 字长拓展(数据线拓展)
3.3. 字数拓展(地址线拓展)
3.4. 字位同时拓展
5. 并行主存系统
- 如何提高存储器的访问速度来缓解CPU与主存速度不匹配的问题?
- 选择高速元件cache。
- 通过存储器的并行工作。
5.1 双端口存储器
- 定义:同一个存储器具有两组相互独立的端口,每个端口均有各自独立的数据端口、地址端口、读写控制端口、片选端口等,每个端口可独立的完成读写操作。
- 结构示意图:
- 并行读写:访问地址不一样,速度加强了一倍。
- 冲突处理:同时访问两个端口,会有冲突。用BUSY的信号决定先处理哪个端口的读写请求。
5.2 单体多字存储器
- 定义:单体多字存储器的构造与存储器的位拓展方式完全一样。该方式中多个存储器共享地址总线,按同一地址并行访问不同存储器中的同一单元,从而实现在同一个存储周期内访问多个存储字,如果m的存储模块并发工作,则主存带宽可提升m倍。
- 多个存储器中的编码方式是一样的,用来和多体交叉存储器进行区分。
- 计算机中的应用:**多通道内存。**有两种,一种是联动模式,一种的非联动模式,但都实现了一个存储周期内访问多个存储器。
- 考点:3通道存储器总线就是指多通道内存,存储器总线 = 总线 × 3
- 联动模式示意图:
- 非联动模式示意图:
5.3 多体交叉存储器
- 定义:对多个存储器进行操作,在对一个存储器进行完存取操作后,不需要等待它的回复时间,而是可以直接访问其他的存储器。
多模块顺序存储器
- 高位多体交叉:高位地址译码产生片选信号,选择不同的存储器;低位地址选择存储器中的不同存储单元。
- 多模块串行
- 目的:扩充容量,性能无提升,方便故障隔离。
多模块交叉存储器
- 低位多体交叉:低位地址译码产生片选信号,选择不同的存储器;高位地址选择存储器中的不同存储单元。
- 多模块流水并行
- 目的:扩充容量,提升性能,一个存储周期可以取出多条指令或者数据,可大大提高机器的运行速度和存储带宽。
- 考点:一般题目说多体交叉编址存储器是,就是指低位多体交叉。
- 访问冲突:如果是4体交叉编址存储器,相邻的4次访存操作出现相同的存储模板时发生冲突。
- 存储模板序号 = 访存地址 / 存储模板数目
- 多模块交叉存储器的计算题:
6. 🍊高速缓冲存储器
6.1. cache工作原理
- 在CPU和主存之间加一个隐藏的小容量的快速的SRAM,称为cache
- 对程序员透明
- 将主存中经常被访问的指令和数据放到cache中,从而提高系统的性能。
6.2. 依据:程序局部性
- 时间局部性:当程序访问一个存储位置后,该位置在未来可能会被多次访问。
- 空间局部性:当程序访问一个存储位置后,该位置附件的存储单元也即将被访问。
- 优化手段:
- 时间局部性:调度算法
- 空间局部性:预读优化
6.3. cache的基本概念
- 命中(hit):CPU访问数据在cache中。
- 缺失(miss):CPU访问数据不在cache中。
- 块(block):cache与主存交换的最小单元。
- 行/槽(Line/Slot):标记、标志位、数据块容器
- 有效位、查找标记、脏标志位,置换标志,数据块副本
- Cold Cache 、 Warm Cache:近期是否被频繁访问
- 命中率(hit rate):主存访问中cache命中比例
- 缺失率(miss rate):1 - 命中率
- 命中访问时间(hit time):数据查找时间+ cache访问时间+总线传输时间
- 缺失损失(miss penalty):主存块调入cache。数据传输到处理器的时间。远大于命中时间,所以一些相对较小的时间和忽略。
6.4. cache读写流程与关键技术
6.4.1 cache读写流程
- cache读流程
- CPU给出主存地址(块地址、块内地址)
- 主存块地址为关键字进行查找
- 如相符则表示副本在cache中,命中,直接访问cache
- 否则数据缺失,访问主存
- 将数据所在块的副本调入cache(块交换–局部性)。
- 载入副本过程可能以前替换。
- 更新查找表,记录当前数据块地址。
- cache缺失时系统等待数据调入。
- cache写流程
- CPU给出主存地址
- 主存块地址为关键字进行查找
- 相符则表示命中,数据副本在cache中
- 缺失根据写分配策略决定是否将主存地址对应数据调入cache中
- 写入数据到cache
- 根据写策略决定是否写入主存
- 关键技术
- 数据查找:如何判断数据在cache中?
- 地址映射:主存地址如何放置到cache行/槽中?
- 替换策略:cache写满后如何处理呢?
- 写入策略:如何保证cache与memory的一致性呢?
6.4.2. 数据查找方法
- **相联存储器(Content Addressable Memory,CAM):**按内容进行访问的存储器,用于存放查找表,其内部存储的基本数据单元是键值对(key,value)。
- CAM的输入不是地址,而是检索关键字key,输出则是该关键字对应的值。
- 存储容量 = 查找表容量 = 表项数* 表项大小 = 2位数 ×(valid + 主存块地址 + cache块地址)
- 查找表包括块表、段表和页表。块表存储在cache中,段表和页表存储在内存中。
6.4.3 地址映射
- 全相联映射: 主存块可放置在任意cache行
- 结构图:
- 逻辑实现:
- 查找表和缓存副本一体(CPU片内缓存)
- 存放cache行
- 有效位、主存块地址、数据块副本、标志位(Dirty bit)、置换标记
- 相联存储器存储容量 = cache行大小 * 行数
- 查找表和缓存副本分离(片内查找表、片外缓存)
- 存放查看信息
- 有效位、主存块地址、cache块地址、标志位(Dirty bit)、置换标记
- 相联存储器存储容量 = 查找表表项大小 * 行数
- 查找表和缓存副本一体(CPU片内缓存)
- 特点:
- 块映射灵活,一对多映射。
- cache装满后才会出现块冲突
- 块冲突概率低,cache利用率高
- 淘汰算法复杂
- 命中率高
- 直接相联映射: 各主存块只能映射到cache中的固定块。
- cache块号计算方法:cache块号 = 主存块号 mod cache块数目
- 结构图:
- 区地址:在内存中的分区
- 区地址总数 = 主存块总数 / cache块总数
- 行索引位数取决于cache块总数
- 区内行索引:就是数据块映射到cache中的行号,和计算中的余数完全相同。
- cache容量:n × (1 + s - r + 8 × 2w)位
- 逻辑实现图
- 特点:
- 映射速度块,一对一映射,无需查表
- 利用索引字段直接对比相应标志位即可
- 查找表可以和副本一起存放,无需相联存储器
- 容易冲突,cache利用率低
- 替换算法简单
- 命中率低,适合大容量cache
- 映射速度块,一对一映射,无需查表
- 组相联映射: 各存储块只能映射带cache固定组中的任意块
- 结构图:
- 主存块号、区号、cache块号、组号都是从0开始的。
- 主存块号 = 主存地址 / 主存块大小
- 标记tag就是在主存中的区号 = 主存块号/ 每个区的数据块个数
- 每个区的数据块个数或cache组数 = cache块总数 / 每组块个数
- cache组号 = 内存块号 mod cache组数
- 逻辑实现:
- 特点:
- 与全相联映射相比,多路比较器数目大幅减少,且为各cacha组共享,硬件成本更低。
- 当组里只有一行时,就是直接相联映射。
- 当只有一组时,就是全相联映射。
- 不同映射方式比较
- 直接相联映射查找任意,淘汰简单,但命中率较低。
- 全相联映射查找时并发比较的硬件成本最高,淘汰算法复杂,但命中率最佳。
- 组相联映射是前两者的折中。
6.4.4 替换算法
- 替换算法也称淘汰算法,如果cache中已装满数据,当新的数据要载入时,必须从cache中选择一个数据块替换,替换数据块如果存在脏数据,还需要将淘汰数据同步到主存中。
- **先进先出(First In First Out,FIFO)算法:**按照数据块进入cache的先后决定替换的顺序,即在需要进行替换时,选择最先被载入ceche的行进行替换。
- 特点:
- 实现简单,最开始按照#0#1#2#3放入cache中,之后轮流替换#0#1#2#3。
- 没有考虑局部性原理,最小被调入cache的块也有可能是被频繁访问的。
- 随机算法(RAND,Random): 若cache已满,则随机选择一块替换。
- 特点:
- 实现简单。
- 没有完全考虑局部性原理,命中率低,实际效果很不稳定。
- 近期最少使用算法(Least Recently Used,LRU): 为每一个cache块设计一个”计数器“,用于记录每个cache块已经有多久没被访问了,当cache慢后,替换”计数器“最大的。
- 特点:
- 基于局部性原理,近期被访问过的主存块,在不久的将来也很有可能被再次访问,因此淘汰最久没被访问过的块是合理的。
- LRU算法的实际效果优秀,cache命中率高。
- 若被频繁访问的主存块数量>cache行的数量,则有可能发生抖动,如{1、2、3、4、5、1、2、3、4、5、1、2、……}
- 最不经常使用算法(Least Frequently Used,LFU): 为每一个cache块设计一个”计数器“,用于记录每个cache块被访问过几次。当cache满后替换”计数器“最小的。
- 特点:
- 曾经被经常访问的主存块在未来不一定会用到。
- 没有很好的遵循局部性原理,因此实际效果不如LRU。
6.4.5 写入策略
CPU在执行程序期间会对Cache进行大量的读操作外,也会对cache进行写操作。
- 写回法:
- 定义:当CPU对cache写命中时,只修改cache中的内容,而不立即写回主存,只有当此块被换出时才写回主存。
- 要求:需要给每个cache行配置一个修改位,也成为脏位(Dirty Bit)。若被修改过,脏位为1,没有被修改,脏位为0。
- 当某行被换出时,根据此行的脏位是1还是0,决定是将此行写回主存还是直接丢弃。
- 优点:减少了访问主存的次数,加快了运行程序的速度。
- 缺点:cache中的数据和主存中的数据不一致问题,可能会导致DMA操作获得的数据不是最新的数据。
- 写分配法:
- 定义:当CPU对cache写不命中时,将主存中的块调入cache中,在cache中修改。通常搭配写回法使用。
- 写穿法:
- 定义:当CPU对cache写命中时,同时对cache和主存中的同一数据块进行修改。
- 优点:
- 无需设置脏位和相应的判断逻辑。
- 当发生块替换的时候,被换出的数据块可以直接丢弃,无需写回主存。
- 在单CPU环境下,更能保持数据的一致性。
- 缺点:
- 访存次数增加,速度变慢。
- 多处理器系统中各CPU都有自己的cache,当一个主存块在多个cache中都有副本时,即使某个CPU以写穿法来修改它所访问的cache和主存内容,也无法保证其他cache中的副本内容同步更新。
- 非写分配法:
- 定义:当CPU对cache写不命中时,数据只写入主存,不调入cache中,搭配写穿法使用。
6.5. cache的应用
5.5.1 分离cache
- 将指令cache和数据cache分开设计,这就有了分离或独立cache结构。
- 优点:减少指令流水线资源冲突。
6.5.2 多级cache
6.5.3 软件cache
7. 🍊虚拟存储器
7.1. 虚拟存储器的工作原理
- 为什么需要虚拟存储器呢?
- 采用cache技术可以大大提高主存的访问速度,然而它并不能解决主存容量不足的问题。
- 程序员总希望有一个大于主存空间的编程空间,这些编写程序时就不受实际主存大小的限制。
- 多任务操作系统出现之后,在计算机系统中同时有多个用户程序的进程运行,每个进程都需要自己的独立地址空间。
- 让更多的程序(容量可能大于主存容量)在有限的主存空间中高效并发运行且互不干扰是虚拟存储器需要解决的问题。
- 虚拟存储器是什么呢?
- 目前,几乎所有的计算机都采用了虚拟存储系统。
- 在存储系统的层次结构中,虚拟存储器处于”主存—辅存“存储层次,通过在主存和辅存之间增加部分软件(如操作系统)和必要的硬件(如地址映射与转换机构,缺页中断结构等),使辅存和主存构成一个有机的整体,就像一个单一的、可供CPU直接访问的大容量主存一样。
- 虚拟空间是靠辅存(磁盘)和内存支撑的。
- 每一个进程都有属于自己的一个虚拟空间和对应的页表。
- 程序员可以用虚拟存储器提供的地址(虚拟地址)进行编程,这样,在实际主存空间大小没有增加的情况下,程序员编程不再受实际主存空间大小的限制。
- 虚拟存储器的工作原理是什么?
- 虚拟存储器充分利用了程序的局部性,采用按需加载的方式加载程序代码和数据。
- 每一个进程都有一个属于自己的页表。
- 其基本思路是加载程序时并不直接将程序和代码载入主存,而仅仅在相应的虚拟地址转换表(段表、页表,在主存中)中登记虚拟地址对应的磁盘地址。程序执行并访问该虚拟地址对应的程序或数据时,会尝试缺页异常,操作系统会调用异常处理程序并载入实际的程序和代码。根据程序局部性原理,通常程序只需要加载很小一部分空间即可运行,这种方式避免了将程序全部载入主存,大大提高了主存的利用率。
- 虚拟存储器也采用了和cache类似的技术,尽量将辅存中经常访问的程序和数据副本调度到上层的主存储器中,使得大部分数据都可以直接访问主存得到,大大提高了访问的速度。
- 主存满后,此时虚拟存储器需要选择最不经常访问的程序或数据进行淘汰,才能载入新的数据,
- 淘汰不可修改的静态代码和数据:由于原数据来自辅助存储器,因此只需简单丢弃即可。
- 对于主存中动态修改过的数据:需要将这部分数据保存到辅助存储器上特殊的位置,并保存磁盘地址以便后续访问。
7.2. 页表虚拟存储器的基础知识
前言:虚拟存储器分为三种,页式,段式和段页式虚拟存储器。这章只讲页式虚拟存储器。
- 页式虚拟存储器: 以页(Page)为逻辑结构划分信息传送单元(也就是程序)的虚拟存储器。
- 在页式虚拟存储器中,虚拟空间、主存空间和程序在辅存里面的辅存空间均被划分成固定大小的页。
- 不同计算机对页大小的划分不同,常见的页大小为4KB。
- 虚拟存储器中有三种地址空间:
- 虚拟地址空间/虚拟空间/虚地址空间:程序员用来编写程序的地址空间。对应虚拟地址/虚地址。
- 虚拟地址空间的大小和程序在辅存空间的大小不一致。每个计算机的虚拟空间大小都是固定了的。
- 主存的地址空间/物理地址空间/实地址空间/主存空间:对应主存物理地址/实地址。
- 辅助地址空间/磁盘存储器的地址空间/辅存空间:对应磁盘存储器地址/磁盘地址/辅存地址。
- 虚拟地址(Virtual Address,VA)和物理地址(Physical Address ,PA)的划分:
- 虚拟地址(VA) = 虚拟页号(Virtual Page Number,VPN) + 虚拟页偏移(Virtual Page Offset,VPO)
- 物理地址(PA) = 物理页号(Physical Page Number,PPN) + 物理页偏移(Physical Page Offset,PPO)
- PA默认为内容的物理地址,PTBR也是物理地址,是页表的起始地址。
- 存储管理控制部件(Memory Management Unit,MMU):
- 接受CPU发出的虚拟地址(VA),并将其划分为虚拟页号(VPN)和虚拟页偏移(VPO);
- 将虚拟页号(VPN)发送给块表(TLB),并接受返回的页表项(PTE);
- 将虚拟页号(VPN)与页表基址寄存器PTBR相加,得到页表项地址(Page Table Entry Address,PTEA),将页表项地址(PTEA)发送给内存,并接受返回的页表项(PTE);
- 将得到的页表项拆分,判断有效位是否为0,如果为0,发起缺页异常,如果为1,将物理页号与虚拟页偏移结合,形成物理地址(PA),发送给内存,内存里面的数据将传送到处理器中。
- 地址映射:
- cache中的地址映射: 把主存地址映射到cache地址。将主存中的数据按照某种规则调入cache中。
- 虚拟存储器的地址映射: 把虚拟地址映射到主存物理地址或者磁盘地址。将用户利用的虚拟地址访问的内容按照某种规则访问主存物理地址,如果没在主存中,就会发生缺页异常,从而访问辅存,将磁盘地址对应的页读取到主存中。
- 地址转换:
- 在程序被装入主存后,在实际运行时,把虚拟地址转换成实地址或磁盘地址,以便CPU可以从主存或磁盘中读取相应的信息。
- 在虚拟存储系统中程序运行时,CPU以虚拟地址访问主存,使用MMU找出虚拟地址和物理地址之间的对应关系,并判断这个虚拟地址对应的内容是否已经在主存中。
-
- MMU和cache其实都在CPU中,这里分开画好理解。CPU不仅包含运算器和控制器,还包括很多其他部件。
- 页表:
- 是一张保存虚拟页号VPN和物理页号PPN对应关系的查找表。保存在内存中。
- 是一个由若干页表项(Page Table Entry,PTE)组成的数组。
- VPN是索引,并不属于页表项,它用于在页表中查找页表项(PTE)。数组理解:Array[VPN] = PTE
- PTEA是页表项地址,用于在内存中直接访问页表项。
- 页表项主要包括有效位和物理页号PPN/磁盘地址,还可能包括修改位。权限位等。
- 当有效位是1时,后面跟着的是物理页号PPN,用来和虚拟页偏移VPO组成物理地址,访问内存。
- 当有效位是0时,后面跟着的时磁盘地址,用来访问辅存,将某一页内容加载到内存中并更新页表项。
- 页表大小 = 表项数 * 表项大小
- 表项数 = 最大索引数 = 虚拟页号最大数 = 虚拟空间/页大小
- 页表项地址 = 页表地址PTBR + 页表号VPN * 页表项字节大小
- 快表/转换旁路缓冲器(TLB)
- 用于缓冲经常访问的页表项PTE。根据虚拟页号来查找页表项。
- 每个条目都存储了一个最近使用过的虚拟页号到物理页号的映射,是包含虚拟页号的。这里注意和慢表的页表项做区分,慢表页表项不包含页表项。
- TLB本质上是一个容量较小的cache,为提高查找速度,大多采用全相联或组相联方式,且采用随机替换算法。
数组理解:Array[ TLBI ] = {标记1,标记2,标记3} 根据TLBT标记决定选哪个。
7.3. 页表虚拟存储器各种流程图
- 基于页表的虚拟地址与物理地址转换过程:
- 页式存储器的访问流程(页面命中):
1. 处理器生成一个虚拟地址,并把它传送给MMU。
2. MMU利用页表基址寄存器PTBR和虚拟页号生成页表项地址PTEA,访问存放在cache/主存中的页表,请求与虚拟页号对应的页表项PTE。
3. cache/主存向MMU返回页表项PTE,以构成所访问信息的物理地址PA。
4. 若返回PTE中有效位为1,则MMU利用返回的PTE构造物理地址PA,并利用构造出的物理地址PA访问cache/主存。
5. cache/主存返回所请求的数据给处理器。
- 页式存储器的访问流程(页面缺失):
1. 处理器生成一个虚拟地址,并把它传送给MMU。
2. MMU利用页表基址寄存器PTBR和虚页号VPN生成页表项地址PTEA,访问存放在cache/主存中的页表,请求与虚拟页号对应的页表项PTE。
3. cache/主存向MMU返回页表项PTE,以构成所访问信息的物理地址。
4. MMU接受到PTE,将它的有效位分离处理,若PTE的有效位为0,说明所访问的页表不在主存中,MMU触发一次缺页异常,调用操作系统内核中的缺页异常处理程序来解决异常。
5. 如果主存页满,则需要根据最不经常访问算法换出页。如果换出页的修改位为1,则把该页面换出到磁盘,否则直接丢弃。
6. 缺页处理程序从磁盘中调入新的页,并更新存储器中的页表项PTE。
7. 缺页处理程序返回到原来的进程,驱使引起缺页的指令重新启动,本次执行将不再缺页。
- 结合cache的页式虚拟存储器访问流程:
- 其实每次访问内存的过程,我们都需要先访问cache,看一看cache中有没有页表项和虚拟地址所对应的数据,如果cache命中的话,直接返回给MMU和处理器,如果cache没有命中,就需要访问主存,并且将主存所在的块调入到cache中,并修改cache的查找表。
- 基于TLB的虚拟地址到物理地址的转换:
- TLB命中访问流程
1. 处理器生成虚拟地址,并把它传送给MMU。
2. MMU利用虚拟页号查询TLB。
3. 如果TLB命中,返回给MMU对应的页表项PTE。
4. 分离出PTE的有效位,如果有效位为1,则用PPN和VPO构建物理地址PA,并利用PA访问cache/主存。
5. cache/主存返回CPU请求的数据给处理器。
- TLB缺失访问流程:
1. 处理器生成一个虚拟地址,并把它传送给MMU。
2. MMU利用虚页号VPN查询页表项PTE。
3. 如果TLB访问不命中,则向MMU返回TLB访问缺失信息。
4. MMU利用页表基址寄存器PTBR和虚拟页号VPN生成页表项地址PTEA,访问存放在cache/主存中的页表,请求与虚拟页号对应的页表项。
5. cache/主存向MMU返回页表项PTE。
6. MMU分离出PTE中的有效位,如果为1,就用PPN与VPO构成物理地址PA,并且访问cache/主存。
7. cache/主存返回所请求的数据给处理器。
- 虚拟访问操作流程:
现代计算机系统大多采用虚拟存储器技术,但由于虚拟存储器需要硬件和操作系统系统工作。在操作系统引导完成之前,CPU只能用物理地址访问主存(称为实地址模式或实模式),引导完成后进入保护模式(虚地址模式),此时CPU只能使用虚拟地址访问主存。在一个具有cache、虚拟存储器的系统中,CPU一次完整的访问流程如下: