一、存储系统的概述
1、现代计算机结构
2、存储器层次结构
- cpu
- 寄存器
- Cache高速缓存存储器
- 主存(内存)
- 辅存(磁盘)
- 外存(U盘、磁带、光盘)
主存<-->辅存:实现虚拟存储系统,解决了主存容量不够的问题
Cache<-->主存:解决了主存与CPU速度不匹配的问题
3、存储器的分类
1)层次
- CPU直接使用:Cache、主存
- CPU间接使用:辅存
2)存储介质
- 半导体:主存、Cache
- 磁性材料:硬盘
- 光介质:光盘
3)存取方式
- 随机存取存储器(RAM):读写时间与位置无关
- 串行访问存储器:读写时间取决于位置
- 顺序存取存储器(SAM):读写时间取决于位置
- 直接存取存储器(DAM):先直接选取再顺序存取
- 相连存储器(CAM):根据内容找到存储位置(快表)
4)信息的可更改性
- 读写存储器:可读可写
- 只读存储器(ROM):可读(CD、BIOS)
5)信息的可保存性
断电
- 易失性存储器:主存、Cache
- 非易失性存储器:磁盘、光盘
信息读出
- 破坏性读出:DRAM芯片
- 非破坏性读出:SRAM、光盘
4、存储器的性能指标
存储容量 = 存储字数 x 字长(1M x 8位)
单位成本:每个比特的价格 = 总成品 / 总容量
存储速度:数据传输率 = 数据宽度 / 存储周期
主存带宽(Bm):又称为数据传输率,表示主存进出信息的最大数量
二、主存储器的基本组成
1、半导体元件的原理
MAR:地址寄存器
MDR:数据寄存器
存储元 = 电容(存储器) + MOS管(开关)
MOS管可理解为一种电控开关,输入电压达到某个阈值时,MOS管就可以接通
2、存储芯片的基本原理
总容量 = 存储单元个数 * 存储字长
例:8K × 8位,即$2^{13}*8bit$。地址线13根,数据线8根
三、SRAM和DRAM
1、SRAM和DRAM概述
Dynamic Random Access Memory:动态RAM
Static Random Access Memory:静态RAM
类型特点 | SRAM(静态RAM) | DRAM(动态RAM) |
---|---|---|
存储信息 | 触发器 | 电容 |
破坏性读出 | 非 | 是 |
读出后需要重写?(再生) | 不用 | 需要 |
运行速度 | 快 | 慢 |
集成度 | 低 | 高 |
发热量 | 大 | 小 |
存储成本 | 高 | 低 |
易失/非易失性存储器? | 易失(断电后信息消失) | 易失(断电后信息消失) |
需要"刷新"? | 不需要 | 需要 |
送行列地址 | 同时送 | 分两次送(地址线复用技术) |
用途 | Cache | 主存 |
2、特性差异
DRAM芯片,使用栅极电容存储信息
SRAM芯片:使用双稳态触发器存储信息
核心区别:存储元不同
1)DRAM
读出1:MOS管接通,电容放电,数据线产生电流
读出0:MOS管接通,数据线无电流
每个存储元制造成本更低,集成度高,功耗低
电容放电信息被破坏,是破坏性读出
读出后应有重写操作,也称"再生"
2)SRAM
双稳态触发器:6个mos管组成
读出1:A高B低
读出0:A低B高
每个存储元制造成本更高,集成度低,功耗大
读出数据,触发器状态保持稳定,是非破坏性读出,无需重写
3、DRAM的刷新
1)存储器特性差异
电容:电容内的电荷只能维持2ms。即便不断电,2ms后信息也会消失 => 2ms之内必须"刷新"一次
双稳态触发器:只要不断电,触发器的状态就不会改变
2)DRAM刷新方式
拆分为行列刷新(扫描):$2^{n}$ => $2^{n/2}+2^{n/2}$ 节约地址线
- 分散刷新:每次读写完都刷新一行 => 浪费时间
- 集中刷新:2ms内集中刷新 => 造成访问死区
- 异步刷新:2ms内每行刷新1次即可 => 找cpu空闲时间刷新
4、DRAM地址线复用技术
行、列地址分两次送,可使地址线更少,需要的芯片引脚减半
$2^{n/2}+2^{n/2}$ => $2^{n/2}$
5、SDRAM
SDRAM 同步动态随机存取内存
四、只读存储器ROM
1、RAM和ROM区别
RAM:易失性,断电后数据消失
ROM:非易失性,断电后数据不会丢失
2、ROM分类
1)MROM
MROM(Mask Read-Only Memory):掩模式只读存储器
厂家按照客户需求,在芯片生产过程中直接写入信息,之后任何人不可重写(只能读出)
可靠性高、灵活性差、生产周期长、只适合批量定制
2)PROM
PROM(Programmable Read-Only Memory):可编程只读存储器
用户可用专门的PROM写入器写入信息,写一次之后就不可更改
3)EPROM
EPROM(Erasable Programmable Read-Only Memory):可擦除可编程只读存储器
允许用户写入信息,之后用某种方法擦除数据,可进行多次重写
- UVEPROM(ultraviolet rays):一用紫外线照射8~20分钟,擦除所有信息
- EEPROM(也常记为EPROM,第一个E是Electrically):可用"电擦除"的方式,擦除特定的字
4)Flash Memory
Flash Memory:闪速存储器(U盘、SD卡)
每个存储元只需单个MOS管,位密度比RAM高
在EEPROM 基础上发展而来,断电后也能保存信息,且可进行多次快速擦除重写
注意:由于闪存需要先擦除在写入,因此闪存的"写"速度要比"读"速度更慢
5)SSD
SSD (Solid State Drives):固态硬盘
由控制单元+存储单元 (Flash 芯片)构成,与闪速存储器的核心区别在于控制单元不一样,但
存储介质都类似,可进行多次快速擦除重写
SSD速度快、功耗低、价格高。目前个人电脑上常用SSD取代传统的机械硬盘
五、主存与CPU的连接
$A_1$ - $A_7$:地址线
$D_1$ - $D_7$:数据线
$\overline{\text{CS}}$ $ \overline{\text{CE}}$:片选线
$\overline{\text{WE}}$ $ \overline{\text{WR}}$:读写控制线
1、位扩展法
2、字扩展法
1)线选法
线选法:$A{14}$ $A{13}$只能为01或10
n条线 => n个选片信号
2)译码片选法
译码片选法:n条线 => 2n个选片信号
3)小总结
线选法 | 译码片选法 |
---|---|
n条线 => n个选片信号 | n条线 => $2^n$个选片信号 |
电路简单 | 电路复杂 |
地址空间不连续 | 地址空间可连续 |
3、字位扩展法
4、译码器
138译码器
- G1、G2A、G2B:使能端,G2A、G2B低电平有效,G1高电平有效
- A、B、C:译码输入端,高电平有效
- Y0 - Y7:译码输出端,低电平有效
五、双端口RAM和多模块存储器
1、存取周期
存取周期:可以连续读写的最短时间间隔
DRAM芯片的恢复时间比较长,有可能是存取时间的几倍(SRAM的恢复时间较短)
2、双端口RAM
作用:优化多核CPU访问一根内存条的速度
需要有两组完全独立的数据线、地址线、控制线。CPU、RAM中也要有更复杂的控制电路
两个端口对同一主存操作有以下4种情况:
- 两个端口同时对不同的地址单元存取数据 => 正常操作
- 两个端口同时对同一地址单元读出数据 => 正常操作
- 两个端口同时对同一地址单元写入数据 => 写入错误
- 两个端口同时对同一地址单元,一个写入数据,另一个读出数据 => 读出错误
解决:置"忙"信号为0,由判断逻辑决定暂时关闭一端口(即被延时),未被关闭的端口正常访问,被关闭的端口延长一个很短的时间段后再访问。
3、多模块存储器
1)单体多字存储器
数据连续存放,每次读出一行
每个存储单元存储m个字、总线宽度也为m个字、一次并行读出m个字
每次只能同时取m个字,不能单独取其中某个字 => 指令和数据在主存内必须是连续存放的
2)多体并行存储器
每个存储周期内可读写地址连续的m个字。采用"流水线"的方式并行存取(宏观上并行,微观上串行)
微观上,m个模块被串行访问;宏观上,每个存取周期内所有模块被并行访问
- 存取周期为T,存取时间为r,为了使流水线不间断,应保证模块数 $m≥T/r$
- 存取周期为T,总线传输周期为r,为了使流水线不间断,应保证模块数 $m≥T/r$
六、Cache
1、概述
1)局部性原理
空间局部性:在最近的末来要用到的信息(指令和数据),很可能与现在正在使用的信息在存储空间上是邻近的
时间局部性:在最近的未来要用到的信息,很可能是现在正在使用的信息
基于局部性原理,不难想到以把CPU目前访问的地址周围的部分数据放到Cache中
2)性能
设$t_c$为访问一次Cache所需时间,$t_m$为访问一次主存所需时间
命中率$H$:CPU欲访问的信息己在Cache中的比率
缺失(未命中)率:$M=1-H$
平均访问时间:
- 先访问Cache, 若Cache未命中再访问主存:$t=Ht_c+(1-H)(t_c+t_m)$
- 同时访问 Cache和主存,若Cache命中则立即停止访问主存:$t=Ht_c+(1-H)t_m$
3)界定周围
基于局部性原理,可以把CPU目前访问的地址"周围"的部分数据放到Cache中 => 界定周围
将主存的存储空间分块,主存与Cache之间以“块”为单位进行数据交换
主存的“块”又叫“页/页框/页面”;Cache 的“块”又叫“行”
主存地址可拆分为(主存块号,块内地址)的形式
每次被访问(读取)的主存块,一定会被立即调入Cache
2、Cache-主存的映射方式
0)总览
全相联映射:主存块可以放在Cache的任意位置
直接映射:每个主存块只能放到一个特定的位置
Cache块号=主存块号 % Cache总块数
组相联映射:Cache块分为若干组,每个主存块可放到特定分组中的任意一个位置
组号 = 主存块号 % 分组数
1)全相联映射
访问过程
2)直接映射
1、标记优化
2、访问过程
3)组相联映射
二路组相联映射:两块为一组,分四组
n路组相联映射:每n个Cache行为一组
1、标记优化
2、访问过程
3、替换算法
0)概述
组相联映射:Cache完全满了才需要替换,需要在全局选择替换哪一块
直接映射:如果对应位置非空,则直接替换
组相联映射:分组内满了才需要替换,需要在分组内选择替换哪一块
组相联映射、组相联映射需要用到替换算法
1)随机算法(RAND)
随机算法(RAND,Random):若Cache已满,则随机选择一块替换
实现简单,但完全没考虑局部性原理,命中率低,实际效果很不稳定
2)先进先出算法(FIFO)
先进先出算法(FIFO, First In First Out):若Cache己满,则替换最先被调入Cache的块
实现简单,FIFO没考虑局部性原理,最先被调入Cache的块也有可能是被频繁访问的
抖动现象:频繁的换入换出象(刚被替换的块很快又被调入)
3)近期最少使用算法(LRU)
近期最少使用算法(LRU, Least Recentlv Used):为每一个Cache块设置一个“计数器”,用于记录每个Cache块己经有多久没被访问了,当Cache满后替换计数最大的
- 命中时,所命中的行的计数器清零,比其低的计数器加1,其余不变
- 未命中且还有空闲行时,新装入的行的计数器置0,其余非空闲行全加1
- 未命中且无空闲行时,计数值最大的行的信息块被淘汰,新装行的块的计数器置0,其余全加1
基于局部性原理,近期被访问过的主存块,在不久的将来也很有可能被再次访问,因此淘汰最久没被访问过的块是合理的。LRU算法的实际运行效果优秀,cache命中率高。
若被频繁访问的主存块数量 > cache行的数量,则有可能发生"抖动"。曾经被经常访问的主存块在未来不一定会用到
4)最近不经常使用(LFU)
最不经常使用算法(LFU, Least Frequently Used):为每一个Cache块设置一个"计数器",用于记录每个Cache块被访问过几次,当Cache满后替换"计数器"最小的。
新调入的块计数器 = 0,之后每被访问一次计数器 + 1。需要替换时,选择计数器最小的一行。若有名个计数器最小的行,可按行号递增或FIFO策略进行选择
曾经被经常访问的主存块在未来不一定会用到,并没有很好地遵循局部性原理,因此实际运行效果不如LRU
4、Cache写策略
1)写命中
1. 全写法
全写法(写直通法):当CPU对Cache写命中时,必须把数据同时写入Cache和主存,一般使用写缓冲
使用写缓冲,CPU写的速度很快,若写操作不频繁,则效果很好。若写操作很频繁,可能会因为写饱和而发生阻塞
2. 写回法
写回法:当CPU对Cache写命中时,只修改Cache的内容,而不立即写入主存,只有当此块被换出时才写回主存
脏位:表示是否被修改过
减少了访存次数,但存在数据不一致的隐患
2)写不命中
1. 写分配法
写分配法:当CPU对Cache写不命中时,把主存中的块调入Cache,在Cache中修改。通常搭配写回法使用。
2. 非写分配法
非写分配法- 当CPU对Cache写不命中时只写入主存,不调入Cache。搭配全写法使用。
3)多级Cache
现代计算机通常采用多级Cache结构
各级Cache 间常采用"全写法+非写分配法",Cache和主存间常采用"写回法+写分配法"
七、页式存储器
1、页式存储器概述
页式存储系统:一个程序(进程)在逻辑上被分为若干个大小相等的"页面","页面"大小与"块"的大不相同。每个页面可以离散地放入不同的主存块中。
2、实地址与虚地址
逻辑地址(虚地址):程序员视角看到的地址
物理地址(实地址):实际在主存中的地址
逻辑地址 = 逻辑页号 + 页内地址
物理地址 = 主存页号 + 页内地址
3、页表
页表:逻辑页号 => 主存块号
CPU执行的机器指令中,使用的是"逻辑地址",因此需要通"页表"将逻辑地址转为物理地址。
页表的作用:记录了每个逻辑页面存放在哪个主存块中
4、地址转换过程
页表基地址:指明了页表在主存中的存放地址
- 将逻辑地址拆分为:逻辑页号 + 页内地址
- 查询页表,找到逻辑页面存放的主存块
- 用主存块号拼接页内地址得到最终的地址
5、快表TLB
快表TLB是一种相联存储器,可以按内容寻访
快表中存储的是页表项的副本,Cache中存储的是主存块的副本
八、虚拟存储器
1、页式虚拟存储器
访问位(引用位):用于页面替换算法
有效位:数据是否调入内存
外存块号:外存页表的块号
脏位:数据是否被更改
2、段式虚拟存储器
3、段页式虚拟存储器
把程序按逻辑结构分段,每段再划分为固定大小的页,主存空间也划分为大小相等的页。程序对主存的调入、调出仍以页为基本传送单位。
每个程序对应一个段表,每段对应一个页表。
虚拟地址 = 段号 + 段内页号 + 页内地址