文章目录
存储器概述
存储器分类
根据作用层次
- 寄存器:锁存器或触发器
- Cache:SRAM
- 主存:DRAM
- 辅存
根据存储介质
-
磁芯存储器
-
磁表面存储器:磁盘、磁带
-
半导体存储器:寄存器,Cache,主存
-
光存储器:光盘
根据存取方式
-
随机存取 RAM
-
DRAM
-
SRAM
-
-
只读存储 ROM
- 广义上的只读存储器已可通过电擦除等方式进行写入
-
串行存取(访问)
-
SAM(顺序存取):磁带
-
DAM(直接存取):磁盘
-
-
按内容检索
- 相联存储器 CAM(TLB 快表就是用相联存储器实现的)
根据信息可保存性
-
断电后信息是否消失
-
易失性:RAM
-
非易失性:ROM
-
-
读出时是否破坏信息
-
破坏性读出:DRAM
DARM刷新不是易失性,而是因为破坏性读出
-
非破坏性读出:SRAM
-
存储器性能指标
存储容量
存储字数 × 字长,如 1M × 8位
单位成本
每位价格=总成本/总容量
存储速度
存储周期,指存储器连续两次独立访问存储器操作(读或写操作)之间所需的最小时间间隔,通常存储周期大于存取时间(因为存储周期还需要恢复时间)
存储器的层次结构
多级存储器结构
在存储层次中越往上,存储介质的访问速度越快,价格也越高,相对存储容量也越小,寄存器、高速缓存、主存储器和磁盘缓存均属于操作系统存储管理的管辖范畴,具有掉电易失性。固定磁盘和可移动存储介质属于设备管理的管辖范畴,掉电不易失。
CPU寄存器和主存又被称为可执行存储器,可以被CPU直接访问;对辅存的访问则涉及到中断、设备驱动程序以及物理设备的运行,所需耗费的时间远远高于对可执行存储器访问的时间
三层存储系统层次结构
Cache与主存
解决CPU和主存速度不匹配的问题,速度接近于 Cache,容量和位价却接近于主存,CPU与Cache、主存与Cache之间的数据调动是由硬件自动完成的,对所有程序员均是透明的
主存与辅存
解决存储系统的容量问题,速度接近于主存,容量和位价却接近于辅存,主存和辅存之间的数据调动则是由硬件和操作系统共同完成的,对应用程序员是透明的
在“ Cache-主存”和“主存-辅存”层次中,上一层中的内容都只是下一层中内容的副本,也即 Cache(或主存)中的内容只是主存(或辅存)中内容的一部分
半导体存储器
随机存储器 RAM
SRAM
BRAM的存取速度快,但集成度低,功耗较大,所以一般用来组成高速缓冲存储器
SRAM 工作原理
- 触发器原理
- 需要4~6个晶体管
- 存取速度快,但集成度低,功耗较大
- 工作原理
DRAM
相对于SRAM来说,DRAM具有容易集成、位价低、容量大和功耗低等优点,但DRAM的
存取速度比SRAM的慢,一般用来组成大容量主存系统。
DRAM 工作原理
- 电容充放电原理
- 只使用一个晶体管
- 容易集成、位价低、容量大和功耗低
- 采用地址复用技术,地址线是原来的1/2,(地址信号分行、列两次传送),片选信号需要两根(行选通和列选通)
DRAM 刷新方式
由于DRAM的破坏性读出特性,所以DRAM每隔一段时间必须刷新,通常取 2ms
-
集中刷新
- 2ms中集中安排时间全部刷新
- 读写操作时不受刷新工作的影响,系统的存取速度较高
- 存在“死时间”
-
分散刷新
- 每次读写完刷新一行
- 没有“死时间”
- 增加了系统的存取周期,降低了整机的速度
-
异步刷新
- 2ms内每行刷新一次即可,每隔一段时间(2ms/行数),刷新一行
-
透明刷新
- 将刷新安排在不需要访问存储器的译码阶段,则既不会加长存取周期,又不会产生“死时间”,这是分散刷新方式的发展
注意
- 刷新对CPU和程序员来说是透明的
- 刷新的单位是行,只需要给出行地址即可
- 刷新放大器是集成在DRAM上的,只需要把信息读出,交给刷新放大器就行了
只读存储器 ROM
-
掩模式只读存储器 MROM
厂商按用户要求直接写入,不可更改
-
一次可编程只读存储器 PROM
- 用户利用专门的设备一次写入,不可改变
-
可擦除可编程只读存储器 EPROM
-
根据改写方法可分为
- 紫外线擦除 UVEPROM
- 电擦除 EEPROM
-
-
闪速存储器 Flash Memory
- 基于EPROM与EEPROM的基础上发展起来的
主存储器
主存与CPU的连接
存储器芯片的片选
-
线选法:一个芯片对应一根线,有多少个芯片,就需要多少根线
-
译码器片选:n个芯片,需要 $\lceil \log_2n \rceil $ 根线
地址线的连接
-
CPU地址线与存储芯片地址线
-
高位用于扩展
- CPU的地址线很可能是用不完的,用于扩展
- 一般 A 0 A_0 A0 是最低位,也有特别指出 A 0 A_0 A0 为高位的情况
-
低位与芯片相连
- (此部分低位中的)高位用于片选
- 低位用于片内地址
数据线的连接
- 相等时直连
- 不相等时必须对存储芯片进行位扩展
读/写命令线的连接
- CPU读写命令线与存储芯片读写控制端
- 如果芯片只有一个读写控制端,通常高电平为读,低电平为写
片选信号线的连接
- CPU访存控制信号 MREQ 与 存储芯片片选控制端 CS
合理选择存储芯片
提高主存容量的措施
-
位扩展法
-
字扩展法
-
字、位扩展
提高访存速度的措施
CPU的速度比存储器的快,若同时从存储器中取出n条指令,就可充分利用CPU资源,提高运行速度
双端口RAM
- 左右端口地址码相同时会发生冲突
- 采用Busy信号
多模块存储器
单体多字存储器
每个存储单元存储m个字,总线宽度也为m个字,一次就可以读出m个字(多条指令)。
-
局部性原理
-
如果程序中频繁的转移指令,则效果不好
-
只有一个存储体,本质上就是按多字编址
多体并行存储器
-
高位交叉(顺序存储)编址
-
高位地址为体号,低位地址为体内地址
-
访问连续主存块时,不能被并行访问
- 不满足局部性原理
-
连续的程序/数据存放在同一模块内,因此这种存储器仍是顺序存储器
-
-
低位交叉(交叉存储)编址
-
低位地址为体号,高位地址为体内地址
-
流水线方式存取
- 交叉模块数要大于等于 存储周期/总线传输周期
-
连续的程序/数据存放在相邻模块中,因此称这种存储器为交叉存储器
-
Cache
主存与 Cache之间的信息调度功能全部由硬件自动完成,对任何层次的程序员都是透明的
Cache和主存被划分为相等的块,Cache块又叫做Cache行,即内存块 = 物理块 = Cache块 = Cache行
- 每个Cache行对应一个标记项(有效位,标记位,脏位,替换算法控制位)
Cache 行大小的选择
-
行长太大
-
可以充分利用程序的空间局部性,可能增加命中机会
“可能”是因为比如 程序的某一段只局限于2KB的范围,但是一行有5KB,那么显然增大行长也并不能增加命中率
-
行长大,调入代价大
-
Cache项变少,命中率可能降低
-
-
行长太短
- 无法利用程序的空间局部性
- Cache项变多,命中次数会增加,但总体命中率是下降的
Cache行和内存块的映射方式
直接映射
主存中的每一块只能装入 Cache中的唯一位置,发生冲突则无条件替换,也就没有替换算法控制位
i i i 是主存的块号, j j j 是 Cache的行号, 2 c 2^c 2c 是Cache中的总行数,则映射关系为 j = i m o d 2 c j=i\mod 2^c j=imod2c
优缺点
- 实现简单
- 冲突概率高,空间利用率低(命中率低)
全相联映射
主存中的每一块可以装入 Cache中的任何位置
优缺点
-
冲突概率低
-
空间利用率高(命中率高)
-
需要完整的主存块号作为标记(比较速度慢,可以采用相联存储器做地址映射,但是实现成本高)
组相联映射
将 Cache空间分成大小相同的组,主存的一个数据块可以装入一组中的任何一个位置,组间直接映射,组内全相联映射,两者的综合
如果每组有 n个 Cache行,称为 n 路组相联
- 路数越大,即每组 Cache 行的数量越大,发生块冲突的概率越低,但相联比较电路也越复杂。
选定适当的数量,可使组相联映射的成本接近直接映射,而性能上仍接近全相联映射。
i i i 是主存的块号, j j j 是 Cache的组号, Q Q Q 是 Cache的组数,则映射关系为 j = i m o d Q j=i\mod Q j=imodQ
Cache写策略
一点问题
易混淆的一些概念
存取时间与存储周期
- 存取时间指从启动一次存储器操作到完成该操作所经历的时间分为读出时间和写入时间
- 存储周期指存储器连续两次独立访问存储器操作(读或写操作)之间所需的最小时间间隔
- 通常存储周期大于存取时间
主存带宽
- 又称数据传输率,表示每秒从主存进出信息的最大数量
一些数据单位
-
内存块
- 等于物理块、Cache行
- 一般用于主存-cache层次
-
磁盘块
- 簇
- 一般用于OS管理磁盘
-
页面
- 页框,页帧
- 一般用于虚拟存储系统
不同存储器层次的数据交换单位
- CPU与Cache之间的数据交换以字为单位
- Cache与主存之间的数据交换以Cache行(物理块)为单位
- 在虚拟存储器中,主存与辅存交换单位是页面
- 主存与外存(假设是磁盘)数据交换单位是磁盘块(扇区,若OS进行了分簇则为簇)
Cache做在CPU芯片内的好处?
- 可提高外部总线的利用率。因为Cache在CPU芯片内,CPU访问Cache时不必占用外部总线。
- Cache不占用外部总线就意味着外部总线可更多地支持I/O设备与主存的信息传输,增强了系统的整体效率。
- 可提高存取速度。因为Cache与CPU之间的数据通路大大缩短,故存取速度得以提高。
一点探究
指令Cache与数据Cache
通用的RISC处理器中,指令存储器和数据存储器是分开的,对于取指阶段,指令从指令cache中取出,计算结果存到数据cache中;
Data Cache是用来存放计算结果的,计算结果原来是要放到内存的,但是放到内存要走总线,消耗的周期比较长,对CPU性能有影响,所以先放到Data Cache里面,然后按照特定的算法由软件更新到内存。
为什么将指令cache和数据cache相分离?
主要是为了避免资源冲突,在五级指令流水线中,分为IF(取址),ID(译码),EXE(执行),MEM(访存),WB(写回)。当然也不一定是五级,现在处理器流水线的长度都在15级左右。但是IF和MEM这两步总是有的。
其中IF和MEM都会访问cache。但是IF是取指令,MEM是取数据。
当前指令的MEM和后面指令IF同时在流水线上执行,会产生同时访问cache的冲突(资源冲突),但是将指令cache和数据cache分开就能满足两者的同时访问了。就不会因为冲突,造成流水线暂停了,提高了流水线运行效率。