导图社区 计算机组成原理第三章存储系统
一块硬盘含有若干个记录面,每个记录面划分为若干条磁道,而每条磁道又划分为若干个扇区,扇区(也称块)是磁盘读写的最小单位,也就是说磁盘按块存取。
编辑于2022-10-18 23:45:00 江苏省第三章 存储系统 计算机组成原理 王道考研系列
存储系统基本概念
存储器的层次结构
主存——辅存:实现了虚拟存储系统,解决了主存容量不够的问题
Cache——主存:解决了主存与CPU速度不匹配的问题
存储器的分类
按层次
高速缓存(Cache)
主存储器(主存,内存)
辅助存储器(辅存,外存)
可直接被CPU读写
按存储介质
半导体存储器(Cache,主存)
磁表面存储器(磁带,磁盘)
光存储器(光盘)
按存取方式
随机存取存储器(RAM)
顺序存取存储器(SAM)
直接存取存储器(DAM)
相联存储器(CAM)
串行访问存储器:读写某个存储单元所需时间与存储单元的物理位置有关
按信息的可更改性
读写存储器(磁盘,内存,Cache)
只读存储器(CD-ROM,BIOS)
按信息的可保存性
易失性存储器(主存,Cache)
非易失性存储器(磁盘,光盘)
按读出后存储信息被破坏
破坏性读出(DRAM芯片)
非破坏性读出(SRAM芯片)
存储器的性能指标
存储容量:存储字数×存储字长
MDR位数反映存储字长
单位成本:每位价格=总成本/总容量
存储速度:数据传输率(主存带宽)=数据的宽度/存储周期
数据的宽度即存储字长
存储周期
存储周期=存取时间+恢复时间
主存储器的基本组成
半导体元件的原理
MOS管,作为通电“开关”
电容,存储电荷(即存储二进制0/1)
存储芯片的基本原理
译码驱动电路
译码器将地址信号转化为字选通线的高低电平
存储矩阵(存储体)
由多个存储单元构成,每个存储单元又由多个存储元构成
读写电路
每次读/写一个存储字
由多个存储单元构成,每个存储单元又由多个存储元构成
地址线,数据线,片选线,读写控制线;每根线都会对应一个金属引脚
如何实现不同的寻址方式
现代计算机通常按字节编址(每个字节),即每个字节对应一个地址
按字节寻址、按字寻址、按半字寻址、按双字寻址
SRAM和DRAM
存储元件不同导致的特性差异
DRAM的刷新
多久刷新一次?
2ms
每次刷新多少存储单元?
以行为单位,每次刷新一行存储单元
为什么要用行列地址?
减少选通线的数量
如何刷新?
有硬件支持,读出一行的信息后重新写入,占用1个读/写周期
在什么时刻刷新?
假设DRAM内部结构排列成128×128的形式,读/写周期0.5us
分散刷新
集中刷新
死区
异步刷新
死时间
可在译码阶段进行刷新
“刷新”由存储器独立完成,不需要CPU控制
DRAM的地址线复用技术
拆分为行列地址(DRAM行、列地址等长)
导致地址线,地址引脚减半
现在的主存通常采用SDRAM芯片
ROM
MROM
掩模式只读存储器
写入信息后,任何人不可重写(只能读出)
可靠性高,灵活性差,生产周期长,只适合批量定制
PROM
可编程只读存储器
用专门的设备写入信息一次后就不可更改
EPROM
可擦除可编程只读存储器
修改次数有限,写入时间很长
用某种方法擦除数据,可进行多次重写
UVEPROM
用紫外线照射8-20分钟,擦除所有信息
EEPROM
可用“电擦除”的方式,擦除特定的字
闪存
Flash Memory(U盘,SD卡)
断电后也能保存信息,可进行多次快速擦除重写
由于闪存需要先擦除再写入,因此闪存写的速度要比读速度更慢
每个存储元只需单个MOS管,位密度比RAM高
SSD
固态硬盘
可进行多次快速擦除重写
SSD速度快,功耗低,价格高
个人电脑常用SSD取代传统的机械硬盘
手机辅存也使用Flash芯片,但相比SSD使用的芯片集成度高,功耗低,价格贵
计算机内的重要的ROM
BIOS芯片(ROM),存储了“自举装入芯片”,负责引导装入操作系统(开机)
逻辑上,主存由RAM+ROM组成,且两者统一编址
一些考点
很多ROM是可以写的
RAM芯片是易失性的,ROM芯片是非易失性的
很多ROM也具有“随机存取”的特性
主存储器与CPU的连接
存储器芯片的基本结构
译码驱动电路
存储矩阵
读写电路
地址线,数据线,片选线,读写控制线
单块存储芯片与CPU的连接
多块存储芯片与CPU的连接
位扩展法(数据总线宽度>存储芯片字长)
字扩展法(扩展主存字数)
线选法
片选法
字位扩展法
关于译码器知识的补充
提升主存速度
存取周期
可以连续读/写的最短时间间隔
DRAM芯片的恢复时间比较长,有可能是存取时间的几倍
SRAM的恢复时间较短
双口RAM
作用:优化多核CPU访问一根内存条的速度
需要有两组完全独立的数据线,地址线,控制线。CPU,RAM中也要有更复杂的控制电路。
两个端口对同一主存操作有以下4种情况
1.两个端口同时对不同的地址单元存取数据
2.两个端口同时对同一地址单元读出数据
3.两个端口同时对同一地址单元写入数据
写入错误
4.两个端口同时对同一地址单元,一个写入数据,一个读出数据
读出错误
解决方法:置“忙”信号为0,由判断逻辑决定暂时关闭一个端口(即被延时),未被关闭的端口正常访问,被关闭的端口延长一个很短的时间段后再访问。
对比操作系统“读者-写者问题”
多模块存储器
单体多字存储器
多体并行存储器
假设每个存储体存取周期为T,存取时间为r,假设T=4r
高位交叉编址
用更高的几位判断进入哪块存储体
连续取n个存储字,耗时nT
低位交叉编址
用更低的几位判断进入哪块存储体
连续取n个存储字,耗时T+(n-1)r
应该取几个“体”?
采用“流水线”的方式并行存取(宏观上并行,微观上串行)
存取周期为T,存取时间为r,为了使流水线不间断,应保证模块数m≥T/r
存取周期为T,总线传输周期为r,为了使流水线不间断,应保证模块数m≥T/r
给定一个地址x,如何确定它属于第几个存储体?
根据体号判断
用x对m取余
每个模块都有相同的容量和存取速度
各模块都有独立的读写控制电路,地址寄存器和数据寄存器,他们既能并行工作,又能交叉工作。
外部存储器
计算机的外存储器又称为辅助存储器,目前主要使用磁表面存储器
磁盘存储器
Key:磁盘存取时间的计算
优点
存储容量大,位价格低
记录介质可以重复使用
记录信息可以长期保存而不丢失,甚至可以脱机存档
非破坏性读出,读出时不需要再生
缺点
存取速度慢
机械结构复杂
对工作环境要求较高
组成
存储区域
一块硬盘含有若干个记录面,每个记录面划分为若干条磁道,而每条磁道又划分为若干个扇区,扇区(也称块)是磁盘读写的最小单位,也就是说磁盘按块存取。
磁头数
即记录面数,表示硬盘总共有多少个磁头,磁头用于读取/写入盘片上记录面的信息,一个记录面对应一个磁头。
柱面数
表示硬盘每一面盘片上有多少条磁道。在一个盘组中,不同记录面的相同编号(位置)的诸磁道构成一个圆柱面。
扇区数
表示一条磁道上有多少个扇区
磁盘存储器
磁盘驱动器
核心部件是磁头组件和盘片组件
磁盘控制器
是硬盘存储器和主机的接口
性能指标
磁盘的容量
一个磁盘所能存储的字节总数
非格式化容量
磁记录表面可以利用的磁化单元总数
格式化容量
按照某种特定的记录格式所能存储信息的总量
记录密度
盘片单位面积上记录的二进制的信息量
道密度
沿磁盘半径方向单位长度上的磁道数
位密度
磁道单位长度上能记录的二进制代码位数
面密度
位密度和道密度的乘积
磁盘所有磁道记录的信息量一定是相等的,并不是圆越大信息越多,故每个磁道的位密度都不同
越内侧的磁道位密度越大
平均存取时间
寻道时间(磁盘移动到目的磁道)+
有的题还会加磁盘控制器延迟
数据传输率
单位时间内向主机传送数据的字节数
设磁盘转数为r(转/秒),每条磁道容量为N个字节,则数据传输率为D=Nr
磁盘地址
驱动器号+柱面(磁道)号+盘面号+扇区号
磁盘的工作过程
寻址
读盘
写盘
磁盘阵列
RAID0
逻辑上相邻的两个扇区在物理上存到两个磁盘
无冗余和无校验的磁盘阵列
没有容错能力
RAID1
镜像磁盘阵列
存两份数据
有容错能力,但容量减少一半
RAID2
采用纠错码的海明码的磁盘阵列
逻辑上连续的几个bit物理上分散存储在各个盘中
RAID3
RAID4
RAID5
固态硬盘(SSD)
原理
基于闪存技术Flash Memory,属于电可擦除ROM,即EEPROM
组成
闪存翻译层
负责翻译逻辑块号,找到对应页(Page)
存储介质:多个闪存芯片(Flash Chip)
每个芯片包含多个块(block)
每个块包含多个页(page)
读写性能特性
以页(page)为单位读/写
相当于磁盘的“扇区”
以块(block)为单位“擦除”,擦干净的块,其中的每页都可以写一次,读无限次
支持随机访问,系统给定一个逻辑地址,闪存翻译层可通过电路迅速定位到对应的物理地址
读快,写慢。要写的也如果有数据,则不能写入,需要将块内其他页全部复制到一个新的(擦除过的)块中,再写入新的页
与机械硬盘相比的特点
SSD读写速度快,随机访问性能高,用电路控制访问位置;机械硬盘通过移动磁臂旋转磁盘控制读写位置,有寻道时间和旋转延迟
SSD安静无噪音,耐摔抗震,能耗低,造假更贵
SSD的一个“块”被擦除次数过多(重复读同一个块)可能会坏掉,而机械硬盘的扇区不会因为写的次数太多而坏掉
磨损均衡技术
思想:将“擦除”平均分布在各个块上,以提升使用寿命
动态磨损均衡
写入数据时,优先选择累计擦除次数少的新闪存块
静态磨损次数
SSD监测并自动进行数据分配,迁移,让老旧的闪存快承担以读写为主的储存任务,让较新的闪存块承担更多的写任务
Cache
基本概念和原理
存储系统存在的问题
双端口RAM、多模块存储器提高存储器的工作速度
优化后速度与CPU差距依然很大
所以就有了Cache(高速缓冲存储器)
Cache的工作原理
实际上,Cache 被集成在CPU内部,Cache用SRAM实现,速度快,成本高
局部性原理
空间局部性
在最近的未来要用到的信息(指令和数据),很可能与现在正在使用的信息在存储空间上是邻近的
Eg:数组元素、顺序执行的指令代码
时间局部性
在最近的未来要用到的信息,很可能是现在正在使用的信息
Eg:循环结构的指令代码
基于局部性原理,不难想到,可以把CPU目前访问的地址“周围”的部分数据放到Cache中
性能分析
其他概念
主存与Cache之间以“块”为单位进行数据交换
主存的“块”又叫“页/页框/页面”;Cache的“块”又叫“行”
主存地址可拆分为(主存块号,块内地址)的形式
有待解决的问题
如何区分 Cache 与 主存 的数据块对应关系? ——Cache和主存的映射方式
Cache 很小,主存很大。如果Cache满了怎么办? ——替换算法
CPU修改了Cache中的数据副本,如何确保主存中数据母本的一致性? ——Cache写策略
Cache和主存的映射方式
Cache中存储的信息
有效位(0/1)+标记+整块数据
其中“标记"用于指明对应的内存块,不同映射方式,“标记"的位数不同
全相联映射
主存块可以放在Cache的任意位置
主存地址结构:标记(整个主存块号)+块内地址
优点:Cache存储空间利用充分,命中率高
直接映射
每个主存块只能放到一个特定的位置:Cahce块号=主存块号%Cache总块数
主存地址结构:标记(主存块号前几位)+行号(主存块号末几位)+块内地址
优点:对于任意一个地址,只需对比一个“标记”,速度最快
若Cache总块数=2,则主存块号末尾n位直接反映它在Cache中的位置
组相联映射
Cache块分为若干组,每个主存块可放到特定分组中的任意一个位置,组号=主存块号%分组数
主存地址结构:标记(主存块号前几位)+组号(主存块号末几位)+块内地址
优点:另外两种方式的折中,综合效果最好
n路组相联映射——n个Cache行为一组
Cache替换
替换情况
全相联映射
Cache完全满了才需要替换,需要在全局选择替换那一块
直接映射
如果对应位置非空,则毫无选择地直接替换
组相联映射
分组内满了才需要替换,需要在分组内选择替换哪一块
Cache替换算法
抖动现象:频繁的换入换出现象(刚被替换的块很快又被调入)
随机算法(RAND)
若Cache已满,则随机选择一块替换
实现简单,但完全没考虑局部性原理,命中率低,实际效果很不稳定
先进先出算法(FIFO)
若Cache已满,则替换最先被调入Cache的块
实现简单,最开始按照#0#1#2#3放入Cache,之后轮流替换#0#1#2#3
FIFO依然没考虑局部性原理,最先被调入Cache的块也可能是被频繁访问的
近期最少使用(LRU)
为每一个Cache块设置一个“计数器”,用于记录每个Cache块已经有多久没有被访问了。当Cache满后替换“计数器”最大的
计数器变化逻辑
命中时,所命中的行的计数器清零,比其低的计数器加1,其余不变
未命中且还有空闲行时,新装入的行的计数器设为0,其余非空闲行全加1
未命中且无空闲行时,计数值最大的行的信息块被淘汰,新装行的块的计数器置0,其余全加1
LRU基于“局部性原理”,近期被访问过的主存块,在不久的将来也很有可能被再次访问,因此淘汰最久没被访问过的块是合理的。
若被频繁访问的主存块数量>Cache行的数量,则有可能发生“抖动”
最近不经常使用(LFU)
为每一个Cache块设置一个“计数器”,用于记录每个Cache块被访问过几次。当Cache满后替换“计数器”最小的
新调入的块计数器=0,之后每访问一次计数器+1.需要替换时,选择计数器最小的那行
若有多个计数器最小的行,可按行号递增或FIFO策略进行选择
曾经被经常访问的主存块在未来不一定会用到,并没有很好的遵循局部性原理,因此实际运行效果不如LRU
Cache写策略
写命中
全写法
当CPU对Cache写命中时,必须把数据同时写入Cache和主存,一般使用写缓冲
“写缓冲”:SRAM实现的FIFO队列
访存次数增加,速度变慢,但更能保证数据一致性
使用写缓冲,CPU写的速度很快,若写操作不频繁,则效果很好。若写操作很频繁,可能会因为写缓冲饱和而发生阻塞
写回法
当CPU对Cache写命中时,只修改Cache的内容,而不立即写入主存,只有当此块被换出时才写回主存
减少了访存次数,但存在数据不一致的隐患
写不命中
写分配法
当CPU对Cache写不命中时,把主存中的块调入Cache,在Cache中修改,搭配写回法使用
非写分配法
当CPU对Cache写不命中时只写入主存,不调入Cache,搭配全写法使用
多级Cache
现代计算机常采用多级Cache
离CPU越近的速度越快,容量越小
离CPU越远的速度越快,容量越大
各级Cache间常采用“全写法+非写分配法”
Cache和主存之间常采用“写回法+写分配法”