计算机组成原理笔记3-存储系统
概念
存储器的层次化结构
概念结构
Cache-主存层次:硬件实现,解决速度不匹配问题。
主存-辅存层次:硬件+操作系统实现,解决容量问题,逐渐形成虚拟存储系统。
存储器分类
作用(层次)
- 主存储器(主存、内存):使用DRAM和ROM
- 高速缓冲存储器(Cache):使用SRAM
- 辅助存储器(辅存、外存)
存储介质
- 磁芯存储器
- 磁表面存储器:磁盘、磁带
- 半导体存储器
- 光存储器
存取方式
-
随机存取:RAM(DRAM、SRAM),ROM
任何一个存储所需时间都相同,与存储单元所在的物理位置无关
-
串行访问:顺序存取(磁带)、直接存取(磁盘)
读写某个存储单元所需时间与存储单元的物理位置有关
-
按内容访问:相联存储器(CAM)
可以按照内容检索到存储位置进行读写,"快表"就是一种相联存储器
信息可保存性
- 断电后存储信息是否消失:易失性(RAM)、非易失性(磁盘,光盘)
- 读出是否破坏信息:破坏性读出(DRAM)、非破坏性读出(SRAM,磁盘,光盘)
性能指标
-
存储容量:存储字数\(\times\)字长(如1M$\times$8位)
-
单位成本:每位价格=总成本/总容量
-
存储速度:数据传输率=数据的宽度(存储字长)/存储周期
- 存取时间(\(T_a\)):存取时间是指从启动一次存储器操作到完成该操作所经历的时间,分为读出时间和写入时间。
- 存取周期(\(T_m\)):存取周期又称为读写周期或访问周期。它是指存储器进行一次完整的读写操作所需的全部时间,即连续两次独立地访问存储器操作(读或写操作)之间所需的最小时间间隔。
- 主存带宽(\(B_m\)):主存带宽又称数据传输率,表示每秒从主存进出信息的最大数量,单位为字/秒,字节/秒(B/s)或位/秒(b/s)。
存储器芯片的基本结构
片选线:高电平有效,当输入信号为高电平时,整个芯片工作,反之则不工作。(高电平有效)
读/写控制线:控制存储器当前操作是读还是写。
地址线、数据线:共同决定存储器的容量。
- 地址线:用来接收外部单元传输到存储器的地址信号,决定的是要进行操作的存储单元在存储矩阵的位置。
- 数据线:用来传输到外部单元的要进行读/写的数据。
容量:
n位地址-> \(2^n\)个存储单元
\(总容量=存储单元个数 \times 存储字长=2^3 \times 8bit=2^3 \times 1Byte=8B\)
\(8 \times 8\) 位的存储芯片:
常用的描述:
- \(8K \times 8\)位,即\(2^{13} \times 8 bit\) ,8KB
- \(8K \times 1\)位,即\(2^{13} \times 1 bit\) ,8Kb=1KB
- \(64K \times 16\)位,即\(2^{16} \times 16 bit\)
寻址
设存储矩阵为4列,总容量为1Kb,即有字长为4B,
按字节寻址:1K个单元,每个单元1B
按字寻址:256个单元,每个单元4B
按半字寻址:512个单元,每个单元2B
按双字寻址:128个单元,每个单元8B
多字节存放:有大端方式与小端方式
半导体存储器
基本结构
-
存储矩阵:由大量相同的为存储单元阵列构成。
-
译码驱动:将来自地址总线的地址信号翻译成对应存储单元的选通信号,该信号在读写电路的配合下完成对被选中单元的读/写操作。
-
读写电路:包括读出放大器和写入电路,用来完成读/写操作。
-
读/写控制线:决定芯片进行读/写操作。
-
片选线:确定哪个存储芯片被选中。可用于容量扩充。
-
地址线:是单向输入的,其位数与存储字的个数有关。
-
数据线:是双向的,其位数与读出或写入的数据位数有关。
-
数据线数和地址线数共同反映存储芯片容量的大小。
如地址线10根,数据线8根,则芯片容量=\(2^{10} \times 8=8K\)位。
半导体随机存取存储器
SRAM(Static Random Access Memort):静态随机存储器
DRAM(Dynamic Random Access Memort):动态随机存储器
都以电信号的形式存储0/1->断电就丢失信息:易失性存储器
特点类型 | SRAM | DRAM |
存储信息 | 双稳态触发器 | 栅极电容 |
破坏性读出 | 非 | 是 |
需要刷新 | 不要 | 需要 |
送行列地址 | 同时送 | 分两次送 |
运行速度 | 快 | 慢 |
集成度 | 低 | 高 |
发热量 | 大 | 小 |
存储成本 | 高 | 低 |
需要"刷新" | 不需要 | 需要 |
送行列地址 | 同时送 | 分两次送 |
常用作 | Cache | 主存 |
现在主存使用SDRAM:同步动态随机存储器
DRAM的刷新
刷新周期:一般为2ms
以行为单位,每次刷新一行存储单元
用行列地址以减少选通线的数量
刷新:由硬件支持,读出一行的信息后重新写入,占用一个读/写周期
刷新思路:
-
分散刷新:每次读写完都刷新一行
-
集中刷新:2ms内集中安排时间全部刷新
有一段时间专门用于刷新,无法访问存储器,称为访存"死区"。
-
异步刷新:2ms内每行刷新一次即可
每隔一段时间有一段很短的"死时间"。
DRAM的地址线复用技术
ROM:Read-Only Memory
特点:结构简单,位密度比RAM高;非易失性,可考性高
- 掩膜式只读存储器(MROM):存储内容由半导体制造厂按用户提出的要求在芯片的生产过程中直接写入,无法修改。
- 一次可编程只读存储器(PROM):存储内容由用户用专门的设备(编程器)一次性写入,之后无法修改。
- 可擦除可编程只读存储器(EPROM):修改次数有限,写入时间很长。可进行多次重写
- 紫外线擦除(UVEPROM):擦除所有信息
- 电擦除(EEPROM):擦除特定的字
- 闪速存储器(Flash Memory):如U盘,写入速度较快。可进行多次快速擦除重写,“写”的速度要比‘读”速度更慢
- 固态硬盘(Solid State Drives):控制单元+FLASH芯片。可进行多次快速擦除重写
计算机内的重要ROM
主存与CPU的连接
单块存储芯片与CPU连接
现在的计算机:
主存容量扩展
位扩展
8片\(8k\times 1\)位的存储芯片->1片\(8k\times 8\)位的存储芯片,容量8KB
字扩展
线选法 | 译码片选法 |
---|---|
n条线->n个选片信号 | n条线->\(2^n\)个选片信号 |
电路简单 | 电路复杂 |
地址空间不连续 | 地址控制可连续,可以增加逻辑设计 |
线选法:
加个非门:
译码片选法:
字位同时扩展
连接
系统程序区用ROM,用户程序区用RAM。
双口RAM多模块存储器
存取周期
双端口RAM
两个端口对同一主存操作有以下4钟情况:
- 两个端口不同时对同一地址单元存取数据。
- 两个端口同时对同一地址单元读出数据。
- 两个端口同时对同一地址单元写入数据。
- 两个端口同时对同一地址单元,一个写入数据,另一个读出数据。
可以看出第一、二种是不会发生错误的,而第三种会发生写入错误以及第四种会发生读出错误。
解决方法:置"忙"信号为0,有判断逻辑决定暂时关闭一个端口(即被延时),未被关闭的端口正常范围,被关闭的端口延长一个很短的时间段后再访问。
多模块存储器
普通存储器:每行为1个存储单元
单体多字存储器
每个存储单元存储m个字;总线宽度也为m个字;一次并行读出m个字。
指令和数据在主存内中必须是连续存放的。
多体并行存储
每个模块都有相同的容量和存取速度。
各模块都有独立的读写控制电路、地址寄存器和数据寄存器。
它们既能并行工作,又能交叉工作。
高位交叉编址多体存储器:
连续取n个存储字->耗时nT
低位交叉编址多体存储器:
连续取n个存储字->耗时\(T+(n-1) \tau\)
流水线
微观(计算题)
模块数m=4,存储周期为T,字长W,数据总线宽度为m,总线传输周期为r,连续存取n个字,求交叉存储器的带宽。
连续存器n个字耗时=\(T+(n-1)r\ \ m \ge T/r\)
带宽=\(n \times W/(T+(n-1)r)\)
n较大时,宽度->\(W/r\) 相当于m个存储体并行工作
对比单个存储体的带宽:\(W/T\)
宏观(概念题)
一个存储周期内,交叉存储器可以提供的数据量为单个模块的m倍。
存储周期T,存取时间(/总线传输周期)为r,为了使流水线不间断,应保证模块数\(m\ge T/r\)
Cache(高速缓冲存储器)
局部性原理
空间局部性:在最近的未来要用到的信息(指令和数据),很可能与现在正在使用的信息在存储空间上是邻近的。
时间局部性:在最近的未来要用到的信息,很可能是现在正在使用的信息。
性能分析
命中率H:CPU欲访问的信息已在Cache中的比率。
设一个程序执行期间,Cache的总命中次数为\(N_c\),访问主存的总次数为\(N_m\),则\(H=N_c/(N_c+N_m)\)。
缺失率M:\(M=1-H\)
设\(t_c\)为命中时的Cache访问时间,\(t_m\)为未命中时的访问时间
Cache-主存系统的平均访问时间\(T_a\)为\(T_a=Ht_c+(1-H)t_m\)
\(系统的效率=Cache访问时间/平均访问时间\)
题目:访问策略不同
地址映射方式
主存与Cache之间以“块”为单位进行数据交换
每次被访问的主存块,一定会被立即调入Cache
Cache中存储的内容:标记项+数据
标记项:主存子块标记、有效位...
Cache与主存地址映射方式有:
-
空位随意放:全相联映射
主存子块标记 子块内地址 -
对号入座:直接映射
主存子块标记 Cache子块地址 子块内地址 -
按号分组,组内随意放:组相联映射
主存子块标记 组地址 子块内地址
替换算法与写策略
相联存储器:并行比较标记,若有标记与当前将要访问的地址的标记相同,且有效位为1,则命中。
注:相联存储是是一种不根据地址而是根据存储内容来进行存取的存储器。
替换算法
-
随机算法(RAND):随机地确认替换的Cache块。它的实现比较简单,但没有依据程序访问的局部性原理,故可能命中率较低。
-
先进先出算法(FIFO):选择最早调入的行进行替换。它比较容易实现,但也没有依据程序访问的局部性原理,可能会把一些需要经常使用的程序块(如循环系统)也作为最早进入Cache的块替换掉。
-
近期最少使用算法(LRU):依据程序访问的局部性原理选择近期内长久未访问过的存储行作为替换的行,平均命中率要比FIFO要高,是堆栈类算法。LRU算法对每行设置一个计数器,Cache每命中一个,命中行计数器请0,而其他各行计数器均加1,需要替换时比较各特定行的计数值,将计数值最大的行换出。
若被频繁访问的主存块数量>Cache行的数量,则有可能发生“抖动”
计算机实现:
-
最不经常使用算法(LFU):将一段时间内被访问次数最少的存储行换出。每行也设置一个计数器,新行建立后从0开始计数,每访问一次,被访问的行计数器加1,需要替换时比较各特定行的计数值,将计数值最小的行换出。
写策略
命中:
-
写回法(write-back):当CPU对Cache写命中时,只修改Cache的内容,而不立即写入主存,只有当此块被换出时才写回主存。
减少了访存次数,存在数据不一致的隐患
-
全写法(写直通法,write-through):当CPU对Cache写命中时,必须把数据同时写入Cache和主存,一般使用写缓冲(write buffer)。
访存次数增加,速度变慢,但更能保证数据一致性。
未命中:
- 写分配法(write-allocate):把主存中的块调入Cache,在Cache中修改。搭配写回法使用。
- 非写分配法(not-write-allocate):只写入主存,不调入Cache。搭配全写法使用
多级Cache
虚拟存储器
虚拟存储器是一个逻辑模型。
功能:用户给出一个地址,叫做虚地址或逻辑地址,虚拟存储器要给出该地址对应的数据。
实现:有辅助硬件将虚地址映射到主存当中的某个单元,主存单元地址称为实地址或物理地址。
[注]:逻辑地址(虚地址):程序员视角看到的地址;物理地址(实地址):实际在主存的地址
页式虚拟存储器
虚拟地址与主存地址都被划分成同样大小的页,主存的页称为实页,虚存的页称为虚页。
虚存地址:
虚页号 | 页内地址 |
---|
主存地址:
实页号 | 页内地址 |
---|
页内地址可以直接贴过去,而需要对虚页号转换为实页号。
页表:
..... | 1 |
---|
1称为装入位,表示所指向的地址是放在主存当中。否则是放在辅存当中。
硬件有一个页表基址寄存器,它会提供一个页表起始地址;页表起始地址和虚页号共同组成一个页表项地址。
页表起始地址 | 页内地址 |
---|
对应可得到虚页号对应的实页号。实页号+页内地址便可得到主存地址。
段式虚拟存储器
段式虚拟存储器中的段是按程序的逻辑结构划分的,各个段的长度因程序而异。
虚拟地址分为两个部分:段号和段内地址。
段表:每一行记录了与某个段对应的段号、装入位、段起点和段长度等信息。由段的长度可变,所以段表中要给出各段的起始地址与段的长度。
段页式虚拟存储器
把程序按逻辑结构分段,每端再划分位固定大小的页,主存空间页划分为大小相等的页,程序对主存的调入、调出仍以页为基本传送单位。每个程序对应一个段表,每段对应一个页表。
虚拟地址:段号+段内页号+页内地址
快表TLB
页表、段表存放在主存中,收到虚拟地址后要先访问主存,查询页表、段表,进行虚实地址转换。放在主存中的页表称为慢表(Page)。
提高变换速度->用高速缓冲存储器存放常用的页表项->快表(TLb)
快表是一种“相联存储器”,可以按内容寻访
访问过程: