第四章 存储器
主存储器和cache
4.1 概述
存储器分类
- 存储介质分类
- 半导体存储器(主要)
- TTL:集成度低,功耗高,速度快
- MOS:集成度高、功耗低
- 半导体大部分易失、以下三种非易失
- 磁表面存储器
- 磁层磁化的方向表示01,有磁头、磁载体
- 磁芯存储器
- 硬磁材料做成的环状元件,磁心中有驱动线和读出线。一个磁芯两根导线,NS表示01。xy两根线用于寻址。
- 光盘存储器
- 激光
- 半导体存储器(主要)
- 存取方式分类
- 随机存储器RAM 存取时间与存取单元的物理位置无关 又分
- 只读存储器ROM 存取时间与物理地址有关 又分
- 作用分类
4.2 主存储器
4.2.1 主存储器的基本组成
- MAR必须经过译码器才能选定指定的存储单元
- MDR保存了数据,要通过读写电路和控制电路决定是读还是写,控制方向
主存与CPU的联系,三种类型的信号
- 数据总线直接连MDR寄存器上,双向
- 地址总线连在MAR寄存器,单向的,从CPU送到主存
- 控制总线单向,由CPU送到主存
主存中存储单元的地址分配
- 24位地址总线,字长32位,按字节寻址16MB,按字寻址4MW;字长16位,按字节寻址16MB,按字寻址8MW
- 高位字节存放在低地址,低位字节存放在高地址。高位字节的地址作为存储字的地址。–大端
- 12345678 字地址12
- 低位字节存放在低地址,高位字节存放在高地址。低位字节的地址作为存储字的地址。–小端
- 78563412 字地址78
- x86机器
主存的技术指标
- 存储容量
- 存储容量=存储单元个数*存储字长
- 存储速度
- 存取时间Memory Access Time
- 从存储器给出地址开始,直到得到稳定的输出或输入
- 存储周期Memory Cycle Time
- 连续两次独立的存储器操作所需最小间隔时间
- 一般存储周期比存储时间长!
- 存取时间Memory Access Time
- 与Momory Cycle Time相关指标 存储器的带宽
- 若存储器的数据总线宽度为 32 位,存取周期为 200ns ,则存储器的带宽是多少
- 1MHz=10^6Hz
- 1/200ns = 5*10^6Hz = 5MHz 主频时钟=1/存取周期
- 带宽 = 5MHz*32bit = 160Mb/s = 20MB/s 带宽=主频*总线宽度
- 提高存储器带宽:
- 缩短存取周期Memory Cycle Time
- 增加存储字长,每个周期访问更多的二进制位
- 增加存储体
- 若存储器的数据总线宽度为 32 位,存取周期为 200ns ,则存储器的带宽是多少
4.2.2 半导体存储器芯片
基本结构
- 存储矩阵、读写矩阵、译码驱动
- 地址线单向输入,经过译码驱动
- 数据线双向
- 地址线和数据线的位数共同反映存储芯片的容量,计算:地址线10根,数据线4根,芯片容量2^10 * 4 = 4K
- 控制线:读写控制线和片选线两种
- 片选线
- 就是芯片选择线,决定访问哪个芯片
- 低电平有效
- 两种标识方式:CS、CE 一横标识低电平有效
- 片选信号
- 用16K*1的芯片 组成满足CPU 64K*8的要求的存储器
- 需要 一组八个芯片,布置四组 = 32 个芯片
- 读写控制线
- 可以一根,可以两根
- 两种标识:
- 一根 WE 低电平写,高电平读
- 两根 OE 允许读 WE允许写
- 片选线
译码驱动方式
- 线选法
- 1M*8 20根地址线,有一个译码器译码,地址译码后有1M条线
- 重合法
- 行地址只能有一条线有效,列地址也是
- 行0列0,经过译码后,只有X0、Y0有效,打开两个开关,信号畅通,可以输出
- 20根地址线,10*10,xy方向各1K条,总计2K条,比线选法少,芯片集成度更高
4.2.3 随机存取存储器RAM
静态RAM(SRAM)(cache用的SRAM)
- 保存01方式
-
利用双稳态触发器,4个管子,T1-T4组成的电路 T5、T6对存储原件进行读写,开关,受行地址选择控制 T7、T8是该列所有存储元件共有的开关,叫做列开关,受列地址选择控制 先用T5T6选择行,然后只有列地址选择线有效,信号才会通过T8输出
- 静态RAM基本电路读操作 六管静态RAM 给出行选信号,打开T5T6 给出列选信号,打开T7T8 读有效,MOS导通,存放在A中数据通过T6送出去,T8导通,送到数据总线上
- 静态RAM写操作 行选择 列选择 ……
-
- 单元电路结构 2114RAM结构 行地址6个0,列地址4个0,第0行行选择信号有效,第0列列开关打开,交叉点上第一二三四组的第0行都会被选择 WE信号有效,CS信号有效,数据通过IO1-IO4写入第一二三四组的第0列,数据可以写到对应单元
动态RAM(DRAM)
- 保存01的方式
- 静态RAM双稳态触发器,动态使用电容,饱和是1,没有被充电就是0 两种动态RAM的单元电路 三管:T123是控制管,读选择线和写选择线 T4是预充电管 单管动态RAM
- 基本单元电路构成
- 三管 intel1103 刷新放大器 三角形 电容存储电荷的原理存储信息,电容会漏电,刷新放大器对电容保存的信息进行刷新 行地址11111,第31行被选中(行地址00000,第0行被选中)…
- 单管 intel4116 16K*1的存储芯片,地址线只有7根 7位行7位列分别存在行地址缓冲器和列地址缓冲器中 数据输入寄存器和数据输出驱动 RAS、CAS、WE产生行列写时钟 读放大器的左侧电容 有电0无电1,右侧相反,有电1无电0(跷跷板电路)
- 读出和写入
- 动态RAM结构
- 动态RAM如何读出和写入
- 刷新
- 电容容易漏电,如果不再生电容信息,就会丢失
- 刷新只和行地址有关,每次刷新一行所有的基本单元电路,每次刷新一行的数据
- 三种方法
- 集中式刷新
- 存取周期0.5微秒,刷新周期2毫秒,128行128列矩阵
- 2ms,4000个存取周期,刷新128行,前3872个周期供读出、写入,后128个周期专用于芯片的刷新操作,无法进行信息交换,死区,0.5微秒*128行
- 死区动态RAM不能用,CPU和IO只能等待,集中刷新的问题
- 设对128 x 128矩阵的存储芯片进行刷新,若存取周期为0.5us,刷新周期为2ms,采用集中刷新的方式,那么对128行集中刷新,一共需要()us?死时间率为()%?
- 刷新一遍的时间=存储周期*行数=0.5微秒*128=64微秒
- 死时间率=死时间/刷新周期=64微秒/2ms=64/200=0.32
- 存取周期0.5微秒,刷新周期2毫秒,128行128列矩阵
- 分散刷新
- 存取周期1微秒,128行128列的芯片
- 每个读写操作后面绑定一个刷新操作,对每行存储单元的刷新分布到每个存取周期内完成
- tm是原来的读写周期0.5微秒,tr是用于某一行的刷新0.5微秒,所以存取周期tc变成原来的两倍(tc=tm+tr)
- 本来2毫秒刷新128行,现在128微秒就刷新完了128行,而且不存在死时间
- 过度刷新,不需要这么频繁的刷新,性能下降
- 异步刷新
- 2毫秒刷新128行,每经过15.6微秒(刷新周期/总行数)刷新一行,每行刷新的时间仍为0.5微秒,刷新时间仍为2ms,死区缩短成了0.5微秒,每行每隔2ms刷新一次
- 间隔=刷新周期/总行数=2ms/128=15.6ms
- 设对128 x 128矩阵的存储芯片进行刷新,若存取周期为0.5us,刷新周期为2ms,采用异步刷新的方式,那么对128行异步刷新,一共需要()us?死时间率为()%?
- 刷新时间仍为2ms;一共4000个存取周期(2ms/0.5us=2000/0.5=4000),死时间率为1/4000
- 集中式刷新
静态RAM和动态RAM的比较
- 存储原理
- 动态DRAM–电容,静态SRAM–触发器 存储01
- DRAM集成度高,与SDRAM相比,DRAM所用的mos管少,占硅面积小,因而功耗小,集成度高
- DRAM芯片的引脚数少,封装体积小
- SRAM价格贵(cache),速度快,不会分行地址和列地址,所以引脚数更多,结构更复杂
- DRAM功耗小,只是对电容充放电和刷新,SRAM功耗大
- 通常DRAM用于做主存,SRAM用于cache,小容量高速度
4.2.4 只读存储器ROM
- 一般用于保存系统程序和配置信息
- PROM、EPROM、EEPROM
- PROM:可编程只读存储器,Programmable Red-Only Memory
- EPROM:可擦写可编程只读存储器,Erasable Programmable Read-Only Memory
- EEPROM:电可擦除可编程只读存储器,Electrically Erasable Programmable Read-Only Memory
- Flash memory:非易失性的内存
- 半导体ROM,基本器件
分类
掩膜ROM MROM
1K*1 最上面一排预充电管,预充电后,所有卫线高电平 输出端有读出方法器,对输出数据反相 行列有MOS管是1,无是0
PROM
可一次性破坏性编程 熔丝式PROM芯片,0烧断1不烧断
EPROM
可擦洗可编程 N型沟道浮动栅MOS管 正电压,S和D形成浮动栅,0;不加正电压,1
需要改变状态,用紫外线驱散浮动栅 信息的擦除比较麻烦 价格便宜
EEPROM
电可擦写
Flash Memory
U盘、更快 具备RAM的一些功能
4.2.5 存储器和CPU的连接 *
CPU地址线多,寻址空间范围较大,需要多个芯片
存储器容量的扩展
位扩展
增加存储字长 1K*4芯片构成1K*8位的存储器 两个1K*4位的芯片,采用相同的片选,同时被选中,每个读写四位,合在一起八位 需要两片,地址线10条,数据线8条,片选连在一起 intel2114芯片 注意看图
字扩展
增加存储器字的数量 1K*8的芯片构成2K*8 即存储字增加了一倍 两个芯片,地址输入均为10条,数据线0-7提供八位数据,注意两个芯片不能同时进行工作,否则数据线上会混乱 2K*8 11条地址线 A10是片选信号,A10=0选第一个,A10=1选第二个芯片
字、位扩展
1K*4的芯片组成4K*8的存储器 ? 芯片数量的计算,32K位/4K位 = 8片 连接方式 两个1K*4 = 1K*8 需要4组构成 4K*8 A0-A11:12根地址线 8根数据线 A0-A9 –> 1K*8 剩余两根地址线作为片选信号,A10-A11,有4K的地址,分给四组 00 0000000000/11111111111 第一组 01 0000000000/11111111111 第二组 10 0000000000/11111111111 第三组 11 0000000000/11111111111 第四组
存储器与CPU的连接
地址线的连接
地址连接的时候,地址的低位作为地址,高位作为芯片选择信号
数据线的连接
使存储器输出输入的数据满足CPU的要求
片选线的连接
确认CPU访问存储器不是IO 每个内存芯片都有自己的地址范围,必须满足CPU的要求,每一根地址线都要用到
合理选择存储芯片
实例1
CPU有16根地址线,8根数据线,(寻址范围64K,读写8位),MREQ作访存控制信号
RAM:1K*4、4K*8、8K*8 ROM:2K*8、4K*8、8K*8 6000H~67FFH系统程序区 6800H~6BFFH用户程序区 0110 0000 0000 0000 0110 0111 1111 1111 2^11=2K * 8 0110 1000 0000 0000 0110 1011 1111 1111 2^10=1K * 8 系统程序区选ROM 一片2K*8 用户程序区用RAM 两片1K*4,片选信号连在一起组成 地址线的分配 A0-A10 11根地址线 A0-A9 10根地址线
138译码器的结构和功能 * CBA输入端… *
实例2
条件同上 要求最小的4K是系统程序区,相邻的8K是用户程序区 0000 0000 0000 0000 0000 1111 1111 1111 0001 1111 1111 1111 8K*8 ……
4.2.6 存储器的校验
000-111 –> 001
0101 n-4 k-3
124 3567 0101
1 2 4
4.2.7 提高访存速度
单体多字系统
- 每次可以读取多个字
- 单体四字4*W,按地址可在一个存取周期内读出4*W位的指令或数据,将主存带宽提高到4倍
- 前提是数据和指令在主存内是连续存放的,遇到转移指令则效果不明显
多体并行系统
- 多体模块,每个模块相同容量和存取速度,各模块有独立的地址寄存器、地址译码器、驱动电路和读写电路
- 高位交叉编址
- 高位地址表示体号
- 数据和指令连续时,用一个存储体,效率低
- 低位交叉编址
- 模M编址(M等于模块数,M取2的方幂较为简单,为了减少存储器冲突,采用质数个模块)
- 模4交叉编址
- 低位地址表示体号,高位位体内地址
地址表 最低两位地址 M0 0、4、8、12、4i+0 00 M1 1、5、9、13、4i+1 01 M2 2、6、10、14、4i+2 10 M3 3、7、11、15、4i+3 11
- 多体模块的存储器采用交叉编址后,可以在不改变每个模块存取周期的前提下,提高存储器的带宽
存储器控制部件(存控)
排队器、控制线路、节拍发生器以及标记触发器 排队器 易丢失的请求源,优先级最高 严重影响CPU工作,次高级优先级 写请求>读数,读数请求>读指令 写书 > 读数优先级>读指令 存控标记触发器Cm 接收排队器的输出信号,一旦响应,置1,以便启动节拍发生器 节拍发生器 产生固定节拍,与机器主脉冲同步,使控制线路按时序发出信号 控制线路 将排队器发出的信号和节拍发生器提供的节拍信号配合,向存储器各部件发出控制信号
Cache
主存块号m位,块内地址b位,m+b=n位 B=2^b,反应了块的大小,B为块长
Cache块号c位,块内地址b位,c+b 缓存块设一个标记,表示当前存放的是哪一个主存块
所需数已在缓存中,可直接访问cache,cache命中 缓存的块数C远小于主存的块数M CPU读信息时,要将主存地址的高m位(或其中一位),与缓存块的标记进行比较,以判断
影响cache的效率
cache的容量和块长 80386的主存最大容量4GB,与其配套的cache容量为16KB或32KB,命中率可达95%以上 块长从增长,起初由于局部性原理,已被访问字的附近,近期也可能被访问,而块长增加,导致缓存中块数的减少,新装入的块覆盖旧块,会导致少量块刚被装入又被覆盖,命中率反而下降 一般每块取4-8个可编址单位(字或字节)较好,也可选择一个主存周期所能调出主存的信息长度 CRAY-1主存16个体交叉,每个体单字宽,存放指令的cache块长为16个字 IBM 370/168机主存是4体交叉,每个体宽64位(8个字节),cache块长32个字节
cache的基本结构
- cache存储体
- 地址映像变换机构
- 将CPU送来的主存地址转换为cache地址,由于主存与cache的块大小相同,块内地址是偏移,即低位地址相同,因此地址变换主要是高位地址(块号)
- 主存与cache间的块号转换
- 命中CPU就可以直接访问cache存储体
- 不命中,不仅取出该字,将它所在的主存快一并调入cache,供cpu使用
- 如果cache未满,可以调入,cache满了,需要替换策略
- 替换机构
- 替换算法
- cache对用户是透明的,用户编程时所用的地址是主存地址,用户不知道这些主存块是否已经在cache中,引入主存块调入cache是机器硬件完成的
- cache的读写操作
- cache如何与主存内容保持一致
- 写直达法(通过式写Write-through、通过式存Store-through)
- 随时保持主存与cache一致,但可能会增加访存次数
- 写回法(Write-back)(又称标志交换式Flang-Swap)
- cache和主存的数据可能不一致
- 暂时写入cache,并用标志(dirty bit)将该块加以注明,直到该块从cache替换出,才写入主存。每个cache line只有一个dirty bit,表示是否被修改过
- 速度快,因主存中的字块未经随时修改,可能失效
cache的改进
- 增加cache的级数
- 单一缓存(与CPU在一个芯片内,片内缓存,片载缓存) 提高外部总线的利用率 intel 80486 片内有8K字节的片内缓存
- 两级缓存 主存与片内缓存之间,加一级缓存,片外缓存 比主存动态RAM和ROM存取速度更快的静态RAM组成
- 将统一的cache分开
- 统一缓存 指令和数据都存放在一起
- 分开缓存 指令cache、数据cache
- 与主存结构一致
- 与机器对指令的控制方式有关 采用超前控制或流水线控制方式时,一般分开缓存 超前控制(超前取指、指令预取) 流水线 多条指令同时执行 强调指令的预取和指令的并行执行,必须把cache分开,否则会导致取指和执行过程对统一缓存的争用
- 简化的pentium处理器框图 64bit总线接口 指令cache8K,只读存储器,直接送到预取指令缓冲区 256bit 数据cache8K,有两个32位端口,与两个可并行的整数ALU相连,也可以合起来与64位浮点单元相连 数据cache支持整数ALU和浮点操作 pentium处理器支持外部二级缓存,达256K或512K PowerPC 620处理器 128bit的总线接口 两个cache 32K 32K 64bit的 三个可执行操作的整数ALU和一个浮点运算部件
4.3.2 Cache-主存 地址映像
- 直接映像
- 主存高m位,低b位
- 主存块号m位,字块内地址b位
- 主存地址m位,包含主存字块标记t和cache字块地址c,m=t+c
- 映射关系式 i=j mod C 或 i=j mod 2^C
- i是缓存块号,j是主存块号,C是缓存块数
- 缺点
- 每个主存块只能固定对应某个缓存块
- 缓存空间浪费
- 重复访问同一缓存位置的不同主存块,需要不停替换,降低命中率
- 全相联映像
- 允许主存中每一字块映像到cache的任一位置上
- 命中率高,缩小块冲突率
- 主存字块标记从t位变成t+c位,cache标记的位数增多
- 访问cache时需要和cache的全部标记位进行比较,才能做出判断,比较由按内容寻址的相联存储器来完成
- 组相联映像
- 把cache分为Q组,每组有R块
- i=j mod Q
- i是缓存的组号,j是主存的块号
- 主存字块标记一共m=t+c位,主存字块地址s=t+r位,组地址q=c-r位
- 与直接映像相比
- cache字块地址由c位变成了q位,q=c-r
- 2\^c表示cache的总块数
- 2\^q表示cache的分组个数
- 2\^r表示组内包含的块数
- 假设c=5,q=4,则r=c-q=1
- cache共有2\^c = 32个字块,共分为2\^4 = 16个组
- r=c-q=5-4=1,2\^1 = 2 即为每组内含有2个块
- 主存的某一字块可以摸16映像到cache某组的任一字块中
- 0、16、32…可以分到第0组2个字块中的任一字块
- 15、31、47… 第15组
- 【r=0】主存i块可以分组到cache的j组内,是直接映像关系
- 【r=c】?主存的第j块可以映像到第i组内中的任一块,是全相联映像关系
- 段相联映像
- 主存和cache都分成若干段,且使它们每段包含的块数都相等
- 段之间采用全相联,段内块采用直接映像
- 段数与cache块数相等时,每段只包含一块,全相联映像
- 段数是1,直接映像
- 一个四路组相连缓存实例问题
- 32 KB大小4路组相连cache,cache line大小是32 Bytes。请思考以下2个问题:
- 1.多少个组?
- 2.假设地址宽度是48 bits,index、offset以及tag分别占用几个bit?
- 总共4路,因此每路大小是8 KB。cache line size是32 Bytes,因此一共有256组(8 KB / 32 Bytes)。由于cache line size是32 Bytes,所以offset需要5位。一共256组,所以index需要8位,剩下的就是tag部分,占用35位。
4.3.3 替换算法
FIFO 最先调入cache的字块替换出来 LRU(近期最少使用) 需要记录cache中各个字块的使用情况 LRU的平均命中率比FIFO高,分组容量加大时更能提高LRU的命中率
4.4 辅助存储器
外存,速度慢、价格低、可脱机保存信息、非易失性
磁表面存储器的主要技术指标
记录密度 单位长度内存储的二进制信息量 磁盘存储器 道密度和位密度 道密度:磁盘沿半径方向单位长度的磁道数为道密度 道/英寸 Track Per Inch TPI 道/毫米 TPM 道密度Dt是道距P的倒数 DP=1 磁带存储器 位密度 位密度或线密度 bpi或bpm bits per inch 800bpi、1600bpi、6250bpi 一般位密度指的是最内圈磁道的位密度,即最大位密度 存储容量 二进制信息总数 C=n*k*s n是盘面数,k是每个盘面的磁道数,s是每条磁道上记录的二进制代码数 格式化容量和非格式化容量 格式化容量是按某种特定的记录格式所能存储信息的总量,一般占非格式化的60%-70% 平均寻址时间 磁盘采用直接存取方式,找道时间ts,等待预读写的磁道区段旋转到磁头下方的等待时间tw,平均时间Ta 硬磁盘<软磁盘 磁带存储器顺序存取,磁头不动磁带移动,不需要找磁道,考虑等待时间 数据传输率 Dt是单位时间内磁表面存储器向主机传送数据的位数或字节数 Dt = D*V 记录密度D,记录介质的运动速度V 误码率 出错位数和读出的总信息位数之比 循环冗余码
4.4.2 磁记录原理和记录方式
4.4.6 循环冗余校验码(CRC码)
模2运算,不考虑进位和借位 规律 模2加和模2减结果相同 ……