CO-3-存储系统
2021-07-29 20:19:29 0 举报
AI智能生成
计算机组成原理 第三章 存储系统 知识点梳理
作者其他创作
大纲/内容
SRAM和DRAM<br><font color="#F44336">高频考点</font><br>
存储元件不同导致性能差异
适合用于主存:DRAM<br>
栅极电容
读取是破坏性的,需要重写
成本低,集成度高,功耗低,慢
即使不断电,电容电荷也只能维持2ms
适合用于Cache:SRAM<br>
双稳态触发器
A高B低:1<br>A低B高:0<br>
需要两根线读写数据,读取不破坏原数据
成本高,功耗高,集成度低,快
只要不断电,触发器状态不改变
<font color="#F44336">DRAM的刷新</font>
即使不断电,电容电荷也只能维持<font color="#F44336">2ms</font>
默认一般<font color="#F44336">2ms</font>刷新一次,一次刷新一行(行列地址的行)
硬件自动完成,无需CPU控制
专用刷新电路,读一行重新写入,<br>占用一个<font color="#F44336">读写周期<br></font>要在2ms内保证每行至少刷新一次<br>
集中刷新(有死区)<br>每2ms逐行刷新一次<br>
分散刷新(<font color="#F44336">无死区</font>,但存取周期<font color="#F44336">变长</font>)<br>每存取一次刷新一次,<br>每次刷新新的一行<br>
异步刷新(有死区,但是缩短了)<br>利用专用电路每隔一段时间t刷新一行<br>t=2ms/行数<br>
既避免了CPU连续等待时间过长<br>又充分利用2ms刷新周期减少了刷新次数<br>
DRAM的<font color="#F44336">地址线复用技术</font>
SRAM行列地址同时发送,需要占用n位地址线
DRAM行列地址分两次分别发送,占用n/2位地址线<br>并引入新的行选通/列选通控制线RAS、CAS<br>
引脚减半
RAS/CAS线也可整合为1根
<font color="#F44336">片选线借用行选通/列选通实现</font>
主存↔CPU连接
任何时候地址总线引出的线,都是低位接入芯片地址线
高位作为片选线和控制线
单块芯片↔CPU
存储器芯片的信号线一般有:<span class="equation-text" data-index="0" data-equation="A_n,D_n,\overline{CS},\overline{WE}" contenteditable="false"><span></span><span></span></span><br>
<span class="equation-text" data-index="0" data-equation="CS" contenteditable="false"><span></span><span></span></span>:高电平有效<br><span class="equation-text" data-index="1" data-equation="\overline{CS}" contenteditable="false"><span></span><span></span></span>:低电平有效<br>
多块存储芯片↔CPU
数据总线宽度>存储芯片字长→位扩展法
所谓位扩展,就是扩展了每个存储芯片的位数,字数不变(8K*4b→8K*8b)<br>
不同芯片的读出数据可以同时经由DB传输
同时读取<font color="#F44336">不同芯片</font>的同一个地址的数据
数据总线宽度=存储芯片字长→字扩展法
可以理解为在“有多少字”这一维度上扩展了芯片的容量。实际上增加了主存的字数(8K*8b→16K*8b)
线选法
额外的地址线1对1地连接对应的存储芯片
地址空间不连续<br>
片选法
额外的地址线产生的<span class="equation-text" data-index="0" data-equation="2^n" contenteditable="false"><span></span><span></span></span>种组合与等量的芯片一一对应
需要一个n-<span class="equation-text" data-index="0" data-equation="2^n" contenteditable="false"><span></span><span></span></span>译码器
地址空间连续。但电路复杂(译码器)
字位扩展法
译码器补充
通常译码器(如<span class="equation-text" data-index="0" data-equation="74ls138" contenteditable="false"><span></span><span></span></span>)还有类似的使能引脚,可以提供:全1,全0,是否接受输入的功能
<font color="#F44336"><span class="equation-text" data-index="0" data-equation="74ls138" contenteditable="false"><span></span><span></span></span>芯片是考点<br></font>
CPU的AB产生地址信号后,可能不稳定,CPU可以等AB稳定后再向<br>译码器发出<span class="equation-text" data-index="0" data-equation="\overline{MREQ}" contenteditable="false"><span></span><span></span></span>(主存访问请求)信号以保证译码器选片是稳定的<br>
Cache与主存的映射方式(3)
全相联映射
任何一个主存块,可以存在任何一个Cache块中
CPU访问时...
用地址的块号部分,逐个检查Cache中的标记<br>
若存在,且有效位=1,则命中
按地址的块内地址访问Cache块内数据
存储空间利用充分,命中率高
查找标记最慢,最慢要对比所有块的标记
直接映射
任意主存块只能存放在<font color="#F44336">某个</font>特定的Cache块
目标Cache块号=主存块数%Cache总块数
<font color="#F44336">当Cache块数为<span class="equation-text" data-index="0" data-equation="2^n" contenteditable="false"><span></span><span></span></span>时,主存块号低n位直接对应其在Cache中的位置</font>
借此可以优化标记<br>(去掉标记低n位(反正一样))<br>
主存块号也可分为标记、Cache块号两部分
速度最快
空间利用率低
即使Cache有空位,数据也不一定能调入Cache,命中率低<br>
CPU访问时...
用主存地址块号的低n位,查找对应的Cache块<br>
若有,且标记位与原块号(标记位部分)相同,且有效位=1,则命中
按地址的块内地址访问Cache块内数据
组相联映射<br>按Cache每组块数,可称为<br>n路组相联映射<br>
任意一部分主存快只能存放在<font color="#F44336">某组</font>特定的Cache块
组号=主存块号%组数,目标Cache块号=目标Cache组空位
折中<br>
<font color="#F44336">当每组块数为<span class="equation-text" data-index="0" data-equation="2^n" contenteditable="false"><span></span><span></span></span>时,主存块号低n位对应其在Cache中的组号</font>
借此可以优化标记<br>(去掉标记低n位(反正一样))<br>
主存块号也可分为标记、Cache组号两部分
CPU访问时...
用主存地址块号的组号部分,寻找目标Cache组<br>
若Cache组内有标记位与原块号(标记位部分)相同,且其有效位=1,则命中
按地址的块内地址访问Cache块内数据
标记
用于标记当前Cache块内数据来自于哪个主存块
初始为0,但并非意味着保存了0号主存的数据
有效位
用于表示标记是否有效,1有效
Cache替换算法(4)
场景
全相联
只有Cache全满才需要替换
要在<font color="#F44336">全局</font>选择替换对象
直接映射
对应位置非空则直接替换
组相连
组满需要替换
在<font color="#F44336">分组内</font>选择替换对象
算法
随机RAND
若已满,随机选择一个替换
不考虑局部性原理,导致H降低,效果不稳定
先进先出FIFO
不考虑局部性原理,即使最先调入Cache访问也可能最频繁
实现简单
<font color="#F44336">抖动</font>
刚被换出的块很快又被换入,频繁换出换入导致抖动
近期最少使用LRU
设置计数器记录块“已经未被访问”的时间,替换时替换计数器最大的
考虑了局部性原理,命中率高
<font color="#F44336">若频繁访问的主存块数量大于Cache块数则还是存在抖动</font>
机器实现
为Cache块添加一个计数器位
访问时...
命中时,命中块计数器清零,比其原值低的其他计数器+1,其余不变
未命中但还有空闲块时,新装入块记为0,其余非空闲+1
未命中且无空闲块时,计数器最大的调出,新装入置0,其余全+1
手算技巧
若未命中,从访问点往前看每个块最后一次被访问的位置,远者换出
最近不经常使用LFU
设置计数器记录块“已经访问”次数,替换时替换计数器最小的
并非效果更佳
若一段时间内频繁访问,则计数器非常大,不再访问后也会长时间占据Cache
即不遵循时间局部性
机器实现
为Cache块添加一个计数器位
访问时...
新调入时,计数器=0,每访问其一次,其计数器+1
替换时替换计数器最小的
存在多个最小时,按行递增或FIFO进行替换<br>
Cache写策略(2*2)
写命中<br>目标主存单元在Cache有副本<br>
写回法
只修改Cache,当换出时再写回主存
Cache块脏位<br>
当cache被写过,脏位为1表示写过
全写法<br>写直通法<br>
同时修改<br>使用写缓冲<br>
用SRAM实现的FIFO队列
CPU向Cache和写缓冲写入数据
CPU完成写入后去执行其他工作
此时专用电路控制写缓冲将数据写回主存
写操作不频繁,效果好<br>写操作频繁,写缓冲饱和导致阻塞<br>
写不命中<br>目标主存单元在Cache无副本
写分配法
先将目标块调入Cache
CPU在Cache中写完
<font color="#F44336">搭配写回法使用</font>
非写分配法<br>
直接写回主存
<font color="#F44336">搭配全写法使用</font>
虚拟存储系统<br>和OS.ep3高度重合<br>
页式存储器
背景
块式存储要求数据必须存放在连续的物理块中,这导致了主存利用率的下降
将<font color="#F44336">进程</font>分为与物理块<font color="#F44336">等大</font>的“页面”,并进行编号,允许离散的存储到主存中
虚地址 & 实地址<br>
程序员使用的地址:(逻辑地址)虚地址
逻辑页号:页内地址
实际主存中的地址:(物理地址)实地址
主存块号:块内地址
页表基址寄存器(CPU)
指明页表在<font color="#F44336">主存</font>中的存放地址
页表<br>(慢表)<br>
页表项
记录逻辑页号和主存块号的对应关系
逻辑页号:主存块号
页表项被访问时...<br>相当于一次访存(慢)<br>
把该项对应的块放入Cache
把该项放入快表
快表TLB<br>SRAM<br>相联存储器<br>
快表项<br>
逻辑页号:主存块号
查询成功(命中)...
直接得到主存块号<br>
与Cache的区别
Cache存<font color="#F44336">主存块</font>的副本
快表存<font color="#F44336">页表项</font>的副本(很小)
替换<br>
得到物理地址后...<br>
Cache中寻找副本...<br>
...
虚拟存储器(3)<br>
背景
由于程序运行可以只将部分内容调入内存,用户感知的内存容量比实际内存容量大
辅存→内存
虚拟页式存储器
改进页表
增加有效位
有效位为1表示页面已经调入主存
增加外存块号
有效位为0时去外存中调取<br>
增加访问位
用于页面替换算法<br>(参照OS)
记录页面访问次数
脏位
段式虚拟存储器
段的大小不总一样
分段需要按照逻辑
交由OS确定将哪一段调入主存
页表基址寄存器(CPU)
指明页表在<font color="#F44336">主存</font>中的存放地址
虚拟地址
段内地址
段号
段表
段号:段首址:装入位:段长
段页式虚拟存储器
先按逻辑结构将程序分段
每段再继续分页
虚拟地址
段号:端内页号:页内地址
基本概念
层次结构<br>
<font color="#F44336">BIOS也看做主存的一部分,虽然用的是ROM芯片</font>
<font color="#F44336">一般BIOS和RAM是统一编址的</font>
主存↔辅存:硬件+OS(负责<font color="#F44336">页面置换算法</font>)
实现虚拟存储系统<br>
解决了主存容量不足的问题
Cache↔主存:硬件自动完成<br>
解决了主存与CPU速度不匹配的问题
Cache和主存均可直接被CPU读写
分类
介质
半导体:一般比较快
磁性材料
光存储器:CD
存取方式
随机存取(RAM)
顺序存取(SAM)(Sequential Access Memory)(磁带)<br>
直接存取(DAM):直接选取区域,再顺序读取(磁盘)<br>
相联存储(CAM):通过内容直接检索到存储位置,无需指定地址(快表)
信息可更改性
读写
只读(ROM)
ROM也不是完全不能写,比较麻烦耳<br>
EPROM
BIOS是ROM,存储的“自举装入程序”负责引导装入操作系统(开机)<br>
<font color="#F44336">U盘是ROM(Flash)</font>
信息可保存性
易失性(Cache)
非易失性
读出是否破坏原数据
破坏性读出(DRAM):需要重写
非破坏性读出(SRAM、磁盘、光盘)
度量性能的指标<br>
<font color="#F44336">存储容量<br></font>
字数×字长
字节数<br>
存储速度:<font color="#F44336">数据传输率</font>=数据宽度/存储周期
存取周期<span class="equation-text" data-index="0" data-equation="T_a" contenteditable="false"><span></span><span></span></span>:启动一次存储器到完成操作经历的时间,<br>分为读出时间和写入时间<br>
存取周期<span class="equation-text" data-index="0" data-equation="T_m" contenteditable="false"><span></span><span></span></span>:亦称读写周期/访问周期,<br>指进行一次完整的读写操作的全部时间,<br>即连续两次独立访问(R/W)之间需要的最小时间间隔<br>
=存取时间+恢复时间
数据传输率即是:主存带宽<span class="equation-text" data-index="0" data-equation="B_m" contenteditable="false"><span></span><span></span></span>,单位为字/秒,字节/秒,位/秒
单位成本:每1bit需要的价格
主存储器的基本组成
半导体元件原理
存储元
物理结构:电容(接地)+MOS(输入电压达到阈值导通(电容充电),否则断开)
用电容是否保存电荷表示1/0
存储芯片原理
基本结构
存储字
多个存储元的排列(<font color="#F44336">字选线</font>接MOS,<font color="#4CAF50">位线</font>读数据)(一次读一行)
存储字长:字长为一行的bit数(图中为8)
存储体<br>(存储矩阵):多个存储字的排列<br>
总容量=存储字数×存储字长
有时记为a×b位的芯片
工作逻辑
译码器:根据MAR送来的地址,<br>将其转化为某一位具体字的<font color="#F44336">字选线</font>导通<br>
n位地址,<span class="equation-text" data-index="0" data-equation="2^n" contenteditable="false"><span></span><span></span></span>个存储字<br>
行列地址:存储字的排列从一维到二维,分行列地址,<br>由行译码器、列译码器共同完成译码寻址,可减少字选线的数量(√n)<br>
位线读出的数据传送到MDR中
CPU通过数据总线从MDR中取走数据
数据总线宽度=字长
控制电路:控制整个流程
<span class="equation-text" data-index="0" data-equation="片选线\overline{CS}(\overline{CE})" contenteditable="false"><span></span><span></span></span>:低电平有效<br>表示磁存储芯片启用<br>
读写控制线<span class="equation-text" data-index="0" data-equation="\overline{WE}允许写,\overline{OE}允许读\\(或\overline{WE}低写高读)" contenteditable="false"><span></span><span></span></span>
两种方案引脚数不同<br>
封装好的结构:每一根线都会引出一根金属引脚
现代计算机通常已经把MAR,MDR集成在CPU内部,<br>存储芯片只需要普通的寄存器用于暂存输入输出数据<br>
寻址方式
对于一个总容量1KB,字长为4B的存储器
按字节寻址1K单元,每单元1B
按字寻址:256单元,每单元4B
按半字寻址:512单元,每单元2B
按双字寻址:128单元,每单元8B
ROM<br>非易失性<br>只读存储器<br>
掩膜式只读存储器MROM
生产中直接写入,任何情况不可重写
可靠性高
可编程只读存储PROM
可用专门的PROM写入器写入,但只能写一次
可擦除可编程只读存储EPROM
允许写入,也允许用某种方式擦除,可多次重写<br>
紫外光照8-20min,全部擦除:UVEPROM
电擦除特定字:EEPROM(E<span class="equation-text" data-index="0" data-equation="^2" contenteditable="false"><span></span><span></span></span>PROM)
闪存Flash
发展自EEPROM,可多次快速擦写
写比读慢,先擦再写
存储元使用单个MOS管,位密度高于RAM
SSD
控制单元与Flash不同<br>存储介质类似<br>
双端口RAM & <br>多模块存储器<br>
提升主存速度:需求
DRAM读取是破坏性的,需要重写,导致恢复时间过长<br>(数倍于存取时间),从而延长存取周期<br>
双端口RAM
即两组完全独立的数据线、地址线<br>
CPU、RAM中控制电路更复杂
优化多核CPU访问同一内存的速度
冲突控制<br>(OS线程安全)<br>
不同地址存取<br>
同时读
同时写
一读一写
多模块存储器<br>解决恢复时间长的问题<br>
单体多字存储
即位扩展
一次读一行,不能拆分:灵活性较差
多体并行存储
用高位区分具体访问哪个内存条:高位交叉编址
跳跃访问也有很好的性能<br>
跳跃访问不符合程序读写的局部性,实际性能不稳定<br>
用低位区分具体访问哪个内存条:低位交叉编址<br>
连续访问性能很好
满足<span class="equation-text" data-index="0" data-equation="模块数m\geq存取周期T/存取时间r" contenteditable="false"><span></span><span></span></span><br>即可保证流水线不间断,尽量取等以免闲置。<br>
注意地址编号
内存内地址连续编号:高位交叉编址<br>
内存间同位置地址连续编号:低位交叉编址<br>
可以逐字读取,灵活性很好
每个存储体存取周期为T,存取时间为r,设T=4r :可见效率提高了<br>
低位交叉编址的多体存储——双通道内存:实际应用
内存主频=1/T
Cache基本原理
目标
匹配内存和CPU的速度差距<br>
基于
程序局部性原理
空间局部性
最近未来用到的指令和数据很可能与正在使用的在存储空间上临近
时间局部性
最近未来用到的指令和数据很可能是现在正在使用的信息
实现
把CPU目前访问的地址“周围”部分数据放到Cache中
每次被访问的块一定被立即调入Cache
映射方式
若Cache已满?
替换算法
如何保存Cache中数据和主存中的一致性?
Cache写策略
多级Cache
离CPU越近,越快,越小<br>离CPU越远,越慢,越大<br>
内存地址分块
编址方案采用:块号+块内地址<br>高位块号,低位块内地址<br>
OS中,主存中的一块通常<br>称为“页、页面、页框”<br>
Cache中的块也称“行”
性能
命中率H
CPU欲访问的信息已在Cache中的比例
缺失率M=1-H
设<span class="equation-text" data-index="0" data-equation="t_c" contenteditable="false"><span></span><span></span></span>为访问一次Cache所需时间<br><span class="equation-text" data-index="1" data-equation="t_m" contenteditable="false"><span></span><span></span></span>为访问一次主存需要的时间<br>
不允许同时访问,先访问Cache,再访问主存:平均访问时间<span class="equation-text" data-index="0" data-equation="t=Ht_c+M({\color{red}t_c+t_m})" contenteditable="false"><span></span><span></span></span><br>
允许同时访问:平均访问时间<span class="equation-text" data-index="0" data-equation="t=Ht_c+M{\color{red}t_m}" contenteditable="false"><span></span><span></span></span><br>
若cache命中则立即停止访问主存
0 条评论
下一页