871王道 - 计算机组成原理 - 学习笔记 ——第3章 存储系统
1.存储器的基本概念
1.1.存储器的分类
1.1.1.按作用分类(层次结构)
1)主存储器:容量小、存取速度较快,每位价格较高
2)辅存储器:容量大、存取速度较慢,单位成本低
3)cache:容量小、存取速度很快,价格高
1
(默写图)多级存储器结构 - 下
(默写图) 三级存系统的层次结构及其构成 - 上
三层存储系统:
- 高速缓冲存储器(Cache):可直接被CPU读写
- 主存储器(主存):内存,可直接被CPU读写
- 辅助存储器(辅存):外存
存储器层次结构的重要思想: 上一层的存储器作为第一层存储器的高速缓存。
ps. 上一层中的内容都只是下一层中的内容的副本,例如 Cache中的内容只是主存中的内容的一部分、主存中的内容只是辅存中的内容的一部分。
层次结构主要体现:
1. cache——主存层次:
①解决主存和CPU速度不匹配的问题。
②cache和主存的数据交换:由硬件自动完成,对所有程序员透明。
2. 主存——辅存层次:
①解决主存容量不够的问题,实现虚拟存储。
②主存和辅存的数据交换:由硬件+操作系统共同完成,对应用程序员透明(因为是硬件工程师完成的)。
③辅存中的数据只有调入主存后才能被CPU访问。
分层的目的: 解决速度、容量、成本三者之间的矛盾。
1.1.2.按存取方式分类
-
随机存储器(RAM):Random,Random Access Memory,“随机存储”:CPU对存储器的任何一个存储单位中的内容随机存取,且存取时间和存储单元的物理位置无关。
RAM的全名为随机存取记忆体,中文名是易失性存储器,作用是临时存储介质。
RAM都是易失性存储器吗?
4个特点:
1)支持读/写操作
2)随机抽取(最重要的特性),存取时间与物理位置无关
3)主存/cache使用该存储器RAM
cache:SRAM,主存:DRAM
4)易失:指的是断电后存储的信息会消失。
分类:
①静态随机存储器(SRAM):
②动态随机存储器(DRAM):
——————啊
————啊
——啊
—啊 突然觉得自己是个RAM,关机(睡一觉)就清零了
-——啊
————啊 如需保存数据,就必须把它们写入到一个长期的存储器中(例如硬盘)
——————啊
- 只读存储器(ROM):只能随机读出(随机存储),不能写入。非易失性存储器,断电不丢失。
5个特点:
1)只支持随机读出,而不支持写入
2)一旦写入就固定不变
3)可与RAM共同作为主存的一部分,统一构成主存的地址域
4)常用于存放固定不变的程序(常数和汉字字库)
5)非易失性
ROM和RAM都是随机存储器
CD-ROM!=ROM,CD-ROM是串行存储器,不属于只读存储器。
- 串行访问存储器(SAM、DAM):按照物理位置的先后顺序寻址。
1)支持读/写操作
2)需要按照物理地址先后寻址
3)分类:
①顺序存取存储器(SAM):磁带
②直接存取存储器(DAM):光盘、磁盘
注意:光盘(CD-ROM,只读型光盘存储器,不属于只读存储器ROM!) 、磁盘(磁盘上的磁道)
- 相联存储器(CAM):按 内容或地址 进行寻址(按照内容指定方式和地址指定方式 相结合 搜索地址),如 块表。基本原理:将存储单元所存内容的某一部分作为检索项(即关键字项)去检索存储器。
ROM和RAM都是采用随机存取方式(✔)
1.1.3.按信息的可更改性
- 读写存储器(RM):Read/whrite Memory,可读可写(内存、Cache)
- 只读存储器(ROM):Read Only Memory,只能读不能写(BIOS)
1.1.4.按信息的可保存性
-
易失性存储器:断电后,存储信息即消失的存储器。如 RAM。开机时,主存、Cache所用信息从辅存调入。
-
非易失性存储器:断电后信息仍然保存的存储器。如 ROM、磁表面存储器、光存储器
-
破坏性读出:信息读出后,原存储信息被破坏。如 DRAM芯片
-
非破坏性读出:信息读出后,原存储信息不被破坏。如 SRAM芯片、磁盘、光盘。
1.1.5按存储介质分类
- 磁 表面/芯 存储器:磁盘、磁带
- 半导体存储器:MOS、双极存储器
- 光存储器:光盘
1.2.存储器的性能指标
回顾:
- ◉ 存储体 -> n个存储单元 -> m个存储元件 (一个数字0/1)
- 0110…0 这一串二进制代码:存储字
- 这一串二进制代码的位数:存储字长(eg.8位)
公式解读:
存储容量 = 存储字数 x 字长
- 注意断句:存储字 数,存储字の数 = 一个存储体有多少个字 = 存储单元的数量
存储容量 = 存储字数 x 字长
=存储单元数量 x 存储字长【记这个好】
= 如图 :“行数” x “一行有几个”
- 存储容量:存储字数 x 字长(MDR位数)(如1M * 8位)
- 存储速度
①存取时间:启动一次存储器操作到完成该操作的时间。
②存取周期:存储进行连续两次独立的操作所需的最小间隔时间 / 存储器进行一次完整读写所需的全部时间。
③存储器带宽(数据传输率):单位时间内存储器存取的信息量。
= 数据宽度(存储字长,MDR位数) / 存取周期
恢复时间:任何一种存储器读写之后总要一段时间来恢复内部状态,是一个复原时间。
存取周期 != 存取时间
2.主存储器
2.1.主存储器的基本组成
回顾 MDR、MAR:
MAR位数和存储器单元个数对应,MAR10=>2^10个存储单元
模拟:CPU的读写过程
想要从主存中读出一个信息字:
1)CPU把这个字的地址送到“MAR”里
2)通过“地址总线”送到主存
3)CPU发出一个“读”命令
4)主存接到读命令之后,根据“读”命令和“地址”去读出信息
5)读出信息,将信息通过“数据总线”送到“MDR”
6)CPU决定数据的下一步去向……
想要从主存中写出一个信息字:
——写什么?写在哪?
1)CPU把想写入的地址 送到“MAR”,通过“地址总线”送到主存
2)CPU把想写入的信息字的内容 送到“MDR”,通过“数据总线”送到主存
3)CPU发出一个“写”命令
4)主存把对应的东西写在对应的地址里
2.1.1基本半导体元件及原理
译码器驱动:
译码器的作用:把地址总线送来的地址信号 翻译成存储矩阵中对应的存储单元 的选择信号。
地址线:单向输入!m根
数据线:双向输入!n根
◉ 出考题
=> 芯片容量 = 2^(m*n)
读/写控制线:
作用:控制芯片进行读或写操作
特点:共用一根/分用两根
片选线:
作用:选择存储芯片(∵半导体存储器由许多芯片构成)
特点:一根/两根
对高分无要求的同学,↓电路可以不用掌握
- MOS管(作为通电开关):半导体,通过向其输入电压控制其开关。
-
电容(储存电荷,即存储二进制0/1):
存储电压,低电压时为0,高电压时为1当MOS管接通时,电容内的电压通过该电路传出的电压表示二进制的0/1。 -
行单位:多个存储元连接后,可以一次读写多个二进制数据。红线连接MOS管,当给红线电压时,该线所连接的MOS管都会被导通,则电容就会从绿线导出,通过检测绿线就可以知道整行存储元存储的二进制信息。
①存储单元:由一整行存储元构成
②存储体:由多个存储单元构成
③存储字:一次能够读出的二进制
④存储字长:一次能够读出的二进制的位数
2.1.2存储器芯片的基本原理
-
MAR的位数决定存储单元的个数,译码器根据CPU通过地址总线给MAR送来的地址(一个地址对应一条输出线),控制相应地址(存储单元)的字选线(红线)高电平,然后通过数据线(绿线)读出该地址的数据,送入MDR中,最后通过数据总线将数据输出
-
控制电路的作用是只有当前操作的电流稳定时,才进行下一步操作
-
片选线:控制是否对该存储单元进行操作(引脚一根)
读控制线/写控制线:该操作是读数据还是写数据(当读写合并时,引脚1根;分开时,引脚2根) -
总容量 = 存储单元个数 * 存储字长
8K * 8位:存储单元个数为8K个,存储字长为8bit,即 2 ^ 13 * 8 bit
64K * 16位:存储单元个数为64K个,存储字长为16bit,即 2 ^ 16 * 16 bit
2.1.3寻址
1.一行为一个存储字,字长为4B,总容量为1KB,则共有256个字,即256行
2.按字节寻址:一个字节对应一个地址,分为1K个单元,每个单元1B(需要10根地址线)
3.按字寻址:一个字对应一个地址,分为256个单元,每个单元4B
4.按半字寻址:半个字对应一个地址,分为512个单元,每个单元2B
4.按双字寻址:两个字对应一个地址,分为128个单元,每个单元8B
2.2 随机存取存储器:SRAM芯片和DRAM芯片
“存储元”:存放一个二进制位的物理器件。它是存储器最基本的构件。
地址码相同的“存储元” ——> 一个存储单元 ——>存储体
(默写图)SRAM和DRAM各自的特点 对比
相同点: 都是易失性存储器/随机存储,临时存储介质(断电后信息消失=不断电信息就不消失)。
区分:易失性 VS. 破坏性读出
1)
2)破坏性读出:
读电容正负:释放一个试探电路,相当于拿试纸去吸化学试剂,破坏了。静态随机存储器相当于肉眼看正负。
Static,静态
Dynamic,动态
2.2.1 静态随机存储器(SRAM)
-
存储元【核心区别】:双稳态触发器(六晶体管MOS)
所以是非破坏性读出(维持原状,不需要再生/重写)。
-
用于:主存
2.2.1 动态随机存储器(DRAM)
- 存储元:栅极电容(一个MOS管)
由电容实现:通过电容充放电实现0/1状态的写入
破坏性读出,读出后需要再生/重写,所以存取速度慢。
因为只用一个MOS管,所以体积小、复杂度低、集成度高。 - 用于:Cache
- 刷新:
DRAM需要刷新,而SRAM不需要
注意:
①刷新周期2ms
②以行为单位,每次刷新一行存储单元
采用行列地址,可以将选通线的数量减少一半
③刷新不需要CPU参与
三种刷新方式:
①集中刷新:有“死区”(无法访问存储器)。2ms中集中安排时间刷新(128个刷新放一起刷新),
②分散刷新:没!有“死区”
③异步刷新:有“死区”,缩短了“死时间”。2ms中每隔2ms/128次 安排一次刷新。
计算机开机 = BIOS引导程序(固化于ROM中)引导操作系统从:硬盘——>主存(RAM)
计算机的操作系统保存于?硬盘(外存)上。内存储器采用RAM(开机缓存会调用到这里来,eg微信开启的地球界面)和ROM(含开机引导程序)。
对比
SRAM/DRAM由哪些线组成?
DRAM的硬件电路决定了地址按矩阵分布,所以使用地址复用技术。SRAM的硬件电路决定了行列独立的方式。
SRAM={ 地址线,数据线,片选线(1/2),读/写控制线} DRAM={
地址线,数据线,行/列通选线(1/2,一般是2),读/写控制线}
注意:
行/列通选线可以代替片选线。
2.3.只读存储器(ROM)
承上启下:(逻辑上RAM和ROM统一编址)
RAM { SRAM,DRAM }
ROM { … }
2.3.1只读存储器(ROM)的特点
两个显著优点:
- 结构简单
- 非易失性,可靠性高。
ps. ROM为非易失性存储,断电后不会消失(RAM为易失性)
2.3.2 ROM的类型
-
掩模式只读存储器(MROM):任何人不可以改写
-
一次可编程只读存储器(PROM):P-programable,写一次后不可更改
-
可擦除可编程只读存储器( EPROM):E-erasable,支持擦除数据,可进行多次重写。但改写较为繁琐,写入时间过长,且改写次数有限,数度较慢,因此不能作为需要频繁读写的RAM使用(不能作为随机存储器)。
①UVEPROM:光擦除,所有信息
②EEPROM / E²PROM:电擦除,特定字 -
Flash存储器:闪存。可进行多次快速擦除重写,写比读慢(写之前需要擦除),如 U盘、手机辅存。
-
固态硬盘(SSD):可进行多次快速擦除重写
2.3.3计算机内的重要ROM
主存中,逻辑上 RAM和ROM 统一编址。
2.3.4本节小结
算一些芯片引脚的个数🐛
公式 —— 引脚 = 数据引脚+地址引脚+读/写控制线引脚(1/2)+片选线(1)or行/列通选控制线(2)
.
注意多多版——引脚 = 数据引脚+地址引脚(注意要不要减半 DRAM)+读/写控制线引脚(一般2,1或2根,具体看题目和选项,灵活变通)+片选线(SRAM 1根)or行/列通选控制线(DRAM 2根)
.
注释:
1、数据引脚:几位,就是几根数据线。几位,即每个存储单元字长。例如 8k x 8位,8位表示存储字长是8bit,即1B(一个字节)。
2、地址引脚:n位地址~2^n个存储单元,总容量=存储单元个数 x 存储字长,8个比特1个字节。存储字长一般为1B(一个字节)/一般以字节为单位存取。n=log₂(存储单元个数)
常见描述:8k x 8位,8k是存储单元个数,n=log₂(8k)算出13位地址,K= 2^10,M= 2 ^20。
其他可能的描述:8192 x 8192 x 8位的DRAM芯片(行-列-bit)
注意:RAM(地址复用技术)分两次传地址信号的策略,所以地址数/2;而ROM不用。
3、读/写控制线引脚:一般2根,也可以共用一根,所以1或2根具体看题目和选项,灵活变通。
4、片选线or行/列通选控制线:因DRAM采用了地址复用技术分两次送行列地址,在DRAM中,如果没有行通选和列通选线就不可能知道传出的信号到底是行数还是列数,所以2根。而SRAM是一次性送的(1根)。
计算:
总容量=存储单元个数 x 存储字长
地址位数:n位地址,n位地址位=log₂(存储单元个数)
换算:
K= 2^10,M= 2 ^20。8个比特1个字节。
2.4 多模块存储器【考试重点】
起因: 哪怕是单核CPU,速度也比内存快,而且内存还要恢复时间。
ps. “双端口RAM”和“多模块存储器” 是两种内存/主存优化技术。(提速)
多模块存储器是一种空间并行技术,利用多个结构完全相同的存储模块的并行工作 来提高存储器的吞吐率。常用的有:单体多字存储器、多体低位交叉存储器。
这个小节我们要解决的两个问题:
——————啊
————啊
——啊
—啊
-——啊
————啊
——————啊
问题①:A:用双端口RAM。
问题②:A:用多模块存储器。
2.4.1单体多字存储器
- 特点:
- 缺点:
使用同一套电路控制(类似位扩展)
2.4.2多体并行存储器
注意区分!{ 存储周期 VS. 存取周期 }
- ⇨ 存储周期:
主体不同:是CPU 。从CPU发出指令给内存时,便会要求内存取用特定地址的数据,内存响应CPU后便会将CPU所需要的数据送给CPU,一直到CPU收到数据为止,便成为一个读取的流程。
存储周期是指CPU连续启动两次操作所需间隔的最小时间,即两次独立的存取操作之间所需的最短时间。 - ** 存取周期 **
主体不同:是存储器,将存储单元与存储寄存器(MDR)之间进行读写。存储器从接收读出命令到被读出信息稳定在MDR的输出端为止的时间间隔。为存储器的性能指标之一。
——————————————
- 访问时间/读写时间:(忙着呢)
存储器进行一次“读”或“写”操作所需的时间称为存储器的访问时间/读写时间。 - ⇨ 存取周期:(歇会,等着呢,等着整点报时)
存储器在一次存取操作后需要一定的恢复时间,每次访问完都得等这个存储体(存取周期)恢复,这个时间是上一次读/写操作到下一次可以读写操作前的周期,含等待内存的恢复时间,主要的部分就是在等待内存恢复。也就是,连续启动两次独立的“读”或“写”操作(如连续的两次“读”操作)所需的最短时间,称为存取周期。存取周期=读写时间+等待内存恢复的时间。
———————————————————————————————————————
编制方式访问顺序:
把这些地址信息翻译为十进制,发现:
①高位交叉编址的地址顺序 = 顺序访问存储模块(M0,M1,M2,M3)
②低位交叉编址的地址顺序 = 交叉方式访问存储模块(M0,M1,M2,M3,->M0,M1,M2,M3,->M0,M1,M2,M3…)
探讨连续访问的情况:
and
高位交叉:花费nT
ps. 访问完都得等 这个存储体(存取周期) 恢复
考察:微观层面的时间开销的计算(例如,T+(n-1)*r)
宏观上:n—>∞
1. 高位交叉编址(顺序方式):
1)编址方式:高位地址表示“体号”,低位地址表示“体内地址”。高2位用来区分访问哪个存储体。连续的地址存放在同一存储块中,访问连续地址时,总是在同一个存储块内访问,当这个存储块的最后一个地址被访问完后,才开始对下一个存储块进行访问,CPU总是按顺序访问存储模块,各模块不能被并行访问。
当存取时间远小于存取周期时,将会严重影响存取效率(对同一存储体进行存取的时,需要等待上一次对当前存储体存取周期结束)。
2)设访问存取周期为T,存取时间为r,则存取n个存储字的时间为nT(每次都需要等待T才能进行下一次存取)。
注意:
- 由于模块内的地址是连续的,虽然有利于扩容,但其存取方式仍是串行存取,各模块不能被并行访问,因此这种存储器仍是顺序存储器,不能提高存储器的吞吐率。
- 而多体低位交叉存储👇是并行系统。
选择题:高位四体交叉存储器可能在一个存储周期内连续访问4个模块(✔)解析:可能的,只是概率比较低。
2. 低位交叉编址(交叉编址方式):
1)编址方式:低位地址表示“体号”,高位地址表示“体内地址”。低2位用来区分访问哪个存储体。连续的地址存放在相邻的存储块中,这样在访问连续地址时,通过可以交替访问不同的存储块提高存储效率(不需要或者降低等待存取周期的时间)。虽然在理想情况下,这种存储器的带宽最高能提高到原来的m倍。增加m的值就能够提高主存储器的带宽。但是,由于存在访问冲突,实际加速比小于m。
- 这种方式相当于对存储单元矩阵按行优先的方式进行编址。
低 - 低位交叉满足程序局部性。其中只有低位交叉存储器是交叉存放,能有效地解决访问冲突问题(准确来说,是不会发生明显的访问冲突),很好地满足了程序的局部性原理。高位多体交叉存储器连续存放不满足程序的局部性原理。
ps. 程序的局部性原理是指程序在执行过程中的一个较短时期内,它所执行的指令和访问的存储空间分别局限在一定的区域内。具体表现在时间局部性和空间局部性。
①时间局部性是指一条指令的一次执行和下一次执行、一个数据的一次访问和下一次访问,都集中在一个较短的时间内。
②空间局部性是指程序执行了某条指令,则它相邻的几条指令也可能马上执行。
2)设访问存取周期为T,存取时间为r,则连续存取n个存储字的时间为 t =(n - 1)r + T【考点】 。
ps. 设模块字长=数据总线宽度
T:模块存取每一个字的存取周期
r:存取时间 / 总线传送周期r
3)交叉存储器:用低位交叉编址(交叉方式)的存储器叫交叉存储器。
N体多模块交叉存储器。
- 用“流水线”的方式并行存取,提高存储器的带宽。
①为什么叫做“流水线”:类似工厂流水线,机器人~=快速的CPU,四个工人比较慢 ~=四个模块,速度就匹配上了。
②保证 流水线不间断,要求 存储器交叉模块数 >= m(交叉存取度):m=T/r
则连续存取n个存储字的时间为 t =T+(n - 1)r
③速度:每个字的读取时间接近r
(最佳m个:少了要等待存储体,多了要等待总线)
解题第一步/切入点👆
A1:低位体号 2进制直接判断 (首选/常用)
A2:10进制地址x %(取余)m
2.4.3本节小结
——————嘿嘿
————嘿
——嘿
—嘿嘿嘿
-——嘿
————嘿
——————嘿嘿嘿不考👇
——————嘿
————嘿
——嘿
如果没疯就是快疯了,完全变态时间到!
现在是活出了"不死就活着,死了就死了的感觉
mua的一章真多啊,王道书内容也多,一天学一周的量anyway(一年前maybe)
整理完网课和书本,还要,做亿点题。。。
ok,把自习室的人都熬走了,啧
Two thousand years ago…
做完题目,整理题目,鸟在叫 天亮了不死是我的福报
活得很好,下次还活。。。纠结要不要睡觉?什么时候睡觉?唉
从1点多一直耳鸣到现在,感觉em一开始还以为是耳机漏电共鸣了,想睡觉纯纯为了缓解耳鸣,要不要吃早饭死死死死
只想说学不完根本学不完,现在的主要矛盾就是“人民美好学的好好的完”与“落后知识生产力”之间的矛盾。
嘟嘟嘟嘟乌鲁乌鲁~楼下开始施工?不可思议的劳动人民!
军训的小朋友们出宿舍门咯!👍🌞
越不睡觉越不想睡觉wwwwww呜呜呜呜呜我
2.4.4 课后例题
3.7.一个类型题
注意:半字存储
解题:32位即32bit/8=>4B,又∵半字存储,=>2B一个word。
容量/单位大小=单位数量。2 ^ 24B / 2B =…
计算在这里插入代码片
:64位即64bit/8=>8B,一个字是有8B的。又∵按字编址,一个地址8B。
容量/单位大小=单位数量。128MB = 2 ^ 27B / 8B = 2 ^ 24个
解题:首先有“B”的肯定是不对的,单位不对。
6.
数据传输率=宽度/周期。
解题:16位即16bit=2B
ns=10^-9
2.5双端口RAM
双端口存储器可以同时访问同一区间、同一单元(✔)
当双端口同时访问同一区间、同一单元 不会发生冲突(✔)
3主存储器与CPU的连接
芯片的基本结构
3.1连接原理
本章需要解决的两个问题:
- 增加主存的存储字长——位拓展
- 增加主存的存储字数——字拓展
.
(默写图)主存储器与CPU的连接
注意:
- 数据总线是双向的,地址总线是单向的
- CPU集成了MAR和MDR
3.2主存容量的扩展
3.2.1位扩展法
数据总线宽度>存储芯片字长
扩展方式:将多个存储芯片的地址段、片选端和读写控制端并联(同时对所有芯片操作),数据段分别引出(数据总线可以把每一个芯片的数据送给CPU)(地址线连接相同,数据线连接不同)
上图中将8个8K * 1位(可以同时读写1位)的存储芯片位扩展为8K * 8位(可以同时读写8位)的存储器,总容量位8KB
3.2.2字扩展法
字扩展将地址线、数据线、读写控制线并联,通过片选线(连接译码器)控制读写哪个存储芯片(地址范围)
图中A0 - A12位低13位的地址(片内地址),A13 - A14通过译码器来控制选择读取哪个芯片(当A13A14 = 00时,译码器输出端0有效,读取芯片0)
此时,A15无论输出什么都无效,只看A0 - A14
芯片1地址:00 0000 000000000 - 00 1111111111111
芯片2地址:01 0000 000000000 - 01 1111111111111
芯片3地址:10 0000 000000000 - 10 1111111111111
芯片4地址:11 0000 000000000 - 11 1111111111111
- 线选法
- 片选法(更优,现实使用)
3.2.3字位扩展法
3.3存储芯片的地址分配和选片
3.3.1线选法
3.3.2片选法
3.4存储器和CPU的连接
D:“写出整个的设计过程,画出图来”
(对三个扩展法的小总结)
红框里考点
4.外部存储器(北科不考)
5.高速缓冲存储器(Cache) 【本章重中之重:大题小题高频考点】
努力提高主存速度,无论怎么提高,相对于CPU速度差距还是很大。假设把DRAM改成SRAM芯片,存储器也会因此价格↑/同等价格容量↓。
5.1 程序访问的局部性原理【常考:简答题:是什么?】
是什么?
-
空间局部性原理:未来使用的信息 可能和 正在使用的信息 很可能再存储空间上是相邻的。
eg.数组元素、顺序执行的代码指令 -
时间局部性原理:未来使用的信息可能和正在使用的信息是相同的。
eg.循环结构的指令代码
如何评判一个程序空间局部性好坏?
——访问顺序和采访顺序 是否一致?
原理的应用?
基于局部性原理, 可以把CPU目前访问的地址的“周围”的部分数据装入Cache中。如何界定“周围”?
结论:
- 程序A 空间局部性比 程序B更好。
- 两个数组的元素都只被访问一次—>时间局部性都很差。
这个程序段 既有时间局部性、又满足空间局部性:
- 循环执行指令:temp = 1 —> 满足时间局部性
- 循序指令、数组:temp* = a[ j ] —> 满足空间局部性
↑意义↓: 局部性原理是设置Cache高速缓冲的理论基础
5.2cache的基本工作原理
我们设置一个Cache这样一个高速缓冲存储器,把主存中部分使用的数据存放在里面。这样就能让CPU的访存操作大部分针对Cache进行,可以提高执行速度。
ps. 用户角度示意图
实现Cache时需要解决以下关键问题:
- 数据查找:如何快速判断数据是否在Cache中。
- 地址映射:主存块如何存放在Cache中,如何将主存地址转换为Cache地址。
- 替换策略:Cache满后,使用何种策略对Cache块进行替换或淘汰。
- 写入策略:如何既保证主存储块和Cache块的数据一致性,又尽量提升效率。
5.2.1 工作原理
- Cache构成:SRAM(非破坏性读出)
- Cache块(Cache行):块的长度称为块长(Cache行长)
- Cache容量远小于主存,例如4MB/16MB,仅保存主存中最活跃的若干块的副本
两种方式:
- 工作原理:先访问Cache再访问主存的方式
Cache按照某种策略,预测CPU在未来一段时间内欲访存的数据,将其装入Cache。过程全由硬件完成。
步骤:
①CPU发出请求,如果命中:将此地址转换成Cache地址,直接对Cache进行读操作,与主存无关。
②如果不命中,则需访问主存,将字所在的一块 从主存调入Cache。如果Cache已满,则需根据某种替换算法(即“5.4Cache中主存块的替换算法”),用这个块替换Cache中原来的某块信息。 - 另一种常用工作原理:同时访问Cache和内存的方式
若Cache命中,则主存访问终止;否则访问主存将代替Cache。
注意事项:
- CPU与Cache之间的数据交换:以字为单位
- Cache与主存之间的数据交换:以Cache块为单位
计算题
1° 使用“先访问Cache再访问主存的方式”,相比于引入Cache之前,提高的性能倍数?
2° “先访问Cache的方式” / “同时访问Cache和内存的方式**
(默写图)Cache的基本结构/高速缓冲存储器的工作原理
5.2.2 性能分析
Cache命中:访存地址在Cache中的%
对应指标↓
- 命中率H:CPU欲访问的信息已经在Cache中的比率。
- 平均访问时间T:
小结:
5.3Cache与主存的映射方式 【非常重要,重中之重,常见复试中】
3种地址映射方法:【定义+地址结构+区别】
前提知要:
- Cache行中的信息是主存中某个块的副本
- 地址映射:是指把主存地址空间 映射到Cache地址空间,即把存放在主存中的信息 按照某种规则装入Cache。
- 每个Cache块增加一个标记:记录对应的主存块号
- 有效位:0无效,1有效位
思考:为什么要映射?
回想cache定义: cache保存了主存的部分数据 —> cache大小<主存 —> cache地址位数<主存地址位数,不匹配 ——> 需要建立映射。
↓
引入“分块”思想:
主存块大小=cache块大小,块内字数相等(因为是复制品)
↓
主存地址,… … … … … … … ↓缓存地址
- 先找块号,再找第几个字
- 块内地址都是b位,能表示2^b个字
- 2 ^ m >> 2 ^ c,远大于
映射的实质:
↑
带着思考开始介绍映射方法啦 ♪( ^ ∇ ^ *)
↓
5.3.1 直接映射
- 概念:每个主存块只能放到一个特定的位置。
- 映射关系定义:Cache块号=主存块号 % Cache总块数。
- 地址结构:标记+Cache行号+块内地址
- 特点:随意放,自定义放
- 优点:优点:对于任意一个地址,只需要对比一个“标记”,速度最快
- 缺点:块冲突的概率很高,Cache存储空间利用不充分,命中率低
地址结构:
——对访存地址的解读指南ヾ(•ω•`)o
标记+Cache行号+块内地址
- 标志位(t位):主存的行号的前t位
**标记的作用:**t个位相同,且cache行有效位是1,则表示cache这一行就是来自主存地址/就是一个副本
分析:CPU给了一个访存地址,即主存地址
基础例题1
暗含:该计算机按字节编址1Bcache容量16kb=2^4 kb=2 ^14b ——>cache地址14位
注意看(右边)cache块地址组成=块号2+cache块内地址14位。
直接映射 - 做法:将0x1234E8F8转化成2进制,取后14位 即可
基础例题2
分析:“求第几字块” 即 “求cache行号”
cache部分:
- cache容量16kb=2^4 kb=2 ^14b ——>cache地址总位数14位
- “每块有8个字,每字32位”——> 每块 8*32bit /8 =32B,=2^5,——> 块内地址5位
- cache地址=cache行号+块内地址,故cache行号=14-5=9位
主存部分:
- 1MB=2^20B,该计算机按字节编址1B,所以主存地址总位数20位。cache14位,故最高位(标记位)6位
做题:
将主存地址“35301H”转换为2进制,看中间9位,看出cache行号。
①如图,Cache中有8块,可以用3位二进制数表示。因此,根据主存块号的末尾3位可以唯一确定该主存块将会存入Cache的哪个块(唯一确定Cache内块号,查找速度最快,但是,Cache里利用率最低),若该块原先由数据,则直接替换;并且,标记位也可以将末尾的3位省略,仅需19位
②先根据主存块号的末位3位确定该主存块在Cache的位置,然后比对该位置的标记号是否跟前19位相对应,并且有效位是否为1
5.3.2 全相联映射
- 概念:主存块可以放在Cache的任意位置。
- 映射关系定义:Cache行号 = 主存块号 mod Cache总行数。
- 地址结构:标记+块内地址
- 特点:随意放,自定义放
- 优点:Cache存储空间利用充分,命中率高
- 缺点:查找”标记“最慢,有可能需要对比所有行的标记
- Cache行数/块数 大小 = 主存块数 大小
①主存的块存进CACHE时,可以存放在任意位置(Cache存储空间利用率高,但是,可能需要查找所有块的标记,查找速度最慢),其有效位置为1,标记位为该块在主存中的块号
②在访问CACHE进行匹配时,不仅要进行标记位的匹配,还需判定有效位是否为1
Ⅰ标记位匹配成功且有效位为1,则访问该CACHE块的块内地址
Ⅱ标记位匹配失败或有效位为0,则访问主存中相应块号的块内地址
5.3.3 组相联映射
- 概念:Cache块分为若干组,每个主存块可放到特定分组中的任意一个位置。
- 映射关系定义:Cache组号 = 主存块号 mod Cache组数
ps.分组数=Cache组数(后两位二进制数) - 地址结构:标记+组号+块内地址
- 术语:n路组相联映射——每n个Cache行为一组
- 优点:是另外两种方式的折中,综合效果子较好
①如图,Cache中有4组,可以用2位二进制数表示。因此,根据主存块号的末尾2位可以唯一确定该主存块将会存入属于Cache的哪个组,该块可以存放在该组中的任意位置(集合前两种映射的有点,综合效果最好);并且,标记位也可以将末尾的2位省略,仅需20位
②先根据主存块号的末位2位确定该主存块在Cache的组号,然后比对该组的中每块的标记号是否有跟前20个块号相匹配,并且有效位为1的块
③m路组相联映射:Cache中每组有m个块
例题
主存部分:
- 主存块大小 32B =2^5 B,又∵按字节编址(1B),所以块内地址5位。
- 64行/4路=16组,组号2^4个,需要地址位4位。
做题:
“2593”化为二进制,去掉后5位,取后四位(组号)
【口诀总结】😍
“位”=bit,“字节”=B。bit到B字节要➗8得到,如果按字节编址,则多少字节数多少地址位。
要求掌握(会出什么题)
5.4Cache中主存块的替换算法 【重要但不难】
复习:Cache与主存的3种映射方式
- 全相联映射——任意位置
- 直接映射——指定的、特定的位置
- 组相联映射——Cache分组
何时需要替换算法?
——满了,把可能不需要的替换掉
-
全相联映射中,只有完全满了才需要替换,需要再全局中选择替换哪一块,因此需要替换算法
-
直接映射中,每个主存块是唯一确定Cache内的位置。如果对应位置非空,则毫无选择地直接替换,无需替换算法
-
组相联映射中,只有分组内满了才需要替换,需要在分组内选择替换哪一块,需要替换算法
以全相联映射-介绍四种替换算法:(手算做题)
注意英文缩写
- RAND——Cache已满,随机选择一块进行替换
- FIFO——Cache已满,替换最先被调入Cache的块
- LRU——为每个Cache设置计数器,用于记录该块多久没被访问,需要替换时,替换计数器中的最大的块(最久没被访问的块)
5.4.1 随机算法(RAND)
cache命中率可能会很低。
5.4.2 先进先出算法(FIFO)
也不科学,“抖动”现象:刚被替换、又被调用。
5.4.3 近期最少使用(LRU)
手动计算:
硬件实现角度:
-
若一个计数器的值为3(2 ^ n - 1)时,则不需要进行 + 1操作,仅对其他计数器进行 + 1。因为假设3仍然+1变为4,4>2>1>0合理,排序仍可以正确进行,但是没有意义。0,1,2,3只需2个bit即可记录,若要存储0、1、2、3、4需要更多空间。
-
LRU考虑到了局部性原理
-
若频繁访问的主存块数量 > Cache的块数,仍然可能发生抖动
-
计数器仅需n位(n层Cache层)
计数器的逻辑:
计数器的变化规则:
使得:
- 最近访问过的-计数器=0
- 越久没访问过的越大
### 5.4.4 最近不经常使用(LFU)
cache命中率也不好。
小结:LRU最常考,效率最好(Cache命中率最高)
5.5Cache写策略 【记名词就行,记搭配和定义】
目的: 数据一致性问题。cache是从主存中复制的副本,如果CPU修改了cache的内容(数据副本),你要怎么确保主存中母本的一致性。
CPU要修改一个副本,if 我在cache中找到了——Cache写命中——了,有两种解决方法👇
- 写命中(写的地址可以命中的情况下)
①全写法(write-through,写直通法):当CPU对Cache写命中时,必须把数据同时写入Cache和主存,这样就能保证Cache和主存内容一致。
优点: 这种方法保持内容的一致性,但是会增加访存次数。
缺点: 速度不匹配问题,写Cache速度远大于写主存
↓
优化策略: 一般使用 写缓冲(write buffer)——由SRAM实现的一个FIFO的队列。
访存次数增加,速度变慢,但更能保证数据一致性。
作用:能够缓解主存和CPU的速度差异。
缺点: 如果写的太频繁了,可能会出现队列(write buffer)的饱和溢出。
———————————————————————
②回写法(write-back):当CPU对Cache写命中时,只把数据写入Cache,而不立即写入主存。只有当这个块要被替换出来了,我才往主存写。
优点: 和全写法相比,减少了往主存写的次数。
新问题: 可能有一个时间,副本和母本不一致。
解决方法: 给每一个cache行一个修改位——脏位。如果脏位为0,表示该块在Cache中没有被修改;如果脏位为1,表示该块在Cache中被修改了,替换的时候就需要写回主存了,。
只会对Cache内容进行修改,当该块被替换回主存时候,才回将其写回主存,这样就会导致同一个块的Cache和主存内的内容不一样,因此,需要添加一个脏位用来表示该块在Cache中是否进行修改。
好处: 减少访存次数(不需要每次都对主存的内容进行修改)
缺点:存在数据不一致的隐患。
回写法-经常考法:为什么?
Q:Cache里面有几位?
因为加了一个位-脏位,比其他多一位。
- 写不命中
CPU要修改一个副本,if 我在cache中找不到——Cache写不命中——了,有两种解决方法👇
①写分配法(write-allocate):当写不命中时,先将该块从主存调入Cache中,然后搭配写回法(在Cache中进行修改)
②非写分配法(not-write-allocate):当写不命中时,CPU直接对主存的块进行修改,而不调入Cache中(此时,只有读操作才将主存块调入Cache中),搭配全写法
对于Cache写命中(Write hit)有两种处理方法:
- 全写法
- 回写法
对于CacheA写不命中(White-back)有两种处理方法:
- 写分配法
- 非写分配法
现代计算机的多级Cache:
指令Cache与数据Cache分离一般在L1级(离CPU最近的一级Cache层)。
课后题12.??
“全相联映射”: 地址结构=标志位+块内地址
主存部分: 1块里面:32bit=4B=2^2,占两位,所以标志位32-2=30位。
“cache行:”
课后题22.
分析:求cache行的位数主存部分:
- “采用直接映射”——地址分三个部分
- “主存块大小32B”——块内地址5位。
cache部分:
Cache每行包含四部分,cache行=data(32KB)+标志位(?)+有效位(1)+脏位(1),故cache行号=
求标志位个数
“Cache数据区大小32KB”——∵主存块和缓冲块是一样大的(“主存块大小32B”——>“缓冲块大小32B”)—— 32KB/32B= 2^10行【数据区 VS. 行】
↓直接映射的cache的地址格式:
所以意味着“cache行号”有10位。
“组内地址”有5位
所以“标志位”=32-5-10=17位。bit做题:
cache行=data(32B=32*8bit)+标志位(17)+有效位(1)+脏位(1)=275
5.4.1.随机算法(RAND)
5.4.2.先进先出算法(FIFO)
5.4.3.近期最少使用算法(LRU)
5.4.4.最不经常使用算法(LFU)
5.5Cache写策略
6.虚拟存储器【不考,只有一个J】
6.1虚拟存储器与Cache的比较【简答题】
-
相同之处:
①
②
③ -
不同之处:
①
②
③