系列文章目录
第四章 存储器
文章目录
前言
现在是7月12号了,继续学习第四章存储器的内容
一、存储器概述
执行程序需要的指令数据都来自存储器,执行结果也存储在存储器中
1.1 存储器类型(分类)
教材给出了三种分类方法
1.1.1 按存储介质分类
- 半导体存储器——电脑的内存条/U盘——分为两种一种是TTL(晶体管-晶体管逻辑)另一种是MOS(金属-氧化物半导体场效应晶体管)
TTL:集成度低、功耗高、速度快
MOS:集成度高、功耗低
现在计算机内存主要是MOS型的半导体 - 磁表面存储器(要有磁头和载磁体) 容量大,速度慢
- 磁芯存储器 (core memory) 容量大 速度慢
- 光盘存储器 激光、磁光材料构成 廉价易于保存
半导体存储器是易失的,断电后不会保存
磁表面存储器、磁芯存储器 和光盘存储器 是非易失的,断电后仍然保存
1.1.2 按存取方式分类
- 存取时间与物理地址无关(随机访问)
随机存储器 在程序的执行过程中 可读可写 ——RAM
只读存储器——程序执行过程中 只读,可以用来存放系统参数与系统程序 ——ROM - 存取时间和物理地址有关(串行访问)
顺序存取存储器——磁带
直接存取存储器——磁盘(与半径有关,半径越大,越快)
1.1.3 按在计算机中作用分类
存储器分为主存储器和辅助存储器
主存储器 分为:
RAM(可读可写)——随机存储器,用户的数据和用户的程序。分为静态RAM和动态RAM(存在电容上)
ROM (只读)
PROM只能写一次,熔丝烧断的方式
EPROM可擦除,紫外线照射
EEPROM 电可擦除,平常用的U盘也是这种
主存储器和辅助存储器之间可以再放上 Flash Memory。
用作主存的闪存叫NORFlash 存储单元以或非式组织
用作辅存的闪存叫NANDFlash 存储单元以与非式组织
U盘,半导体存储器,速度比磁盘块,比主存储器慢;
计算机硬盘(比较高性能的计算机);
在主存储器和辅助存储器之间的缓存,SSD(固态硬盘)核心的存储材料就是Flash Memory
高速缓冲存储器,即cache
放在主存储器和CPU之间,比主存、Flash Memory快,通常用静态RAM来做,因为静态RAM快
1.2 存储器的层次结构
1.2.1 存储器三个主要特征的关系(层次结构的图十分重要!!!!!!)
速度、容量、价格/位一定注意是单位容量的价格
寄存器和缓存的一部分在CPU中,不过一些I/O端口中也有寄存器
主存+CPU等于主机
没了辅存可以继续用,但是主机的没有就无法运行了
寄存器分为两类:
体系结构寄存器(不透明,提供给机器语言程序员的,可以通过机器语言指令操作)
非体系结寄存器(透明的,不需要机器语言程序员了解,不能通过指令操作)
1.2.2 两个重要的存储层次:缓存—主存层次 和 主存—辅存层次
缓存—主存层次 用硬件连接起来,因为注重的是速度提升,对机器语言程序员来说是透明的,不可见的
主存—辅存层次软件硬件结合的方式,因为这里注重的是容量提升
虚拟存储器不是真正的存储器
缓存—主存层次的整体看作主存储器,使用的地址直接是主存的地址,如果缓存有就会通过分块偏移找到位置
主存—辅存的整体看作虚拟存储器,使用的时候用的是虚拟地址,逻辑地址
1.3 主存储器概述
1.3.1 主存的基本组成
我们已经直到存储器的构成是:存储体、MAR、MDR。主存要更复杂一些
MAR存储地址,通过译码器等等器件在存储体找到位置
控制电路通过读写电路控制数据方向
驱动器和译码器用于选择存储器的某单元
1.3.2 主存与CPU之间的联系
连接是三种类型的信号:
数据总线
地址总线
控制总线(读、写等控制信号)
CPU和主存之间的连接,给出对应的CPU的型号搭建主存和CPU相连!!!大题 注意四条线的方向
1.3.3 主存中存储单元地址的分配
假设存储字长:32位,即对这个存储器的读和写,一次是读或者写32个0/1
主存的编址,编址是8位,每一个字节都有个地址。
那么定义:这存储字的每一个字节都有一个字节地址,但是存储字的字地址在大端方式中是高位字节的地址
在小端方式中是低位字节地址
2的24次方的地址,那就是16M的字节
按字寻址的时候,需要考虑一个字里有几个字节
1.3.4 主存的技术指标
两个技术指标——速度 和 容量
存取周期 是第一次开始到第二次开始之间的最小时间间隔
任何一种存储器,在读写操作后,总要有一段恢复内部状态的复原时间。对于破坏性读出的存储器,存取周期往往比存取时间大得多,因为存储器中的信息读出后需要马上进行再生。
存取时间一般比存取周期短
在突发访问的情况下,无存取周期,非独立,一次读出很多
存储器带宽是单位时间传输的位数或者字节数
二、 半导体存储器芯片简介
2.1 半导体存储芯片的基本结构
地址线是单向的,可以是CPU或者是I/O设备的控制器指向存储器
读/写控制线可以是一条也可以是两条
题目很可能要画图!!!!,给芯片的容量
片选线 半导体芯片片选线有两种标识方式: C S ‾ \overline{CS} CS和 C E ‾ \overline{CE} CE 这两个上面都有一个横线,都是表示低电平有效
这几个信号要背下来!!!!!!!
ROM可能只有
O
E
‾
\overline{OE}
OE读,有时候可能被写成
R
E
‾
\overline{RE}
RE
R
D
‾
\overline{RD}
RD
C
S
‾
\overline{CS}
CS 芯片选择
C
E
‾
\overline{CE}
CE 芯片使能信号
W
E
‾
\overline{WE}
WE 读/写控制线 ,一根线。低电平表示写操作
若是两根线,那么是
O
E
‾
\overline{OE}
OE与
W
E
‾
\overline{WE}
WE 与读/写控制线 ,两根线,前者低电平表示读,后者低电平表示写
2.2 半导体存储芯片的译码驱动方式——线选法
地址有4位,每一个地址输出数据8位,那么就是
16
∗
8
16*8
16∗8
但是如果是1M*8的存储器,那就需要20根地址线,从地址译码器发出的线有100万根线,很难做到集成
而且这样做出来的芯片很窄很长
2.3 半导体存储芯片的译码驱动方式——重合法
A
0
A_0
A0~
A
4
是
行
地
址
A_4是行地址
A4是行地址
A
5
A_5
A5~
A
9
是
列
地
址
A_9是列地址
A9是列地址
第0行的X0是有效的
第0列的Y0是有效的
Y0有效,两个开关打开,(0,0)输出到I/O
Y31则因为管子不导通,无法输出到I/O设备
此时线选法的20位的地址,译码得到的1M根线,重合法只需要行1K,列1K,只需要20条线,集成度可以做得更好。
但是要注意,每一次选中的这个交差点上的存储单元,只包括了一个基本单元电路,每次读出和写入的位数只有1位。一次输出多位的情况见下面2114芯片,如何一次输出4位
三、随机存取存储器(RAM)
内存就是由随机存储器构成,内存包括cache和主存,分别对应SRAM和DRAM
RAM是对应用户的区域和系统程序运行的区域(ROM存储系统程序和保存配置信息的)
3.1 静态RAM(SRAM)
3.1.1 静态RAM基本电路
下面是静态RAM的基本单元
T
1
T_1
T1~
T
4
T_4
T4是触发器用于保存0和1
T
5
T_5
T5和
T
6
T_6
T6是由行地址选择,用来控制读和写
这一个小单元是一共是6个晶体管
在大的SRAM中,虚线部分会被重复
T
7
T_7
T7和
T
8
T_8
T8是一列共有的开关,叫做列开关
如果选中一个行,那么这行的
T
5
T_5
T5和
T
6
T_6
T6都会被打开,但是只有列开关打开的才可以读写操作
注意写操作的时候,因为存储器是双稳态的触发器,所以写入的时候要分两边传,一个传0一个传1
读操作如下:
D
i
n
D_{in}
Din经过放大器之后驱动能力很强,可以直接改变存储单元(
T
1
T_1
T1到
T
4
T_4
T4的锁存)
写操作如下:
3.1.2 静态RAM经典芯片(大题!!!!!)
背下来,很常见!!!!!!!!
静态RAM芯片举例:
W
E
‾
\overline{WE}
WE 读/写控制线 ,低电平则有效,为写操作。高电平是读操作
C
S
‾
\overline{CS}
CS 片选信号,只有为低电平时候这个芯片才会被选中
A
0
A_0
A0~
A
9
A_9
A9是十根地址线,2114芯片是1K个存储单元
I
/
O
1
I/O_1
I/O1~
I
/
O
4
I/O_4
I/O4是四根数据线,每个存储单元选中后都可以读出或写入4位信号,每个存储单元有四个基本电路
1
K
×
4
1K\times4
1K×4在实现中就是
64
×
64
64\times64
64×64的阵列
一个列选信号可以同时选择四列的操作(下图就是每一组的第一列)
读操作如下:
写操作:
3.2 动态RAM(DRAM)
只看刷新!!!!
静态RAM使用的是双稳态触发器,动态RAM用的是电容
电容保存了电荷则认为是1,电容中没有电则认为是0
了解RAM的信号如下
3.2.1 第一种基本单元电路,三管动态RAM(不考)
基本单元电路如下:
信息保存在
C
g
C_g
Cg
T
1
T_1
T1、
T
2
T_2
T2和
T
3
T_3
T3是控制管,进行读出和写入。选择线有效,对应控制管可以导通
以读操作为例,过程如下:
通过预充电信号让
T
4
T_4
T4这个晶体管导通,
V
D
D
V_{DD}
VDD会通过
T
4
T_4
T4晶体管给读数据线进行充电。读数据线是1
读操作,读选择线有效,
T
2
T_2
T2导通
- 若
C
g
C_g
Cg中保存的信号是0,那么
T
1
T_1
T1不会导通
读数据线保持高电平,那么读数据线上就是1( C g C_g Cg为0) - 若
C
g
C_g
Cg中保存的信号是1,那么
T
1
T_1
T1导通
读数据线会通过 T 1 T_1 T1和 T 2 T_2 T2两个管子进行放电,那么读数据线上就是0( C g C_g Cg为1)
读出的信息和保存的信号相反,因此在接受信号时需要加一个非门
但是如果进行的是写入的话,输入的信息和存储的信息是相同的
3.2.2 第二种基本单元电路,单管动态RAM(不考)
竖着的是字线(控制线),相应的行被选中后,T会被打开
C
s
C_s
Cs是1的时候,数据线为1;
C
s
C_s
Cs为0的时候,数据线为0
3.2.3 动态RAM经典芯片(三管)(不考)
读操作:
存储容量
1
K
×
1
1K\times1
1K×1
行地址译码器处,参加译码的不仅仅是地址还有读写控制信号
需要注意的三角形的刷新放大器,因为电容会漏电,刷新放大器对电容保存的信息进行刷新
写操作:
3.2.4 动态RAM经典芯片(单管)(不考)
16K应该是14位,地址应该是14位,但是这里只有7位,之前的14位需要分两次传入,第一次传入行地址,第二次传入列地址
芯片有自己的控制器
R
A
S
‾
\overline{RAS}
RAS——行选通信号——行时钟
C
A
S
‾
\overline{CAS}
CAS——列选通信号——列时钟
W
E
‾
\overline{WE}
WE——读写控制信号——写时钟
读放大器一侧是0那么另一侧是1
一侧是1那么另一侧是0
所以在读放大器的左侧的行
C
s
C_s
Cs是1,输出却是0;右侧则正常输出
然后通过紫色的通道输出
我们再看一下写操作,通过选中的行和选中的列,通过读放大器后做了一次相反操作,存储的信息与输入信息相反(0~63行)但是要注意,正好他们在读的时候也会进行一次取反,两次取反抵消了。
3.2.5 动态RAM刷新
电容容易漏电,一定时间内不对电容的信息进行再生,电容中的电会慢慢漏掉——动态RAM刷新
每一次刷新操作只和行地址有关,跟列地址没有关系,每一次刷新都是一行的所有基本单元电路,而不是某一个存储单元
-
集中式刷新——刷新时间集中在一起
问题:在死区时间内CPU与I/O设备只能进行等待
死区的计算是对每一行都进行刷新,每一次刷新都是用一个存储周期
-
分散刷新
这里假设的存储周期要比集中刷新的存储周期时间长
这是因为:
t M t_M tM:正常的CPU或者I/O与内存进行信息交换的存取周期
t R t_R tR:专门用于动态RAM芯片某一行的刷新
t C t_C tC: t M t_M tM+ t R t_R tR
在2ms中每一行都被刷新了15.6次,其实他128微秒就把128行刷新完了,这实际上是过度的刷新
虽然没有死区,读写周期加长(存取周期变长)芯片的性能下降插入的时间可能不需要这么多,可能只需要32次而不是每次的读写都有一次刷新,这样花了更多的时间进行刷新,性能下降
-
分散刷新与集中刷新相结合(异步刷新)
2ms被分成了128份,在每一份事件中进行了一次刷新,对于这一份时间来说这是一次集中式刷新
对于整个大时间段来说,这是分散式刷新。每一份时间中的刷新时间可以合理安排,不一定在最后。 比如指令译码阶段就不会进行访存,如果放在指令译码阶段,就不会出现“死区”
3.3 动态RAM和静态RAM的比较(选择题的来源!!!!!!)
芯片存储一样的时候DRAM的引脚更少,SRAM通常是线选,片选的时候用的线多,DRAM重合法,引脚复用,线少
DRAM是电容的,因此集成度更高
DRAM的晶体管少于SRAM,更便宜
芯片的价格只跟面积有关,DRAM面积小
但是SRAM快!!!!(DRAM漏电要刷新,而且SRAM是线选,更快)
SRAM用的是双稳态触发器
RAM不能被ROM替换,因为首先RAM比ROM快几个数量级,其次是RAM掉电不能保存,ROM可以掉电保存
四、只读存储器(ROM)
ROM存储系统程序和保存配置信息的(RAM是对应用户的区域和系统程序运行的区域)
4.1 发展历程
4.2 掩模ROM(MROM)
先预充电,在预充电后每一列的位先都是高电平。然后当选择时候,若选中的交点有MOS管,那么位线的高电平会变为低电平,经过读放大器的反向后输出1。
有无MOS已经确定了
4.3 PROM(一次性编程)
破坏性编程
一次性写入
4.4 EPROM(多次性编程)
若想要进行修改,可以用紫外线进行擦除。但是这样的操作较为麻烦
擦除的时候是整片擦除,考试的时候
P
D
‾
\overline{PD}
PD直接低电平是读出,5V的时候是休眠状态,12V是进行擦写状态
考试的时候接地低电平就完事
4.5 EEPROM(多次性编程)与 Flash Memory(快擦型存储器) 等其他存储器
五、存储器与CPU的连接(考试重点!!读写控制信号一定不能落下!!!!)
5.1 存储器容量的扩展
5.1.1 位扩展(例如两个 I K × 4 IK\times4 IK×4位组成 I K × 8 IK\times8 IK×8位)
一次选八位,因此位扩展,要这两个片同时被选中,连一个片选信号
5.1.2 字扩展(扩展的是存储字的数量,也就是地址线)
用
A
10
A_{10}
A10保证只有一个工作
5.1.3 同时扩展 (读写控制信号一定不能拉下!!)
5.2 存储器与CPU的连接(考试时的解题步骤)
选择存储芯片时:选择逻辑尽可能简单,芯片尽可能少,数量最少
片选信号!!!
** 存储器的访问信号必须要在片选信号中体现,例如例题中的
M
R
E
Q
‾
\overline{MREQ}
MREQ,确认访问的不是I/O设备,是CPU与存储芯片正确工作的关键,片选有效信号与CPU的访存控制信号MREQ有关。当CPU访问I/O设备时,MREQ为高电平,表示不需要存储器工作,反之,MREQ为低电平,选择存储芯片。**
若有PD那条线,接地接地即可
读写命令线要写!
课上例题
系统程序区是ROM
用户程序区是RAM!!!
注意“相邻的”就是地址是挨着的
CBA的片选信号位放在芯片直接连的地址之外
非与非门就是或,它不能丢掉,这里是因为要保证A10是0,若不连的话,A10的0还是1都属于了这个RAM即6C00到6CFF都被占用了
WR的非,ROM不接!!!!!!!
若CPU有RD和WR两根线,RAM两个都连,ROM只连RD与自己的OE
MREQ是使能信号,一般置0
注意片选信号直接连低电平有效!
系统程序工作区是RAM!!!!
修改后的题目:
0000 0000 0000 0000 到
0000 1111 1111 1111 即 0FFF地址为4KROM
0001 0000 0000 0000 即 1000
0010 1111 1111 1111 即 2FFF 地址为8KRAM
8K是字扩展,所以第一片是1000 ~ 1FFF,第二片是2000~2FFF
G1是高电平,GA是MREQ,GB是A15
下一个例题
PGM接0的话是向芯片烧写,我们只是通过它读,让他接高电平
CE为输入信号,低电平有效。(有称作片选信号)
OE为输出允许信号,低电平有效
IO/M非是CPU的访存控制信号他就是MREQ,要接0使其能工作,EPROM属于ROM所以不需要写信号,WD信号不需要,RD非直接连到OE非上最后剩地三个地址,用与非门保证它们都是1
六、 存储器的校验
为什么要对存储器的信息进行校验?
例如在静态RAM,信息保存在四管的触发器中,若电磁环境较为复杂,或者收到带电粒子的打击,可能会对存储器中信息产生影响。造成电容的充电放电,或者可能让触发器进行反转
6.1 编码的检测和纠错能力
奇偶校验码,只能检测一位错误
奇校验是数据位和冗余位一起算,代码中1的个数是奇数个
偶校验就是偶数个
偶校验是分组校验
第一行,任意两组合法代码之间二进制最少差异数是1,检错0,纠错0,相加是0 = 1-1
第二行,任意两组合法代码之间二进制最少差异数是2,检错1,纠错0,相加是1 = 2-1
第三行,任意两组合法代码之间二进制最少差异数是3,检错1,纠错1,相加是2 = 3-1
第三行检一位错纠一位错,是因为我们认为一个代码错误反转一位概率大于错误多位,可以将110纠正为111
检错位数一定比纠错位数多,能检错出来才能进行纠错
第三行
{000,111};改造之后用3个0表示一个0,3个1表示一个1,假如现在有一个代码100,假如是一位错,就能检测出原始代码保存的是000。但是如果是110,显然有可能是000 --> 110,或者是111 --> 110,但是根据检1位错,会把代码110改为111,而不是000。检1位错,纠1位错。
第五行
{00000,11111};改造之后用5个0表示一个0, 5个1表示一个1, 假如现在有一个代码11000,
根据检错概率来说判断是两位错了,判断出11是错的,接收方可以直接把这个11改成00,
纠成00000。假如是11100 ,有可能是111错了,也有可能是00错了,显然检测不出3位错。 检2位错,纠2位错。
从规律可以得到一个概念:
** 编码的最小距离: **
6.2 典型例子:汉明码
6.2.1 汉明码的简单介绍
采用奇偶检验,奇校验:加上校验位,1的个数是奇数个;偶校验:加上校验位,1的个数是偶数个
汉明码是一种非划分方式,组和组之间是有交叉的,有些位可能在不同组重复利用 汉明码用于一位错
偶校验 ,利用异或门实现,1的个数是偶数个那么结果应该是0
校验位的位置应该是和其他分组不重叠的位置,那么就是1 2 4 8
2
i
2^i
2i这些位置
上图可以看到,汉明码的分组方式。用偶校验得到的三个结果进行排列,若恰好是一位错,对应的正好是那一位有错。对应校验码应该是特定用于检验某一组用的,所以对应作为校验码的应该是1、2、4三个位置。
6.2.2 汉明码如何进行分组
图中的X,如果全是0,那么他就是这个组独有的,作为 校验码。第i组,那么检测位放在
2
i
−
1
2^{i-1}
2i−1的位置
图中的X,存在不只是一个1,那么他是几个组共有的一位
6.2.3 汉明码的组成
这里介绍汉明码组成的三要素:
这里解释一下检测位的不等式,n是需要传输的信息位数,k是检测位,因此是一共n+k位。
我们的校验结果情况应该是这n+k种情况加上一种全对的情况,一共n+k+1种情况
对应的情况编码是
2
k
2^k
2k种情况应该大于n+k+1。因此得到这个不等式
与计网的汉明距离与这里的汉明码的一些关系
每一个检测位承担的检测小组
6.2.4 编码例题
这里应该写C3 C5 C7 表示的是这个位对应的数字
6.2.5 汉明码的纠错过程
检验位的个数应该与组数相同
这里所谓的“1357”是传递的汉明码从左往右,从1开始数的标号
纠错例子:
这里注意
P
4
P
2
P
1
P_4P_2P_1
P4P2P1构成的二进制表示,就是第六位出错
第七位没有出错,若第七位出错,那么
P
1
P_1
P1也会出错
练习2是因为出错的是第四位,是校验位出错,可以不进行纠错
七、提高访存速度的措施
7.1 提高访存速度的措施
访存速度的提升小于CPU的速度提升
访存速度跟不上CPU运算速度,这种现象被称为 存储墙
所谓的“调整主存结构”。我们之前取数或者取指令都是和机器字长相等长度
7.1.1 调整主存结构之一:单体多字系统
调整主存结构的第一种措施:
好处:增加存储器的带宽
坏处:进行写操作时,可能只需要写16位,但是可能会多修改其他位,导致错误修改
第二,取指令时需要的指令不一定存储在一起,比如第一个是跳转指令的情况
7.1.2 调整主存结构之二:高位交叉(顺序编址)
调整主存结构的改进措施:高位交叉(适合存储器容量的扩展)
四个部分都有自己的控制电路,都有自己的MAR、MDR,都有自己的地址译码器,他们都可以独立工作,这样他们都有了并行工作的基础
但是程序的指令存储一般是依次存储,这样会导致一个部分十分繁忙而其他几个部分空闲。 这种模式适合存储器容量扩展,但是不适合拓宽存储器的带宽
字扩展!!!
7.1.3 调整主存结构之三:低位交叉(对访存性能更有帮助)轮流编址
低位交叉(适合存储器带宽和访问速度的提高,横向对各个体轮流编址)
这样,它的高位是体内地址,低位则是体号。体内的各个单元的低位是一样的
CPU取指令,给出指令。根据体号,
M
0
M_0
M0自动进行寻址,其他个体在此时可以并发进行操作,读取下一条指令
流水的方式访问不同的存储体
注意存取周期和总线周期的区别,总线周期往往小于等于存取周期,这里在多体交叉的情况下是存取周期是总线周期倍数
先保证不丢数据,后提高其效率
注意区分存控和控存
存储器控制部件是存控
控存:控存是微程序控制器中用来存放微指令的存储器,速度比主存更快,通常由ROM组成。
7.1.4 调整主存结构之四:高性能存储芯片
同步:主存足够快,CPU无需等待(DDR,一个时钟上升沿和下降沿都传输数据,双倍传输数据)
突发式存取是一次读取连续地址的数据,可能频繁访问某一些地址的地址,具有局部性 用SRAM来解决
高性能存储芯片很贵
RDRAM用不同的时钟周期实现双倍数据
八、习题课
8.1 字与字节编址与地址分配
8.2 存储器构成的简单计算
注意这里第二个组成部分是“组号”,因为RAM是
4
K
×
4
4K\times4
4K×4而每个模块板是
32
K
×
8
32K\times8
32K×8,位数扩倍,因此两个RAM为一组,一个模块板上有8组,因此组号位为3
8.3 存储芯片的选择以及CPU与其连接题(经典74138译码器与书上例题一致)
注意题目的,题目中给出的所有的信号与引脚都要在CPU示意图种给出!!!特别是
M
R
E
Q
‾
\overline{MREQ}
MREQ和
W
R
‾
\overline{WR}
WR!!!
而且要知道,每个芯片它的片选信号是低电平有效,直接和
Y
1
‾
\overline{Y_1}
Y1等引脚相连
这里添加一个,假若选择
2
K
×
8
2K\times8
2K×8的存储芯片的结果
8.4 存储芯片的选择以及CPU与其连接的进阶题
8.5 交叉编址和多体并行系统
低位多体交叉存储与之前题目的不同就是在于它的片选信号不一样,它的片选信号在
A
2
A_2
A2
A
1
A_1
A1
A
0
A_0
A0,在低位而不是像上面正常的连接方式在高位
可以看到,这个地址范围是不连续的
九、高速缓冲存储器
9.1 概述
9.1.1 为什么用cache
局部性原理包括时间的局部性和空间的局部性
9.1.2 cache的工作原理
块是主存和缓存按照块进行传输的,两者块的大小是一样的
m一般远大于c,主存和缓存一般上千倍差异,主存的块数远远大于缓存的块数
缓存标记信息tag,在缓存中寻找的时候看标记确定是否为要找的那一块,标记与主存中的哪一个块建立对应关系
cache的容量越大命中率越高
命中率也与块长有关:块长过小,可能取一次得不到想要的信息,需要多次取;块长过大,cache中块的个数不多,需要频繁更换块
访存要是直接给的“访存次数”那么分母就不用再加了,注意区分“访存次数”和“访问主存次数”
这里需要强调:
- e的取值是1~ t c t m \frac{t_c}{t_m} tmtc之间
- 注意下面截图的公式给出的是cache和主存中并行查找的结果。如果说是先查找cache,若没有才查找主存,那么应该用的是条件概率计算,结果是 e = t c h × t c + ( 1 − h ) × ( t c + t m ) e=\frac{t_c}{h \times t_c + (1-h) \times (t_c+t_m)} e=h×tc+(1−h)×(tc+tm)tc
这个公式就是在看平均访问时间有多靠近访问缓存的时间,越接近则说明设计的越好
9.1.3 cache的基本结构
地址映射:主存的块可以放到cache的哪些块中
变换机构:主存的块在cache中哪里的查找功能
这些过程(箭头)由CPU完成
9.1.4 cache的读写操作
“CPU发出访问地址是PC送MAR”
9.1.5 cache的改进
主板外面的是片外Cache,片外cache容量更大
多核处理器,每一个核都有自己的cache,多个核会有共用的cache
临近CPU的缓存指令和数据缓存一定是分开的
哈佛结构主存就是指令数据分开的;但是冯诺依曼结构是指令和数据一体的
9.2 cache-主存的地址映射
不同映射方式的cache,在多层次cache中有不同的用处:
靠近CPU的cache希望有高速度,那么就使用直接映射,或者路数比较少的组相联
中间的用组相联方式
距离CPU远的用全相联,距离CPU越远,对速度要求越低,对cache的利用率要求越高
9.2.1 直接映射
不灵活!!cache利用率较低,但是速度快
一个存储块只能放在一个缓存块中
标记相等且有效位为1才是命中
关系:i = j mod C
9.2.2 全相联映射
cache利用率较高
一个存储块可能放在任何一个缓存块中
但是与之相对的用于标记的位数是t+c,比较器更长,比较速度更慢,需要更复杂的电路
成本高,但是cache利用率比较高
电路复杂,也要多花比较的时间
9.2.3 组相联映射(几路就是一组内有多少块)
一个存储块可能放在缓存中的几个块中,这缓存的几个块就是一个组
比较的时候只要在对应的组内进行比较即可。
把所有的块都变成一组,那就变成全相联
让每一组只有唯一一块,那么组相联就是直接相联
可以通过并行地比较
组地址比块地址少,毕竟多个块一个组
相联度越大,越接近全相联;相联度越小,越接近直接映射
并不是相联度越大越好,要是相联度越大需要更多的比较时间
9.3 替换算法
先进先出,不能很好的体现出局部性原理。近期最少使用算法能够较好体现局部性
9.4 查找算法
索引不需要比较(它就是组号,每组内是全相联一一对应),块内位移也不需要比较
注意这里的目录表项,是只有有效位和标识tag
索引拿到组号
找目录表进行比较
标志检查器进行比较后其实还要看有效位是否为1
9.5 访问cache小结
直接:不灵活
全相联:成本高 (比较器多)
组相联 兼顾
9.6 写策略
算“所有访存操作”时的百分之百,是取址操作
主存和缓存之间也有写策略
写直达更加简单,保持一致性
写直达和不按写分配,写命中缓存主存都改,未命中则直接写主存,这两个搭配的话下一次写的时候未命中可以直接写主存里面的东西,此时如果写回缓存是没有意义的,缓存和主存就要都进行改写了
9.7 Cache 结构举例
9.8 改进Cache性能
请求字优先处理,缓存的块还没装完,如果请求字在块的前面,可以先将请求字给CPU
9.9 例题
首先13次miss
块号未超出上限,后面900次都命中,未发生替换
例题2
认为k起始地址是0
访问过程中一定超出了cache的大小
每圈访问的时候64次Miss进行访存,取了256个块,
注意除了读主存,还有写缓存,写操作缺失率为0
曲线是一个凹下的函数,因此还是有个最优值的
cache足够大后,性能表现基本一致
相联度不是越大越好,4路看起来比8路更好
9.10 Cache系统(单级/多级)(联合/分立)
联合还是分立,联合是指令和数据cache合在一起
L2 Cache更看重命中率
例题
CPI的1是命中的时候,单位是时钟
但是这里要注意,这里PPT是先后访问方式
i7有四个核心,每个核心L1是分立,L2是联合的,四个核共用L3
十、辅助存储器
10.1概述
保存程序数据文档等,不能直接与CPU直接进行信息交换
程序要运行,数据要被使用,必须要被调入到主存储器中,最常用的就是磁表面存储器
每个磁道都是同心圆,越往外,位密度越低
数据传输率是用位密度和旋转速度相乘
位密度不应是字节每秒,应该是位/毫米,注意换算,一般单位是bpm,也就是位/mm
也有BPI(Bits Per Inch)意为位每英寸,BPIin(位每英寸英寸)=位(Bits)
平均等待时间:磁头转0.5圈的时间
硬盘和软盘是磁面硬盘
最外侧是0号磁道,低地址靠外,高地址靠内
文件系统的簇的大小是4K,若扇区大小跟簇大小一致都是4K,会更快
在外圈增加密度(早期内部高),外圈的数据吞吐率高,角速度相同的时候外圈的线速度大,因此读的更多
机械硬盘的转速越高,平均等待时间越低
例题
最大寻道时间是从最内到最外,或者最外到最内的时间
这里的平均等待时间是取的平均值,5400是转速,所以0.5/5400就是转半圈,等待磁头转半圈的时间
因为局部性原理,他寻道的时间也一般不会有二分之一寻道时间那么大,因此这时候可能寻道等待时间就可能是主要的了
磁盘控制器需要一定时间知道自己要干什么
10.2 磁记录原理
写操作:局部磁化单元的磁化方向不同,表示0和1
磁载体中会产生不同的剩磁的方向,对应1和0
读操作:读操作时,磁层是运动的,磁场经过读写头切割磁力线,磁通发生变化,电势发生变化,可以根据不同的电势差得到0或者1.
磁载体运动,产生的对应磁通量是不一样的,对应的磁通量方向不一样,电动势不一样
RZ是归零码,负脉冲记录-1,正脉冲记录1,保证同步,不会因为全0导致不同步
NRZ 可能一直0或者一直1,导致时钟不同步
NRZ1 遇到一个1就进行一次翻转
PM,调相,用相位进行存储区分,1采用与参考相位相反的相位,0采用与参考相位相同
FM,调频,0和1频率不同
MFM,调频,但是跳变在中间,0则中间不跳变
磁通量的变化和驱动电流成正比
有跳变读出来1,无跳变读出来0
10.3 硬磁盘存储器
音圈电机,控制读写臂的寻道
传动机构控制转速
10.4 软磁盘存储器(不常见,这里只简单与硬盘对比)
硬盘不能更换,买的时候就是整个硬盘驱动器购买
整张盘片硬盘比软盘高,但是按照单位字节是硬盘更便宜
10.5 光盘存储器
CO/DVD-R/-RW 也可以擦写 他没有磁作用,直接用激光,不用热磁效应
十一、虚拟存储器(主存与辅存)
11.1 虚拟存储器概述
PA和VA,一个是虚拟地址一个是实地址
操作系统可以进行调页
程序:一个火车
进程:运行起来的火车,这时候叫多少多少次列车就是进程
进程下面的概念不涉及
虚地址虽然是连续的,但是映射后,在物理地址则不一定连续,而且有可能有点不再主存中
用户在虚拟内存中的页不一定都在主存中
11.2 三种管理方式
11.2.1 页式管理
等长的页面拼接起来比较整齐不会产生碎块
和段式不一样,这里的每一个页可能只是一个程序的一部分,不能独立
11.2.2 段式管理
每一个段,跟程序的边界是对应的,因此具有独立性,每个程序占自己的一个段(段对应自然分界)
便于维护,便于在多道程序中被共享,对其他的段不会有影响
但是段式管理,要分配一个可变长的空间,容易产生碎块,浪费空间
比如修改一个段A,修改的时候改的更长了,则需要一个更长的段,需要找一个新的连续空间
之前留下的内存空洞下一次写的时候不一定可以完美契合,这样就产生了碎块
11.2.3 段页式管理
共享保护——按段进行管理
调入调出——页面
需要进行查表
首先分多个段,每个段分多个页
所以首先查段地址,然后找到第一个页,然后找到自己页,两次查表
cache到主存不需要任何软件控制,给硬件即可
主存到辅存则主要是软件,硬件占小部分,主存和缓存一起实现
cache主存可以让CPU等一会,CPU不用切换
主存辅存辅存过慢,因此需要切换不能等
访问辅存一定要经过主存!!!(对第二级的访问也就是对辅存的访问没有单独的通路,而CPU可以直接访问主存)
主存和辅存的层次失效的时候需要切换进程
cache的失效来自主存,虚拟存储器很少发生失效,失效率很低
因此虚拟存储器给人感觉很大,但是速度跟主存一样
一个是物理地址向cache映射
一个是虚拟地址向物理地址的映射
段式系统是加法,页式是拼接
页表和段表是页和段的物理地址
虚页号找到一个表项和页内位移合在一起作为物理地址去主存访存
“使用位”是最后一次使用的时间,对应的位数应该是相联度的取log对数,例如八路组相联,LRU是3位
都用写回,只改写第一级缓存,在虚拟内存中就是改写主存的内容,而不是写到辅存
写辅存时间很长,不能用写穿透
无需用连续的页框来存放一个页表
程序块是可以存在存储块中的
逻辑地址,程序所用的地址
1:虚拟页号
14:主存页框
30那一部分直接照抄
程序可以很大,加载到主存的东西很小,可以按需调页
注意这里的主存种保存主存物理空间的操作系统程序
每一个页块都加载了最近使用的片段
虚拟地址空间的分配和操作系统有关
内核空间1GB,固定从0xc000 0000 开始
用户栈向下增长
共享库上面的未分配的空间用来放共享程序
brk堆的结束地址
sbrk堆的起始地址
.data 和 .bss 未初始化的话就是0,但是一般还是要显式地赋初值
不是装入地时候确定虚拟地址
而是链接的时候
(这里没有细讲,涉及的知识量比较大)
页表首地址记录页面在表格中的偏移
装入位为0,实地址为NULL,未分配页
若不是NULL则在辅存
装入位为1已经缓存,主存已经有对应的物理页
若V=0装入位发生缺页
看页面是不是符合操作
得到实页号
缺页:进程切换
只读、可读可写、只能执行(不能改写,保证安全)
实地址:CPU看到的就是实低级物理地址
个人PC:CPU看到的是虚拟地址,需要进行转换
开始的红线指向磁盘,后来将其改为指向内存(从辅存调入主存)
主存访问两次
访问cache必须用物理地址!!
为什么不用虚地址呢,因为操作系统上可能运行多个进程,可能会用相同的的虚拟地址
如果用虚拟地址可能会乱,物理地址保证切换时候可以仍然保证缓存正确命中
DMA传送不涉及CPU,是直接访问的
MMU:分页内存管理单元
主存
快表,TLB
TLB存经常访问的表项
先找块表,找不到再去页表,来迅速得到物理页号,生成物理地址
TLB命中,没碰主存直接得到物理页号,不用两次访问主存
TLB缺失,需要去主存找物理页号,得到物理地址访问cache,cache不命中再访问主存
OS管理TLB
冲刷指令:更新数据
缺页需要缺页中断,操作系统介入
三个缺失有谁处理一定要分清,这是这三个的区别
TLB是页表子集,TLB命中,页表一定命中
页表命中,说明信息一定在主存,可能再缓存
除了全中以外的最好
最坏
之间