第四章 存储器
“本章重点介绍主存储器的分类、工作原理、组成方式以及与其他部件 (如CPU) 的联系。此外还介绍了高速缓冲存储器、磁表面存储器等的基本组成和工作原埋。旨在使读者真正建立起如何用不同的存储器组成具有层次结构的存储系统的概念。”
4.1 概述
4.1.1 存储器分类
1. 按存储介质分类
存储介质是指能寄存0、1两种代码并能区别两种状态的物质或元器件。存储介质主要有半导体器件、磁性材料和光盘等。
(1) 半导体存储器
✦ 易失性存储器
✦ 分为TTL (高速) 和MOS (高集成度 制造简单 廉价 功耗小 广泛应用) 两种
(2) 磁表面存储器
✦ 非易失性存储器
✦ 工作时磁层随载磁体高速运转,用磁头在磁层上进行读/写操作
(3) 磁芯存储器
✦ 非易失性存储器
✦ 由硬磁材料做成的环状元件,在磁芯中穿有驱动线 (通电流) 和读出线,这样便可进行读/写操作
(4) 光盘存储器
✦ 非易失性存储器
✦ 应用激光在记录介质 (磁光材料) 上进行读/写的存储器
2. 按存取方式分类
(1) 存取时间与物理地址无关 (随机访问)
✦ 随机存储器 (RAM): 在程序的执行过程中可读可写
动态RAM价格较低,集成度较高,容量大,较为适合作为主存,而静态RAM价格较高,速度较快,容量小,比较适合应用于缓存cache。
✦ 只读存储器 (ROM): 在程序的执行过程中只读
早期只读存储器的存储内容根据用户要求,厂家采用掩模工艺,把原始信息记录在芯片中,一旦制成后无法更改,称为掩模型只读存储器 (Masked ROM,MROM)。随着半导体技术的发展和用户需求的恋化,只读存储器先后派生出可编程只读存储器 (Programmable ROM,PROM)、可擦除可编程只读在储器 (Erasable Programmable ROM,EPROM) 以及电擦除可编程只读存储器 (Electrically-Erasable Programmable ROM,EEPROM)。近年来还出现了闪速存储FlashMemory,它具有EEPROM的特点,而速度比EEPROM快得多。
(2) 存取时间与物理地址有关 (串行访问)
✦ 顺序存取存储器: 不论信息处在哪个位置,读/写时必须从其介质的始端开始按顺序寻找,例如磁带
✦ 直接存取存储器: 例如磁盘,盘读/写时,首先直接指出该存储器中的某个小区域 (磁道),然后再顺序寻访,直至找到位置。(前段直接访问,后段串行访问 -> 部分串行访问)
3. 按在计算机中的作用分类
主存储器 (简称主存) 的主要特点是它可以和CPU直接交换信息。辅助存储器 (简称辅存) 是主存储器的后援存储器,用来存放当前暂时不用的程序和数据,它不能与CPU直接交换信息。两者相比,主存速度快、容量小,每位价格高;辅存速度慢、容量大、每位价格低。缓冲存储器 (简称缓存) 用在两个速度不同的部件之中,例如,CPU 与主存之间可设置一个快速缓存,起到缓冲作用。
4.1.2 存储器的层次结构
1. 存储器三个主要特性的关系
注: CPU自带小容量的一级缓存和二级缓存,大容量的缓存为CPU外的RAM
2. 缓存-主存层次和主存-辅存层次
缓存-主存层次主要解决CPU和主存速度不匹配的问题。
主存-辅存层次主要解决存储系统的容量问题。
在主存-辅存这一层次的不断发展中,逐渐形成了虚拟存储系统。在这个系统中,程序员编程的地址范围与虚拟存储器的地址空间相对应。例如,机器指令地址码为24位,则虚拟存储器存储单元的个数可达16M。可是这个数与主存的实际存储单元的个数相比要大得多,称这类指令地址码为虚地址 (虚存地址、虚拟地址) 或逻辑地址,而把主存的实际地址称为物理地址或实地址。物理地址是程序在执行过程中能够真正访问的地址,也是实实在在的主存地址。对具有虚拟存储器的计算机系统而言,程序员编程时,可用的地址空间远远大于主存空间,使程序员以为自己占有一个容量极大的主存,其实这个主存并不存在,这就是将其称为虚拟存储器的原因。对虚拟存储器而言,其逻辑地址变换为物理地址的工作是由计算机系统的硬件和操作系统自动完成的,对程序员是透明的。当虚地址的内容在主存时,机器便可立即使用;若虚地址的内容不在主存,则必须先将此虚地址的内容传递到主存的合适单元后再为机器所用。有关这些方面的内容,读者可在 “计算机体系结构” 和 “操作系统” 课程中学到。
4.2 主存储器
4.2.1 概述
1. 主存的基本组成
第一章讲的主存的基本结构如下图所示,但是实际上这是十分简化的结果。
实际上,根据MAR中的地址访问某个存储单元时,还需经过地址译码、驱动等电路,才能找到所需访问的单元。读出时,需经过读出放大器,才能将被选中单元的存储字送到MDR。写入时,MDR中的数据也必须经过写入电路才能真正写入被选中的单元中。可见,主存的实际结构如下图所示。
2. 主存和CPU的联系
上图中的驱动器、译码器和读写电路均制作在存储芯片中,而 MAR和MDR制作在CPU芯片内。存储芯片和CPU芯片可通过总线连接,如下图所示。
3. 主存中存储单元地址的分配
主存被分为一个一个的存储单元,存储单元的大小不是固定的,可以是1个字节的大小,也可以是1个字的大小;实际上字的大小也不是固定的,可能是2个字节,也可能是4个字节。
各存储单元的空间位置是由单元地址号来表示的,而地址总线就是用来指出这个存储单元地址号的,根据该地址可读出或写入一个存储字。
不同的机器存储字长 (即1个字有多大) 也不同,为了满足字符处理的需要,常用8位二进制数表示一个字节,因此存储字长都取8的倍数。通常计算机系统既可按字寻址,也可按字节寻址。例如 IBM 370机 (是大端序机器,高位存在低地址) 的字长为32位,它可按字节寻址,即它的每一个存储字包含4个可独立寻址的字节,其地址分配如下左图所示。字地址是用该字高位字节的地址来表示,故其字地址是4的整数倍,正好用地址码的末两位来区分同一字的4个字节的位置。但对 PDP-11机 (是小端序机器,高位存在高地址) 而言,其字长为16位,字地址是2的整数倍,它用低位字节的地址来表示字地址,如下右图所示。
4. 主存的技术指标
(1) 存储容量
✦ 主存存放二进制代码的总位数: 存储容量=存储单元个数×存储字长
(2) 存储速度
由两个指标来表示:
✦ 存取时间: 指启动一次存储器操作 (读或写) 到完成该操作所需的全部时间,分为: 读出时间、写入时间
✦ 存取周期: 连续两次独立的存储器操作 (例如两次读操作) 所需的最小间隔时间,通常存取周期大于存取时间
(3) 存储器的带宽
✦ 表示单位时间内存储器存取的信息量,单位: 位/秒
4.2.2 半导体存储芯片简介
1. 半导体存储芯片的基本结构
半导体存储芯片采用超大规模集成电路制造工艺,在一个芯片内集成具有记忆功能的存储矩阵、译码驱动电路和读/写电路等,如下图所示。
译码驱动能把地址总线送来的地址信号翻译成对应存储单元的选择信号,该信号在读/写电路的配合下完成对被选中单元的读/写操作。
读/写电路包括读出放大器和写入电路,用来完成读/写操作。存储芯片通过地址总线、数据总线和控制总线与外部连接。
地址线是单向的,数据线是双向的。
地址线和数据线的位数共同反映存储芯片的容量。例如,地址线为10根,数据线为4根,则芯片容量为2
10
^{10}
10×4 = 1K×4位;又如地址线为14根,数据线为1根,则其容量为16K×1位 (这种两个数相乘,一个代表地址线一个代表数据线的表示方式是用来描述存储芯片容量的一种特殊表达形式)。
控制线主要有读/写控制线与片选线两种。读/写控制线决定芯片进行读/写操作,片选线用来选择存储芯片。由于半导体存储器是由许多芯片组成的,为此需用片选信号来确定哪个芯片被选中。例如,一个64K×8位的存储器可由32片16K×1位的存储芯片组成 (从地址线的角度来说,16K代表14根地址线,又由于分为4组,所以增加2位地址线来选择读/写哪一组,加起来正好是64K所代表的16根地址线;从数据线的角度来说,一次读/写一组,一组有8个16K×1位的存储芯片,从每个芯片上读1位,正好8位),如下图所示。但每次读出一个存储字时,只需选中8片。
2. 半导体存储芯片的译码驱动方式
(1) 线选法
它的特点是用一根字选择线 (字线),直接选中一个存储单元的各位 (如一个字节)。这种方式结构较简单,但只适于容量不大的存储芯片。如当地址线A
3
_3
3A
2
_2
2A
1
_1
1A
0
_0
0。为0000时,则第1根字线被选中,对应下图中的第一行8位代码便可直接读出或写入 (地址线共可表示16个数,对应了存储矩阵中的16行)。
(2) 重合法
下图是一个1K×1位重合法结构示意图。显然,只要用64根选择线 (X、Y两个方向各32根),便可选择32×32矩阵中的任一位。例如,当地址线为全0时,译码输出X
0
_0
0和Y
0
_0
0有效,矩阵中第0行、第0列共同选中的那位即被选中。
4.2.3 随机存取存储器 (RAM)
随机存取存储器按其存储信息的原理不同,可分为静态RAM和动态RAM两大类。
一、 静态 RAM (SRAM)
1. 静态 RAM 基本电路
存储器中用于寄存 “0” 和 “1” 代码的电路称为存储器的基本单元电路,下图是一个由6个MOS管组成的基本单元电路。
图中T
1
_1
1~T
4
_4
4是一个由MOS管组成的触发器基本电路,T
5
_5
5、T
6
_6
6犹如一个开关,受行地址选择信号控制。由T
1
_1
1~T
6
_6
6这6个MOS管共同构成一个基本单元电路,而T
7
_7
7、T
8
_8
8受列地址选择控制,分别与位线 A
′
'
′和A 相连,它们并不包含在基本单元电路内,而是芯片内同一列的各个基本单元电路所共有的。
① 静态RAM基本电路的读操作
假设触发器已存有 “1” 信号,即A点为高电平。当需读出时,只要使行、列地址选择信号均有效,则使T
5
_5
5、T
6
_6
6、T
7
_7
7、T
8
_8
8均导通,A点高电平通过T
6
_6
6后,再由位线A通过T
8
_8
8作为读出放大器的输入信号,在读选择有效时,将 “1” 信号读出。
由于静态RAM是用触发器工作原理存储信息的,因此即使信息读出后,它仍保持其原状态,不需要再生。但电源掉电时,原存信息去失,故它属易失性半导体存储器。
② 静态RAM基本电路的写操作
写入时不论触发器原状态如何,只要将写入代码送至D
I
N
_{IN}
IN端,在写选择有效时,经两个写放大器,使两端输出为相反电平。当行、列地址选择有效时,使T
5
_5
5、T
6
_6
6、T
7
_7
7、T
8
_8
8导通,并将A与A
′
'
′点置成完全相反的电平。这样,就把欲写入的信息写人该基本单元电路中。如欲写人 “1” ,即D
I
N
_{IN}
IN=1,经两个写放大器使位线A为高电平,位线A
′
'
′为低电平,结果使A点为高,A
′
'
′点为低,即写入了 “1” 信息。
2. 静态 RAM 芯片举例
① Intel 2114 外特性
Intel 2114芯片的基本单元电路由6个MOS管组成,下图是一个容量为 1Kx4位 的2114外特性示意图。
图中A
9
_9
9~A
0
_0
0为地址输入端;I/O
1
_1
1~I/O
4
_4
4为数据输入输出端;
C
S
‾
\overline{CS}
CS;
W
E
‾
\overline{WE}
WE为写允许信号 (低电平为写,高电平为读);V
c
c
_{cc}
cc为电源端;GND为接地端。
② 2114 RAM芯片结构示意图
2114 RAM芯片的结构示意图如下图所示。图中存储矩阵由 64×64 个基本单元电路组成,列I/O电路即读/写电路。10根地址线分为行地址A
8
_8
8~A
3
_3
3,和列地址A
9
_9
9、A
2
_2
2、A
1
_1
1、A
0
_0
0,4根数据线为I/O
4
_4
4~I/O
1
_1
1,它们是受输入输出三态门控制的双向总线。当
C
S
‾
\overline{CS}
CS和
W
E
‾
\overline{WE}
WE均为低电平时,输入三态门打开,I/O
4
_4
4~I/O
1
_1
1上的数据即写入指定地址单元中。当
C
S
‾
\overline{CS}
CS为低电平、
W
E
‾
\overline{WE}
WE为高电平时,输出三态门打开,列I/O电路的输出经片内总线输出至数据线I/O
4
_4
4~I/O
1
_1
1上。
③ 2114 RAM存储矩阵结构示意图
2114 RAM芯片内的存储矩阵结构如下图所示。其中每一个小方块均为一个由6个 MOS管组成的基本单元电路,排列成64×64矩阵,64列对应64对T
7
_7
7、T
8
_8
8管。又将64列分成4组,每组包含16列,并与一个读/写电路相连,读/写电路受
C
S
‾
\overline{CS}
CS和
W
E
‾
\overline{WE}
WE控制,4个读/写电路对应4根数据线I/O
1
_1
1~I/O
4
_4
4。由图中可见,行地址经译码后可选中某一行;列地址经译码后可选中4组中的对应列,共选择4列。
当对某个基本单元电路进行读/写操作时,必须被行、列地址共同选中。例如,当A
9
_9
9~A
0
_0
0为全0时,对应行地址A
8
_8
8~A
3
_3
3为000000,列地址A
9
_9
9、A
2
_2
2、A
1
_1
1、A
0
_0
0也为0000,则第0行的第0、16、32、48这4个基本单元电路被选中。
此刻,若做读操作,则
C
S
‾
\overline{CS}
CS为低电平,
W
E
‾
\overline{WE}
WE为高电平,在读/写电路的输出端I/O
1
_1
1~I/O
4
_4
4,便输出第0行的第0、16、32、48这4个基本单元电路所存的信息。若做写操作,将写入信息送至I/O
1
_1
1~I/O
4
_4
4端口,并使
C
S
‾
\overline{CS}
CS为低电平、
W
E
‾
\overline{WE}
WE为低电平,同样这4个输人信息将分别写入第0行的第0、16、32、48这4个单元之中。
3. 静态 RAM (2114) 时序
① 静态 RAM 读 时序
了解一个芯片,不仅要知道芯片的物理结构,还要知道芯片是如何实现功能的。芯片在实现功能时往往是遵循严格的时间顺序的,时序图就是把操作按照时间顺序展开,可以从时序图上看到操作的先后关系和每个操作所占用的时间。
下图是2114RAM芯片读周期时序,其中:
✦ A是地址线,每一段代表某一组数据的地址
✦
C
S
‾
\overline{CS}
CS为片选信号,用来选择存储芯片,高电平无效,低电平有效
✦ 在整个读周期中
W
E
‾
\overline{WE}
WE始终为高电平 (故图中省略)
✦ D为数据线,由三态门控制,有高低电平和高阻三种状态
✦ 读周期t
R
C
_{RC}
RC是指对芯片进行两次连续读操作的最小间隔时间
✧ 已是最短,再短的话,时间就不够完成操作了
✦ 读时间t
A
_A
A表示从地址有效到数据稳定所需的最短时间
✧ 显然读时间小于读周期
✧ 已是最短,再短的话,数据就不足以稳定了
✦ 图中t
C
O
_{CO}
CO是从片选有效到输出稳定的时间
✧ 已是最短,再短的话,数据就不足以稳定了
可见只有当地址有效经t
A
_A
A后,且当片选有效经t
C
O
_{CO}
CO后,数据才能稳定输出,这两者必须同时具备。根据t
A
_A
A和t
C
O
_{CO}
CO的值,便可知当地址有效后,经t
A
_A
A - t
C
O
_{CO}
CO时间必须给出片选有效信号,否则信号不能出现在数据线上。
需注意一点,从片选失效到输出高阻需一段时间t
O
T
D
_{OTD}
OTD,故地址失效后,数据线上的有效数据有一段维持时间t
O
H
A
_{OHA}
OHA,以保证所读的数据可靠。
t
O
H
A
_{OHA}
OHA为什么有存在的必要?回答这个问题需要结合写周期看。
② 静态 RAM 写 时序
下图是2114RAM芯片写周期时序,其中:
✦ 写周期t
W
C
_{WC}
WC是对芯片进行连续两次写操作的最小间隔时间
✧ 写周期包括滞后时间t
A
W
_{AW}
AW、写入时间t
W
_{W}
W和写恢复时间t
W
R
_{WR}
WR
✦ 在有效数据出现前,RAM的数据线上存在着前一时刻的数据D
o
u
t
_{out}
out (如下图所示的维持时间),故在地址线发生变化后,
C
S
‾
\overline{CS}
CS、
W
E
‾
\overline{WE}
WE均需滞后t
A
W
_{AW}
AW再有效,否则写进去的数据就变成了上次读周期残留的数据了
✧ t
A
W
_{AW}
AW和t
O
H
A
_{OHA}
OHA有关
但写允许
W
E
‾
\overline{WE}
WE失效后,地址必须保持一段时间,称为写恢复时间t
W
R
_{WR}
WR。此外,RAM数据线上的有效数据 (即CPU送至RAM的写人数据D
I
N
_{IN}
IN) 必须在
C
S
‾
\overline{CS}
CS、
W
E
‾
\overline{WE}
WE失效前的t
D
W
_{DW}
DW时刻出现,并延续一段时间t
D
H
_{DH}
DH (此刻地址线仍有效,t
W
R
_{WR}
WR > t
D
H
_{DH}
DH),以保证数据可靠写入。
值得注意的是,不论是对存储器进行读操作还是写操作,在读周期和写周期内,地址线上的地址始终不变。
二、 动态 RAM (DRAM)
常见的动态RAM基本单元电路有三管式和单管式 (这也是DRAM比SRAM集成度更高的原因) 两种,它们的共同特点都是靠电容存储电荷的原理来寄存信息 (这也是DRAM比SRAM速度慢的原因)。若电容上存有足够多的电荷表示存 “1”,电容上无电荷表示存 “0”。电容上的电荷一般只能维持1~2 ms,因此即使电源不掉电,信息也会目动消失。为此,必须在2ms内对其所有存储单元恢复一次原状态,这个过程称为再生或刷新。所以DRAM不需要一直通电,只需要定时通电刷新即可 (这也是DRAM比SRAM能耗低的原因)。
1. 动态 RAM 基本电路
① 三管MOS动态RAM基本单元电路
下图示意了由T
1
_1
1、T
2
_2
2、T
3
_3
3这3个MOS管组成三管MOS动态RAM基本单元电路。
② 三管MOS动态RAM基本单元电路的读操作
读出时,先对预充电管T
4
_4
4置一预充电信号 (在存储矩阵中,每一列共用一个T
4
_4
4管),使读数据线达高电平V
D
D
_{DD}
DD。然后由读选择线打开T
2
_2
2。
✦ 若T
1
_1
1的极间电容C
g
_g
g存有足够多的电荷 (被认为原存 “1”),使T
1
_1
1导通 (T
1
_1
1一端接地,一端接T
2
_2
2),则T
2
_2
2输出 “0” 信息,使读数据线降为零电平,读出 “0” 信息。
✦ 若T
1
_1
1的极间电容C
g
_g
g没有足够多的电荷 (被认为原存 “0”),则T
1
_1
1截止,T
2
_2
2没有办法接收到 “0” 信息,所以数据线保持高电平不变,读出 “1” 信息。
可见,数据线读出的信息和电容中存储的信息相反。
③ 三管MOS动态RAM基本单元电路的写操作
写人时,将写入信号加到写数据线上,然后由写选择线打开T 3 _3 3,这样,C g _g g便能随输人信息充电 (写 “1”) 或放电 (写 “0”)。
④ 单管MOS动态RAM基本单元电路
为了提高集成度,将三管电路进一步简化,去掉T
1
_1
1,把信息存在电容C
s
_s
s上,将T
2
_2
2、T
3
_3
3合并成一个管子T,便得到单管MOS动态 RAM 基本单元电路,如下图所示。
⑤ 单管MOS动态RAM基本单元电路的读操作
读出时,字线上的高电平使T导通,若C s _s s有电荷,经T管在数据线上产生电流,可视为读出 “1”。若C s _s s无电荷,则数据线上无电流,可视为读出 “0”。读操作结束时,C的电荷已释放完毕,故是破坏性读出,必须再生。
⑥ 单管MOS动态RAM基本单元电路的写操作
写入时,字线为高电平使T导通,若数据线上为高电平,经T管对C s _s s充电,使其存 “1”;若数据线为低电平,则C s _s s经T放电,使其无电荷而存 “0”。
2. 动态 RAM 芯片举例
① 三管动态RAM芯片 (Intel 1103)
这是一个1Kx1位的存储芯片,图中每一小方块代表由3个MOS管组成的动态RAM 基本单元电路。它们排列成 32×32 的矩阵,每列都有一个刷新放大器 (用来形成再生信息) 和一个预充电管 (图中未画),芯片有10根地址线,采用重合法选择基本单元电路。
读出时,先置以预充电信号,接着按行地址A
9
_9
9~A
5
_5
5经行译码器给出读选择信号,同时由列地址A
4
_4
4~A
0
_0
0经列译码器给出列选择信号。只有在行、列选择信号共同作用下的基本单元电路才能将其信息经读数据线送到读 / 写控制电路,并从数据线D输出。
写入时,在受行地址控制的行译码器给出的写选择信号的作用下,选中芯片的某一行并在列地址的作用下,由列译码器的输出控制读 / 写控制电路,只将数据线D的信息送到被选中列的写数据线上,信息即被写入行列共同选中的基本单元电路中。
② 单管动态RAM芯片 (4116)
单管动态RAM芯片结构的示意图如下图所示。这是一个16K×1位的存储芯片,按理应有14根地址线,但为了减少芯片封装的引脚数,地址线只有7根。因此,地址信息分两次传送,先送7位行地址保存到芯片内的行地址缓存器内,再送7位列地址保存到列地址缓存器中。芯片内有时序电路,它受行地址选通
R
A
S
‾
\overline{RAS}
RAS、列地址选通
C
A
S
‾
\overline{CAS}
CAS以及与写允许信号
W
E
‾
\overline{WE}
WE控制。
为什么DRAM可以复用,而SRAM不可以复用?
因为SRAM用来做Cache,追求的是速度,如果复用,就降低了速度。DRAM本来就慢,复用之后降低点速度也没关系。
16K×1位的存储芯片共有16K个单管MOS基本单元电路,它们排列成128×128的矩阵,存储矩阵结构如下图所示。图中的行线就是二.2.④的图中的字线,列线就是二.2.④的图中的数据线。128行分布在读放大器的左、右两侧 (左侧为0~63行,右侧为64~127行)。每根行选择线与128个MOS管的栅极相连。128列共有128个读放大器,它的两侧又分别与64个MOS管相连,每根列线上都有一个列地址选择管。128个列地址选择管的输出又互相并接在一起与I/O缓冲器相连,I/O缓冲器的一端接输出驱动器,可输出数据;另一端接输人器,供数据输入。
读出时,行、列地址受
R
A
S
‾
\overline{RAS}
RAS和
C
A
S
‾
\overline{CAS}
CAS控制,分两次分别存入行、列地址缓存器。行地址经行译码后选中一行,使该行上所有的MOS管均导通,并分别将其电容C
s
_s
s上的电荷反映到128个读放大器的某一侧(第0~63行反映到读放大器的左侧,第64~127行反映到读放大器的右侧)。读放大器的工作原理像一个跷跷板电路,类似于一个触发器,其左右两侧电平相反。此外,列地址经列译码后选中某一列,该列上的列地址选择管导通,即可将读放大器右侧信号经读 / 写线、I/O缓冲器输出至D
o
u
t
_{out}
out端。例如,选中第63行、第0列的单管MOS电路,若其C有电荷为 “1” 状态,则反映到第0列读放大器的左侧为 “1”,右侧为"0",经列地址选择管输出至D
o
u
t
_{out}
out为0,与原存信息反相。同理,第0~62行经读放大器至输出线D
o
u
t
_{out}
out的信息与原存信息均反相。而读出第64~127行时,因它们的电容C
s
_s
s上的电荷均反映到读放大器的右侧,故经列地址选择管输出至Dou的信息均同相。
写入时,行、列地址也要分别送入芯片内的行、列地址缓存器,经译码可选中某行、某列。输人信息D
i
n
_{in}
in通过数据输入器,经I/O缓冲器送至读 / 写线上,但只有被选中的列地址选择管导通,可将读 / 写线上的信息送至该列的读放大器右侧,破坏了读放大器的平衡,使读放大器的右侧与输入信息同相,左侧与输入信息反相,读放大器的信息便可写入选中行的C
s
_s
s中。例如,选中第64行、第127列,输人信息为 “1”,则第127列地址选择管导通,将 “1” 信息送至第127列的读放大器的右侧。虽然第64行上的128个MOS管均导通,但唯有第64行、第127列的MOS管能将读放大器的右侧信息 “1” 对C
s
_s
s充电,使其写入 “1”。值得注意的是,写人读放大器左侧行的信息与输入信息都是反相的,而由读出过程分析又知,对读放大器左侧行进行读操作时,读出的信息也是反相的,故最终结果是正确的。
3. 动态 RAM 时序
由二.2.②的内容可知,动态RAM的行、列地址是分别传送的。
4. 动态 RAM 刷新
刷新的过程实质上是先将原存信息读出,再由刷新放大器形成原信息并重新写人的再生过程。一般取2ms刷新一次。
① 集中刷新
集中刷新是在规定的一个刷新周期内,对全部存储单元集中一段时间逐行进行刷新,此刻必须停止读/写操作。例如,对128×128矩阵的存储芯片进行刷新时,若存取周期为0.5 us,每2ms(占4000个存取周期)就要刷新一次,而对128行集中刷新共需64us (占128个存取周期),其余的1936us (共3872个存取周期) 用来读 / 写或维持信息,如下图所示。由于在这64us时间内不能进行读 / 写操作,故称为 “死时间”,又称访存 “死区”,所占比率为128/4000×100% =3.2%,称为死时间率。
② 分散刷新
分散刷新是指对每行存储单元的刷新分散到每个存取周期内完成,并且每次刷新只刷新一行。其中,把机器的存取周期t
C
_{C}
C分成两段,前半段t
M
_{M}
M用来读 / 写或维持信息,后半段t
R
_{R}
R用来刷新,即t
C
_{C}
C=t
M
_{M}
M+t
R
_{R}
R。若读 / 写周期为0.5us,则存取周期为1us。仍以128×128矩阵的存储芯片为例,刷新按行进行,每隔128us就可将存储芯片全部刷新一遍,如下图所示。这比允许的间隔2ms要短得多,而且也不存在停止读 / 写操作的死时间,但存取周期长了,整个系统速度降低了。
③ 异步刷新
异步刷新是前两种方式的结合,它既可缩短 “死时间”,又充分利用最大刷新间隔为2ms的特点。例如,对于存取周期为0.5us,排列成128×128的存储芯片,可采取在2ms内对128行各刷新一遍,即每隔15.6us (2000us÷128≈15.6us) 刷新一行,而每行刷新的时间仍为0.5 us,如下图所示。这样,刷新一行只停止某一行的一个存取周期,但对每行来说,刷新间隔时间仍为2ms,而 “死时间” 缩短为0.5us。
可以进一步采取一些优化手段,例如在CPU指令译码的时间内进行刷新,由于这个阶段CPU不妨存,所以甚至可以没有死时间。
三、 动态 RAM 和静态 RAM 比较
4.2.4 只读存储器 (ROM)
按ROM的原始定义,一旦注入原始信息即不能改变,但随着用户的需要,总希望能任意修改ROM内的原始信息。这便出现了PROM、EPROM 和 EEPROM等。
对半导体ROM而言,基本器件为两种: MOS 型和TTL 型。
1. 掩模 ROM
2. PROM
3. EPROM
4. EEPROM
4.2.5 存储器与CPU的连接
1. 存储器容量的扩展
① 位扩展 (增加存储字长)
✦ 片选线和读写线同时选中两片存储芯片
✦ 地址线同时连接两个存储芯片
✦ 第一片存储芯片负责存储后4位数据,第二片存储芯片负责存储前4位数据
② 字扩展 (增加存储字的数量)
✦ 读写线、地址线、数据线都同时连接两个存储芯片
✦ A
10
_{10}
10用作片选信号
✦ 当A
10
_{10}
10为低电平,
C
S
0
‾
\overline{CS_{0}}
CS0有效,选中左边芯片
✦ 当A
10
_{10}
10为高电平,
C
S
1
‾
\overline{CS_{1}}
CS1有效,选中右边芯片
③ 字、位扩展
注: 其中A
10
_{10}
10和A
11
_{11}
11接入的是2-4译码器,有关2-4译码器和3-8译码器相关知识见本文末。
2. 存储器与CPU的连接
① 地址线的连接
存储芯片的容量不同,其地址线数也不同,CPU的地址线数往往比存储芯片的地址线数多。通常总是将CPU地址线的低位与存储芯片的地址线相连。CPU地址线的高位或在存储芯片扩充时用,或做其他用途,如片选信号等。
② 数据线的连接
同样,CPU的数据线数与存储芯片的数据线数也不一定相等。此时,必须对存储芯片扩位,使其数据位数与CPU的数据线数相等。
③ 读/写命令线的连接
CPU读 / 写命令线一般可直接与存储芯片的读 / 写控制端相连,通常高电平为读,低电平为写。有些CPU的读 / 写命令线是分开的,此时CPU的读命令线应与存储芯片的允许读控制端相连, 而 CPU的写命令线则应与存储芯片的允许写控制端相连。
④ 片选线的连接
片选线的连接是CPU与存储芯片正确工作的关键。存储器由许多存储芯片组成,哪一片被选中完全取决于该存储芯片的片选控制端
C
S
‾
\overline{CS}
CS是否能接收到来目CPU的片选有效信号。
片选有效信号与CPU的访存控制信号
M
R
E
Q
‾
\overline{MREQ}
MREQ (低电平有效) 有关,因为只有当CPU要求访存时,才需选择存储芯片。若CPU 访问 I/O,则 MREQ为高电平,表示不要求存储器工作。此外,片选有效信号还和地址有关,因为CPU的地址线往往多于存储芯片的地址线,故那些未与存储芯片连上的高位地址必须和访存控制信号共同产生存储芯片的片选信号。通常需用到一些逻辑电路,如译码器及其他各种门电路,来产生片选有效信号。
⑤ 合理选择存储芯片
合理选择存储芯片主要是指存储芯片类型 (RAM或ROM) 和数量的选择。通常选用ROM存放系统程序、标准子程序和各类常数等。RAM则是为用户编程而设置的。此外,在考虑芯片数量时,要尽量使连线简单方便。
⑥ 其他时序、负载
在实际应用CPU与存储芯片时,还会遇到两者时序的配合、速度、负载匹配等问题。
3. 例题
设CPU有16根地址线、8根数据线,并用
M
R
E
Q
‾
\overline{MREQ}
MREQ作为访存控制信号 (低电平有效),用
W
R
‾
\overline{WR}
WR作为读 / 写控制信号 (高电平为读,低电平为写)。现有下列存储芯片: 1K×4位 RAM、4K×8位 RAM、8 K×8位RAM 、2K×8位 ROM、4 K×8位ROM、8 K×8位 ROM及74138译码器和各种门电路,如下图所示。画出CPU与存储器的连接图,要求如下:
① 主存地址空间分配:
6000H ~67FFH 为系统程序区。
6800H ~6BFFH 为用户程序区。
②合理选用上述存储芯片,说明各选几片。
③详细画出存储芯片的片选逻辑图。
解:第一步,先将十六进制地址范围写成二进制地址码,并确定其总容量。
第二步,根据地址范围的容量以及该范围在计算机系统中的作用,选择存储芯片。
根据6000H~67FFH为系统程序区的范围,应选择1片2K×8位的ROM,若选择4K×8位或8K×8位的ROM,都超出了2K×8位的系统程序区范围。
根据6800H~6BFFH为用户程序区的范围,选2片1K×4位的RAM芯片正好满足1Kx8位的用户程序区要求。
第三步,分配CPU的地址线。
将CPU的低11位地址A
10
_{10}
10~A
0
_{0}
0与2K×8位的ROM地址线相连;将CPU的低10位地址A
9
_{9}
9~A
0
_{0}
0与2片1K×4位的RAM地址线相连。剩下的高位地址与访存控制信号
M
R
E
Q
‾
\overline{MREQ}
MREQ共同产生存储芯片的片选信号。
第四步,片选信号的形成。
由74138译码器输人逻辑关系可知,必须保证控制端G
1
_1
1为高电平,
G
‾
2
A
\overline{G}_{2A}
G2A与
G
‾
2
B
\overline{G}_{2B}
G2B为低电平,才能使译码器正常工作。根据第一步写出的存储器地址范围得出,A
15
_{15}
15始终为低电平,A
14
_{14}
14始终为高电平,它们正好可分别与译码器的
G
‾
2
A
\overline{G}_{2A}
G2A (低) 和G
1
_1
1 (高) 对应。而访存控制信号
M
R
E
Q
‾
\overline{MREQ}
MREQ (低电平有效) 又正好可与
G
‾
2
B
\overline{G}_{2B}
G2B (低) 对应。剩下的A
13
_{13}
13、A
12
_{12}
12、A
11
_{11}
11分别接到译码器的C、B、A输入端。其输出
Y
‾
4
\overline{Y}_{4}
Y4有效时,选中1片ROM;
Y
‾
5
\overline{Y}_{5}
Y5与A
10
_{10}
10同时有效均为低电平时,与门输出选中2片RAM,如下图所示。图中ROM芯片的
P
D
‾
\overline{PD}
PD/Progr端接地,以确保在读出时低电平有效。RAM芯片的读写控制端与CPU的读写命令端
W
R
‾
\overline{WR}
WR相连。ROM的8根数据线直接与CPU的8根数据线相连,2片RAM的数据线分别与CPU 数据总线的高4位和低4位相连。
4.2.6 存储器的校验
1. 编码纠错理论
根据编码纠错理论,可以得到一些现成的结论,这里就不给证明了,直接拿来应用。
(1) 编码最小距离
L
−
1
=
D
+
C
且
D
≥
C
L-1=D+C \quad\quad且D\geq C
L−1=D+C且D≥C
其中 L 即编码最小距离,所谓编码最小距离,是指在一种编码系统中,任意两组合法代码之间的最少二进制位数的差异。例如 0110 和 0000 之间的编码最小距离为 2 。
其中 D 为检测错误的位数,C 为纠正错误的位数,且纠错能力恒小于等于检错能力。例如,当最小编码距离为 L = 3 时,若 D 为 2,则 C 为 0,即可以检错两位而没有纠错能力;或 D 为1,C 为 1,即可以检错一位并可以纠错一位。
(2) 检测位数 k 的确定
2
k
≥
n
+
k
+
1
2^k \geq n+k+1
2k≥n+k+1
设欲检测的二进制代码为 n 位,为使其具有纠错能力,需增添 k 位检测位,组成 n + k 位的代码。为了能准确对错误定位以及指出代码没错,新增添的检测位数 k 应满足上式。
2. 汉明码的组成
二进制代码位数 n 一旦确定,检测位数 k 也能确定。将这 k 为检测位依次记作
C
i
C_i
Ci (i = 1, 2, 4, 8, …),分别安插在 n + k 位代码的第 1, 2, 4, 8, … ,
2
k
−
1
2^{k-1}
2k−1位上。
那么每一个检测位上的取值怎么确定呢?实际上,每个检测位负责承担 n + k 位信息中某几位的奇偶检测任务,检测位
C
i
C_i
Ci的取值要使小组
g
i
g_i
gi中是 “1” 的位数为偶数。具体分组如下:
C
1
_1
1 检测的 g
1
_1
1 小组包含 1, 3, 5, 7, 9, 11, …位。
C
2
_2
2 检测的 g
2
_2
2 小组包含 2, 3, 6, 7, 10, 11, 14, 15, …位。
C
4
_4
4 检测的 g
4
_4
4 小组包含 4, 5, 6, 7, 12, 13, 14, 15, …位。
C
8
_8
8 检测的 g
8
_8
8 小组包含 8, 9, 10, 11, 12, 13, 14, 15, 24, …位。
其余检测位的小组所包含的位也可类推。这种小组的划分有如下特点:
① 每个小组
g
i
g_i
gi 有一位且仅有一位为它所独占,这一位是其他小组所没有的,即
g
i
g_i
gi 小组独占第 2
i
−
1
^{i-1}
i−1 位 (i = 1, 2, 3, …)。
② 每两个小组
g
i
g_i
gi 和
g
j
g_j
gj,共同占有一位是其他小组没有的,即每两小组
g
i
g_i
gi 和
g
j
g_j
gj,共同占有第 2
i
−
1
^{i-1}
i−1 + 2
j
−
1
^{j-1}
j−1 位 (i, j = 1, 2, …)。
③ 每3个小组
g
i
g_i
gi、
g
j
g_j
gj 和
g
k
g_k
gk 共同占有第2
i
−
1
^{i-1}
i−1 + 2
j
−
1
^{j-1}
j−1 + 2
k
−
1
^{k-1}
k−1 一位,是其他小组所没有的。
3. 汉明码的纠错过程
汉明码由发送端传送到接收端之后,如何检测哪一位错误了呢?
实际上,接收端会形成新的检测码 P
i
_i
i (i = 1, 2, 4, 8, …),P
i
_i
i 所负责的小组
g
i
g_i
gi 和 C
i
_i
i 相同,P
i
_i
i 的值代表着这一组中是 “1” 的位数是不是偶数,是偶数则 P
i
_i
i 取0,不是偶数则 P
i
_i
i 取 1。因此,如果传送到接收端的汉明码没出错,则所有的检测码 P
i
_i
i 都将是 0。如果有检测码 P
i
_i
i 不为 0,则说明汉明码出错了。
在本例中 P
2
_2
2 和 P
4
_4
4 都是 1,说明二者分组中共有的某位出错了,也就是第 6 位。
4.2.7 提高访存速度的措施
随着计算机应用领域的不断扩大,处理的信息量越来越多,对存储器的工作速度和容量要求也越来越高。此外,因CPU的功能不断增强,I/O设备的数量不断增多,致使主存的存取速度已成为计算机系统的瓶颈。可见,提高访存速度也成为迫不及待的任务。为了解决此问题,可以采取的方法有:
① 寻找高速元件
② 采用层次结构
③ 调整主存的结构 (本节重点)
1. 单体多字系统
由于程序和数据在存储体内是连续存放的,因此 CPU 访存取出的信息也是连续的,如果可以在一个存取周期内,从同一地址取出 4 条指令,然后再逐条将指令送至 CPU 执行,即每隔 1/4 存取周期,主存向 CPU 送一条指令,这样显然增大了存储器的带宽,提高了单体存储器的工作速度,如下图所示。
2. 多体并行系统
多体并行系统就是采用多体模块组成的存储器。每个模块有相同的容量和存取速度,各模块各自都有独立的地址寄存器 (MAR)、数据寄存器 (MDR)、地址译码、驱动电路和读 / 写电路,它们能并行工作,也能交叉工作。
并行工作即同时访问 N 个模块,同时启动,同时读出,完全并行地工作 (不过,同时读出的 N 个字在总线上需分时传送)。
(1) 高位交叉
下图是适合于并行工作的高位交叉编址的编址方式示意图和多体存储器结构示意图,图中程序因按体内地址顺序存放 (一个体存满后,再存人下一个体),故又有顺序存储之称。显然,高位地址可表示体号,低位地址为体内地址。按这种编址方式,只要合理调动,使不同的请求源同时访问不同的体,便可实现并行工作。例如,当一个体正与CPU交换信息时,另一个体可同时与外部设备进行直接存储器访问,实现两个体并行工作。这种编址方式由于一个体内的地址是连续的,有利于存储器的扩充。
(2) 低位交叉
下图是按低位交叉编址的编制方式示意图和多体模块结构示意图。由于程序连续存放在相邻体中,故又有交叉存储之称。显然低位地址用来表示体号,高位地址为体内地址。这种编址方法又称为模M编址 (M等于模块数),下表列出了模 4 交叉编址的地址号。一般模块数 M 取 2 的方幕,使硬件电路比较简单。
多体模块结构的存储器采用交叉编址后,可以在不改变每个模块存取周期的前提下,提高存储器的带宽。下图示意了CPU交叉访问 4 个存储体的时间关系,负脉冲为启动每个体的工作信号。虽然对每个体而言,存取周期均未缩短,但由于CPU交叉访问各体,使4个存储体的读 / 写过程重叠进行,最终在一个存取周期的时间内,存储器实际上向CPU提供了4个存储字。如果每个模块存储字长为 32 位,则在一个存取周期内 (除第一个存取周期外),存储器向CPU提供了 32 × 4 = 128 位二进制代码,大大增加了存储器的带宽。
假设每个体的存储字长和数据总线的宽度一致,并假设低位交叉的存储器模块数为 n,存取周期为 T,总线传输周期为
τ
\tau
τ,那么当采用流水线方式 (如上图所示) 存取时,应满足 T = n
τ
\tau
τ。为了保证启动某体后,经 n
τ
\tau
τ 时间再次启动该体时,它的上次存取操作已完成,要求低位交叉存储器的模块数大于或等于 n。以四体低位交叉编址的存储器为例,采用流水方式存取的示意图如下图所示。
可见,对于低位交叉的存储器,连续读取 n 个字所需的时间 t
1
_1
1 为
t
1
=
T
+
(
n
−
1
)
τ
t_{1}=T+(n-1)\tau
t1=T+(n−1)τ
若采用高位交叉编址,则连续读取 n 个字所需的时间 t
2
_2
2 为
t
2
=
n
T
t_{2}=nT
t2=nT
由于是按照地址的前后顺序,连续读取字,所以高位交叉编址并不占优势。
3. 存储器控制部件
多体模块存储器不仅要与CPU交换信息,还要与辅存、I/O设备,乃至I/O处理机交换信息。因此,在某一时刻,决定主存究竟与哪个部件交换信息必须由存储器控制部件 (简称存控) 来承担。存控具有合理安排各部件请求访问的顺序以及控制主存读 / 写操作的功能。下图是一个存控基本结构框图,它由排队器、控制线路、节拍发生器及标记触发器等组成。
(1) 排队器
由于要求访存的请求源很多,而且访问都是随机的,这样有可能在同一时刻出现多个请求源请求访问同一个存储体。为了防止发生两个以上的请求源同时占用同一存储体,并防止将代码错送到另一个请求源等各种错误的发生,在存控内需设置一个排队器,由它来确定请求源的优先级别。其确定原则如下:
① 对易发生代码丢失的请求源,应列为最高优先级,例加外外设信息最易丢失,故它的级别最高。
② 对严重影响CPU工作的请求源,给予次高优先级,否则会导致CPU工作失常。
例如,写数请求高于读数,读数请求高于读指令。若运算部件不能尽快送走已算出的结果,会严重影响后续指令的执行,因此,发生这种情况时,写数的优先级比读数、读指令都高。若没有操作数参与运算,取出更多的指令也无济于事,故读数的优先级又应比读指令高。
(2) 存控标记触发器 C M _M M
它用来接受排队器的输出信号,一旦响应某请求源的请求,C M _M M被置 “1” ,以便启动节拍发生器工作。
(3) 节拍发生器
它用来产生固定节拍,与机器主脉冲同步,使控制线路按一定时序发出信号。
(4) 控制线路
由它将排队器给出的信号与节拍发生器提供的节拍信号配合,向存储器各部件发出各种控制信号,用以实现对总线控制及完成存储器读 / 写操作,并向请求源发出回答信号,表示存储器已响应了请求等。
4.3 高速缓冲存储器
4.3.1 概述
1. 问题的提出
(1) 避免 CPU 空等现象
在多体并行存储系统中,由于I/O设备向主存请求的级别高于 CPU 访存,这就出现了 CPU 等待I/O设备访存的现象,致使 CPU 空等一段时间,甚至可能等待几个主存周期,从而降低了 CPU 的工作效率。为了避免 CPU 与 I/O 设备争抢访存,可在CPU与主存之间加一级缓存 (参见下图),这样,主存可将 CPU 要取的信息提前送至缓存,一旦主存在与I/O设备交换时,CPU可直接从缓存中读取所需信息,不必空等而影响效率。
(2) CPU 和主存速度差异过大
从另一角度来看,主存速度的提高始终跟不上CPU的发展。据统计,CPU 的速度平均每年改进60%,而组成主存的动态 RAM 速度平均每年只改进7%,结果是 CPU 和动态 RAM 之间的速度间隙平均每年增大50%。例如,100MHz 的 Pentium 处理器平均每 10 ns 就执行一条指令,而动态 RAM 的典型访问时间为 60~120 ns。这也希望由高速缓存 Cache 来解决主存与CPU速度的不匹配问题。
(3) 程序访问的局部性原理
Cache 的出现使 CPU 可以不直接访问主存,而与高速 Cache 交换信息。那么,这是否可能呢?通过大量典型程序的分析,发现CPU从主存取指令或取数据,在一定时间内,只是对主存局部地址区域的访问。这是由于指令和数据在主存内都是连续存放的,并且有些指令和数据往往会被多次调用 (如子程序、循环程序和一些常数),即指令和数据在主存的地址分布不是随机的,而是相对的簇聚,使得 CPU 在执行程序时,访存具有相对的局部性,这就称为程序访问的局部性原理。根据这一原理,很容易想到,只要将 CPU 近期要用到的程序和数据提前从主存送到 Cache,那么就可以做到 CPU 在一定时间内只访问 Cache。一般 Cache 采用高速的 SRAM 制作,其价格比主存贵,但其容量远少于主存,因此能很好解决速度和成本的矛盾。
2. Cache的工作原理
(1) 主存和缓存的编址
下图是 Cache-主存存储空间的基本结构示意图。
主存由 2
n
^n
n 个可编址的字组成,每个字有唯一的 n 位地址。为了与 Cache 映射,将主存与缓存都分成若干块,每块内又包含若干个字,并使主存与缓存的块大小相同 (即块内的字数相同)。主存和Cache按块传输数据,主存和Cache的块是对应的。
然后将主存的地址分成两段:高 m 位表示主存的块地址,低 b 位表示块内地址,则 2
m
^m
m = M 表示主存的块数。
同样,缓存的地址也分为两段:高 c 位表示缓存的块号,低b位表示块内地址,则 2
c
^c
c = C 表示缓存块数,且C远小于M。主存与缓存地址中都用b位表示其块内字数,即 B = 2
b
^b
b 反映了块的大小,称B为块长。
(2) 命中与未命中
任何时刻都有一些主存块处在缓存块中。CPU 欲读取主存某字时,有两种可能:一种是所需要的字已在缓存中,即可直接访问 Cache (CPU 与Cache 之间通常一次传送一个字);另一种是所需的字不在 Cache 内,此时需将该字所在的主存整个字块一次调人 Cache 中 (Cache与主存之间是字块传送)。如果主存块已调人缓存块,则称该主存块与缓存块建立了对应关系。
上述第一种情况为 CPU 访问 Cache 命中,第二种情况为 CPU 访问 Cache 不命中。由于缓存的块数 C 远小于主存的块数 M,因此,一个缓存块不能唯一地、永久地只对应一个主存块,故每个缓存块需设一个标记 (正如上图中Cache的每个字块前都有一个标记),用来表示当前存放的是哪一个主存块,该标记的内容相当于主存块的编号。CPU 读信息时,要将主存地址的高 m 位 (或 m 位中的一部分) 与缓存块的标记进行比较,以判断所读的信息是否已在缓存中。
(3) Cache 的命中率
Cache 的容量与块长是影响 Cache 效率的重要因素,通常用 “命中率” 来衡量 Cache 的效率。命中率是指 CPU.要访问的信息已在 Cache 内的比率。
✦ 容量:Cache 的容量越大,命中率越高;极端情况:Cache 和主存一样大,那么命中率会变成100%。但是随着 Cache 容量变大,命中率的增长会越来越缓慢,同时缓存的速度也会越来越慢,所以需要找到一个比较合适的Cache容量,以保证较高的命中率和较高的速度。
✦ 块长:假如 Cache 容量固定,随着 Cache 的块长慢慢增大,命中率也是增大的,原因是程序访问的局部性原理中的空间局部性,块增大了,就能更多的容纳相邻的数据,以满足空间局部性。但是块再增大,命中率反而会下降,原因仍然是程序访问的局部性原理,因为当块过于大时,一个块里就会放入很多没有必要的数据,使得访问效率变低;并且由于容量一定,块长越大,则块的数量越少,也会使命中率降低。因此也要找到一个最合适的块长,使命中率最大。
在一个程序执行期间,设 N
c
_c
c 为访问 Cache 的总命中次数,N
m
_m
m为访问主存的总次数,则命中率 h 为
h
=
N
c
N
c
+
N
m
h=\frac{N_{c}}{N_{c}+N_{m}}
h=Nc+NmNc
(4) Cache 的平均访存时间
设 t
c
_c
c 为命中时的 Cache 访问时间,t
m
_m
m为未命中时的主存访问时间,1-h 表示未命中率,则 Cache-主存系统 的平均访问时间 t
a
_a
a 为
t
a
=
h
t
c
+
(
1
−
h
)
t
m
t_{a}=ht_{c}+(1-h)t_{m}
ta=htc+(1−h)tm
(5) Cache-主存系统 的效率
当然,以较小的硬件代价使 Cache-主存系统 的平均访问时间 t
a
_a
a 越接近于 t
c
_c
c 越好。用 e 表示访问效率,则有
e
=
理
想
的
一
次
访
存
时
间
实
际
的
一
次
访
存
时
间
=
t
c
t
a
×
100
%
=
t
c
h
t
c
+
(
1
−
h
)
t
m
×
100
%
e=\frac{理想的一次访存时间}{实际的一次访存时间} =\frac{t_c}{t_a}×100\%=\frac{t_c}{ht_{c}+(1-h)t_{m}}×100\%
e=实际的一次访存时间理想的一次访存时间=tatc×100%=htc+(1−h)tmtc×100%
可见,为提高访问效率,命中率 h 越接近 1 越好。
3. Cache 的基本结构
(1) Cache存储体
Cache 存储体以块为单位与主存交换信息,为加速 Cache 与主存之间的调用,主存大多采用多体结构,且 Cache 访存的优先级最高。
(2) 地址映射变换机构
地址映射变换机构是将 CPU 送来的主存地址转换为 Cache 地址。由于主存和 Cache的块大小相同,块内地址都是相对于块的起始地址的偏移量 (即低位地址相同),因此地址变换主要是主存的块号 (高位地址) 与 Cache 块号间的转换。而地址变换又与主存地址以什么样的函数关系映射到 Cache 中 (称为地址映射),这些内容可详见 4.3.2 节。
如果转换后的 Cache 块已与 CPU 欲访问的主存块建立对应关系,即已命中,则 CPU 可直接访问 Cache 存储体。如果转换后的 Cache 块与CPU欲访问的主存块未建立对应关系,即不命中,此刻 CPU 在访问主存时,不仅将该字从主存中取出,同时将它所在的主存块一并调入 Cache,供CPU使用。当然,此刻能将主存块调入 Cache 内,也是由于 Cache 原来就处于未被装满的状态。反之,倘若 Cache 原来已经被装满,即已无法将主存块调入 Cache 内时,就得采用替换策略。
(3) 替换机构
当 Cache 内容已满,无法接受来自主存块的信息时,就由 Cache 内的替换机构按一定的替换算法来确定应从 Cache 内移出哪个块返回主存,而把新的主存块调入 Cache。有关替换算法详见 4.3.3 节。
特别需指出的是,Cache 对用户是透明的,即用户编程时用到的地址是主存地址,用户根本不知道这些主存块是否已经调入 Cache 内。因为,将主存块调入 Cache 的任务全由机器硬件自动完成。
4. Cache 的读写操作
(1) 读
读操作的过程可用如下流程图来描述。当 CPU 发出主存地址后,首先判断该存储字是否在Cache中。若命中,直接访问 Cache,将该字送至 CPU;若未命中,一方面要访问主存,将该字传送给 CPU,与此同时,要将该字所在的主存块装人 Cache,如果此时 Cache 已装满,就要执行替换算法,腾出空位才能将新的主存块调入。
(2) 写
写操作比较复杂,因为对 Cache 块内写入的信息,必须与被映射的主存块内的信息完全一致。当程序运行过程中需对某个单元进行写操作时,会出现如何使 Cache 与主存内容保持一致的问题。目前主要采用以下几种方法。
① 写直达法
又称为存直达法,即写操作时数据既写入 Cache 又写入主存。它能随时保证主存和 Cache 的数据始终一致,但增加了访存次数。
写操作时间就是访问主存的时间,读操作时不涉及对主存的写操作,更新策略比较容易实现。
② 写回法
又称为拷回法,即写操作时只把数据写入 Cache 而不写入主存,但当 Cache 数据被替换出去时才写回主存。可见写回法 Cache 中的数据会与主存中的的不一致。为了识 Cache 中的数据是否与主存一致,Cache 中的每一块要增设一个标志位,该位有两个状态:“清” (表示未修改过,与主存一致) 和 “浊” (表示修改过,与主存不一致)。在 Cache 替换时,“清” 的 Cache 块不必写回主存,因为此时主存中相应块的内容与 Cache 块是一致的。在写 Cache 时,要将该标志位设置为 “浊”,替换时此 Cache 块要写回主存,同时要使标志位为 “清”。
写操作时间就是访问 Cache 的时间,读操作 Cache 失效发生数据替换时,被替换的块需写回主存,增加了 Cache 的复杂性。
5. Cache 的改进
Cache刚出现时,典型系统只有一个缓存,近年来普遍采用多个 Cache,其含义有两方面:一是增加 Cache 的级数;二是将统一的 Cache 变成分立的 Cache。
(1) 增加 Cache 的级数
一级缓存是指在 CPU 和主存之间只设立一个缓存,随着集成电路逻辑密度的提高,缓存被集成在CPU内部,这样做有好处也有坏处。好处在于,CPU 和缓存之间可以使用直接通路,而不占用系统总线,提高了总线了利用率,又可以分更多的资源用于 I/O 设备和主存之间通信,提高了系统整体的效率。而坏处在于,集成在 CPU 之内的缓存容量不能太大,所以命中率会很低,需要频繁访问主存,解决这个问题可以采用多级缓存。
多级缓存是指在片内缓存和主存之间再加一层缓存,称为片外缓存,片外缓存和 CPU 之间也以专用通路连接,而不占用系统总线。
(2) 统一缓存和分立缓存
统一缓存是指数据和指令存储在一个 Cache 中,分立缓存是指数据和指令分别存在数据 Cache 和指令 Cache 中。到底采用同一缓存还是分立缓存,取决于以下两个因素:
1. 主存的结构。如果在主存中,数据和指令就是统一存储的,那么就采用统一缓存,如果在主存中数据和指令是分开存储的,那么就采用分立缓存。
2. 是否采用流水线控制方式。如果采用流水线控制方式,那么采用分立缓存提高效率。因为如果使用统一缓存,前面指令的取数访问缓存和后面指令的取指令访问缓存可能会发生冲突,因此采用分立缓存有利于流水线的实现。
4.3.2 Cache –主存的地址映射
1. 直接映射
主存中的每一块只能被放置到 Cache 中唯一的一个位置。每个缓存块 i 可以和 若干个主存块 对应,每个主存块 j 只能和一个缓存块对应。
主存块地址的后 c 位即 Cache 块地址,而前 t 位是所谓 “标记”,标记存在的原因是:一个缓存块对应着多个主存块,那么如何知道缓存块中存的到底是哪一个主存块呢,就需要用到标记。可以由下图看出,由于 i = j mod C,所以同一缓存块对应的主存块的低地址都是一致的,例如1011和1111模100之后都等于11,因此,可以用高地址来区分这些主存块,那么高地址就是标记。
直接映射的特点是:空间利用率最低,冲突概率最高,实现最简单。
2. 全相联映射
主存中的任一块可以被放置到Cache中的任意一个位置。
由于对于每一个缓存块来说,它都有可能对应着任意一个主存块,因此在全相联映射的情况下,只能用全部的主存地址来作为标记。
空间利用率最高,冲突概率最低,实现最复杂。(实现复杂是因为,每次需要对比的标记为太长了,需要对比的组数也太多了,通常不采用对比标记的方式实现,而是使用对比内容的方式实现)
3. 组相联映射
主存中的每一块可以被放置到 Cache 中唯一的一个组中的任何一个位置。
Cache 中一共有 C = 2
c
^c
c 块,每组内有 R = 2
r
^r
r 块,那么一共就有 Q = 2
c
^c
c ÷ 2
r
^r
r 组,因此需要 q = r - c 位来确定主存中的某一块对应到哪一组,那么剩下的高 t + r 位就被用作标记。
组相联是直接映象和全相联的一种折中。
n 路组相联:每组中有 n 个块 (n=C / Q ),n 称为相联度,相联度越高,Cache空间的利用率就越高,块冲突概率就越低,失效率也就越低。但是实现更为复杂。
实际上,n 越小,组相联映射就越靠近直接映射,n 越大,组相联映射就越靠近直全相联射。
4.3.3 查找方法
上面提到,需要借助标识来确定 Cache 中的某一块到底对应于主存中的哪一块,那么标识应该存放在哪里呢?标识存放在目录表中。
目录表表项中包含两个内容,一个是有效位,指出Cache中的块是否有效;另一个就是标识。
对于直接映射来说:首先根据低地址 (即索引 Index) 确定访问的是缓存中的哪一块,然后查看这一块在目录表中对应的表项,看看是否有效,再对比一下访存地址中的标识位和表项中的标识位,就能知道 Cache 是否命中。那么,目录表中的表项数目等于 Cache 中的块数。
对组相联映射来说,首先根据低地址 (即索引 Index) 确定访问的是缓存中的哪一组,然后把然后把这一组中每一块对应的标识都和访存地址中的标识进行对比,如果命中,就利用多选1多路选择器 (MUX) 从缓存中选择命中的哪一块。
这样做的优缺点是:优点:不必采用按内容查找的方式,而是使用按地址查找的方式就能查找到表项;缺点:当 n 路组相联的 n 增大时,并行表示比较器的位数就会增加,变得更为复杂。
4.3.4 替换策略
1. 先进先出 (First-In-First-Out, FIFO) 算法
FIFO 算法选择最早调人 Cache 的字块进行替换,它不需要记录各字块的使用情况,比较容易实现,开销小,但没有根据访存的局部性原理,故不能提高Cache的命中率。因为最早调入的信息可能以后还要用到,或者经常要用到,如循环程序。
2. 近期最少使用 (Least Recently Used, LRU) 算法
LRU 算法比较好地利用访存局部性原理,替换出近期用得最少的字块。它需要随时记录 Cache 中各字块的使用情况,以便确定哪个字块是近期最少使用的字块。它实际是一种推测的方法,比较复杂,因为很难定义 “近期使用次数” 这个概念,是记录 0.1 秒内的使用次数,还是 0.5 秒内的使用次数?难以抉择。因此一般采用简化的方法,只记录每个块最近一次使用的时间。LRU算法的平均命中率比FIFO的高。
3. 随机法
随机法是随机地确定被替换的块,比较简单,可采用一个随机数产生器产生一个随机的被替换的块,但它也没有根据访存的局部性原理,故不能提高Cache的命中率。
LRU和随机法分别因其不命中率低和实现简单而被广泛采用,模拟数据表明,对于容量很大的Cache,LRU和随机法的命中率差别不大。
4.3.5 写策略
(1) “写” 操作所占的比例
假设某程序中Load指令占26%,Store指令占9%。考虑到所有指令都要访存读指令,则 “写” 在所有访存操作中所占的比例:
“写” 在访问数据Cache操作中所占的比例:
(2) “写” 操作必须在确认是否命中后才可进行
(3) “写” 访问有可能导致Cache和主存内容的不一致
(4) 两种写策略
✦ 写直达法:执行 “写” 操作时,不仅写入Cache,而且也写入下一级存储器。
✦ 写回法:执行 “写” 操作时,只写入Cache。仅当Cache中相应的块被替换时,才写回主存。需要设置 “脏位”,记录数据是否被改变过。
(5) 两种写策略的比较
✦ 写直达法的优点:易于实现,一致性好
✦ 写回法的优点:速度快,占用存储器频带低
(6) 写缓冲器
写缓冲器是一个非常小的高速存储缓冲器,用来临时存放处理器将要写入到主存中的数据,在没有写缓冲器的系统中,处理器直接写数据到主存中。在带有写缓冲器的系统中,cache直接将数据先写到写缓冲器中,然后写缓冲器再以低速写入主存中。这就将高速的CPU和cache从对主存的低速读写中脱离了出来。
写缓冲器同时还改善了cache的性能,这体现在cache行被替换时。当cache控制器要替换出一个脏的cache行时,它只将该cache行中的数据放入写缓冲器中,而不写入主存。这样就可以快速填充新的cache行数据,处理器就可以继续从cache存储器中读/写数据。
(7) 写失效
写失效是指要写时,在cache中没有找到对应块。
(8) 写失效的解决办法 (即 “写” 操作时的调块)
✦ 按写分配 (写时取):写失效时,先把所写单元所在的块调入Cache,再行写入。
✦ 不按写分配 (绕写法):写失效时,直接写入下一级存储器而不调块。
(9) 写策略与调块
✦ 写回法 ── 按写分配
✦ 写直达法 ── 不按写分配
4.3.6 Cache结构举例
例子:DEC的Alpha AXP21064中的内部数据Cache
1. 简介
容量:8KB
块大小:32B
块数:256
映射方法:直接映射
“写” 策略:写直达 ── 不按写分配
写缓冲器大小:4个块
内存地址:34位 (块地址29位,块内地址5位)
2. 结构图
3. 读的工作过程
① 处理器传送给Cache物理地址
✦ Cache的容量与索引 index、相联度、块大小之间的关系:
Cache的容量 = 2
i
n
d
e
x
^{index}
index × 相联度 × 块大小
✦ 把容量为 8 ×1024B = 8192B、相联度为1、块大小为 32B代入:
索引index:8位;标识:29-8=21位
② 由索引选择标识的过程
✦ 根据索引从目录项中读出相应的标识和有效位
③ 从Cache中读出标识之后,用来同从CPU发来的块地址中标志域部分进行比较
✦ 为了保证包含有效的信息,必须要设置有效位
④ 如果有一个标识匹配,且标志位有效,则此次命中
✦ 通知CPU取走数据
4. 写命中情况下的写的工作过程
前三步一样,只有在确认标识匹配后才把数据写入
5. 设置了一个写缓冲器
✦ 提高 “写” 访问的速度。
✦ 写缓冲器是按字寻址的,它含有4个块,每块大小为4个字。
✦ 当要进行写入操作时,如果写缓冲器不满,那么就把数据和完整的地址写入缓冲器。对CPU而言,本次 “写” 访问已完成,CPU可以继续往下执行。由写缓冲器负责把该数据写入主存。
✦ 在写入缓冲器时,要进行写合并检查。即检查本次写入数据的地址是否与缓冲器内某个有效块的地址匹配。如果匹配,就把新数据与该块合并。
6. 发生读不命中与写不命中时的操作
✦ 读不命中:向CPU发出一个暂停信号,通知它等待,并从下一级存储器中新调入一个数据块 (32字节) ── Cache与下一级存储的数据通路宽度为16B,传送一次需5个周期,因此,传送一个数据块需要10个周期
✦ 写不命中:将使数据 “绕过” Cache,直接写入主存。 ── 写直达–不按写分配
✦ 因为是写直达,所以替换时不需要写回
4.3.7 改进Cache性能
平均访存时间=命中时间+ 失效率 × 失效开销,因此可以从三个方面改进 Cache 的性能:
(1) 降低失效率
例如:增加块大小、提高相联度
(2) 减少失效开销
例如:多级Cache、写缓冲及写合并、请求字优先
请求字优先:调块时,首先向存储器请求CPU所要的请求字。请求字一旦到达,就立即送往CPU,让CPU继续执行,同时从存储器调入该块的其余部分。
(3) 减少Cache命中时间
例如:容量小且结构简单的Cache
4.3.8 Cache大小、Block大小和缺失率的关系
4.3.9 访存时间 (时钟周期数) 和Cache容量、相联度的关系 (举例)
4.3.10 多级cache的性能
(1) 采用L2 Cache的系统,其缺失损失的计算如下:若L2 Cache包含所请求信息,则缺失损失为L2 Cache访问时间;否则访问主存,并取到L1 Cache和L2 Cache (缺失损失更大)。
(2) 例:某处理器在无cache缺失时CPI为1,时钟频率为5GHz。假定访问一次主存的时间(包括所有的缺失处理)为100ns,平均每条指令在L1 Cache中的缺失率为2%。若增加一个L2 Cache,其访问时间为5ns,而且容量足够大到使全局缺失率减为0.5%,问处理器执行指令的速度提高了多少?
解:如果只有一级Cache,则缺失只有一种。即L1缺失(需访问主存),其缺失损失为:100ns x 5GHz = 500个时钟,CPI = 1 + 500 x 2% = 11.0。如果有二级Cache,则有两种缺失:L1缺失(需访问L2 Cache):5ns x 5GHz = 25个时钟L1和L2都缺失(需访问主存):500个时钟,因此,CPI = 1 + 25 x 2% + 500 x 0.5% = 4.0
二者的性能比为11.0 / 4.0 = 2.8倍!
4.4 虚拟存储器
4.4.1 虚拟存储器概述
1. 虚拟存储器简介
✦ 如何在有限的主存空间运行较多的较大的用户程序?
⚝ 初衷:采用虚存来扩大寻址空间
⚝ 现在:主要用于存储保护,程序共享
✦ 主存、辅存在OS和硬件的管理之下,提供更大的存储空间
✦ 虚存空间是靠辅存(磁盘)来支持的
✦ 虚拟存储采用与cache类似原理,提高速度,降低成本
✦ 用户感觉到的是一个速度接近主存而容量极大的存储器
存储保护:
在采用虚拟存储技术的存储系统中,一个多任务的操作系统经常将多个不同的程序同时调入主存执行,因此,首先需要保证这些程序间不会相互覆盖,并且,一个程序不能访问其他程序的数据以及不是分配给他的主存区域。其次,一个程序出错不会破坏其他用户程序和系统程序。通过一些限制方式保护主存中程序的技术被称为存储保护。简单的说,存储保护就是对主存中的程序和数据进行保护。为了降低开销,在进行存储保护的时候,通常不会直接保护单个存储单元,而是以页或者段为单位进行保护。
2. 虚拟存储系统的基本概念
(1) 虚拟存储技术的引入用来解决一对矛盾
✦ 一方面,由于技术和成本等原因,主存容量受到限制
✦ 另一方面,系统程序和应用程序要求主存容量越来越大
(2) 虚拟存储技术的实质
✦ 程序员在比实际主存空间大得多的逻辑地址空间中编写程序
✦ 程序执行时,把当前需要的程序段和相应的数据块调入主存,其他暂不用的部分存放在磁盘上
✦ 指令执行时,通过硬件将逻辑地址(也称虚拟地址或虚地址)转化为物理地址(也称主存地址或实地址)
✦ 在发生程序或数据访问失效(缺页)时,由操作系统进行主存和磁盘之间的信息交换
(3) 虚拟存储器机制由硬件与操作系统共同协作实现,涉及到操作系统中的许多概念,如进程、进程的上下文切换、存储器分配、虚拟地址空间、缺页处理等。
3. 虚拟存储器基本原理
(1) 虚存管理方式–页式管理
✦ 页式虚存把主存与外存均划分成等长的页面,常用页大小为4KB~64KB
✦ 便于维护,便于生成页表,类似于cache的块表
✦ 不容易产生碎块,存储空间浪费小
✦ 但是页不是独立的实体,处理、保护和共享不方便
(2) 虚存管理方式–段式管理
✦ 段式虚存把空间划分为可变长的块,称为段,段的分界与程序的自然分界相对应,段最小长度为1个字节,最大因机器而异,常为2
16
^{16}
16B~2
32
^{32}
32B
✦ 段的独立性—易于编译、管理、修改和维护,也便于多道程序共享
✦ 但是各段的长度不同,给主存的分配带来麻烦
✦ 而且段式管理容易产生碎块,浪费主存空间
(3) 虚存管理方式–段页式管理
✦ 程序按模块分段
✦ 段再分成长度固定的页
✦ 程序调入调出按页面来进行
✦ 程序共享保护按段进行
✦ 兼备段式,页式管理的优点
✦ 缺点是在地址映像过程中需要多次查表,在这种系统中,虚拟地址转换成物理地址是通过一个段表和一组页表来进行定位的
4. “Cache-主存” 与 “主存-辅存” 层次的区别
存储层次中cache和虚存的典型指标:
5. 有关虚拟存储器的四个问题
(1) 映象规则
✦ 全相联。以降低失效率为主要目标。
(2) 查找算法
✦ 页表,段表,TLB。
✦ 页表和段表:索引页号或段号的数据结构,获取块 (页或段) 的物理地址。
✦ 段式系统:段内位移加上段的物理地址就是最终的物理地址。
✦ 页式系统:只需简单地将页内位移拼接在相应页面的物理地址之后。
(3) 替换算法
✦ LRU等。
✦ 尽可能减少页故障,OS为每个页面设置“使用位”。
(4) 写策
✦ 写回法
4.4.2 页式虚拟存储器及页表管理
1. 分页 (Paging)
(1) 基本思想
✦ 内存被分成固定长且比较小的存储块 (页框、实页、物理页)
✦ 每个进程也被划分成固定长的程序块 (页、虚页、逻辑页)
✦ 程序块可装到存储器中可用的存储块中
✦ 无需用连续页框来存放一个进程
✦ 操作系统为每个进程生成一个页表
✦ 通过页表 (page table) 实现逻辑地址向物理地址转换 (Address Mapping)
(2) 逻辑地址 (Logical Address)
✦ 程序中指令所用地址 (进程所在地址空间),也称为虚拟地址 (Virtual Address,简称VA)
(3) 物理地址 (Physical Address,简称PA)
✦ 存放指令或数据的实际内存地址,也称为实地址、主存地址
2. 页表–虚拟空间与物理空间的映射
通过页表建立虚拟空间和物理空间之间的映射!
3. 虚拟地址空间
彻底搞懂虚拟内存,虚拟地址,虚拟地址空间
物理地址空间是物理内存的范围,虚拟地址空间是虚拟内存的范围,物理地址空间中的每个物理地址都是实打实地指向了具体的存储单元,虚拟地址空间中每个虚拟地址指向哪里有3种情况:
a.未分配,这个虚拟地址仅仅是个数字而已,没有任何指向。
b.未缓冲,这个虚拟地址指向了磁盘的某个字节存储单元,里面存储了指令或者数据。
c.已缓冲,这个虚拟地址指向了物理内存的某个字节存储单元,里面存储了指令或者数据。
操作系统加载可执行文件后,创建了一个进程,这个进程就有了自己的虚拟地址空间,每个进程的虚拟地址空间都一样,如下图所示
通常操作系统加载可执行文件后,创建了一个进程,这个进程就有了虚拟地址空间,这并不意味着可执行文件已经从磁盘加载到内存中了,操作系统只是为了进程虚拟地址空间的每个区域分配了虚拟页 (虚拟页存储在磁盘上)。虚拟页的状态可能为未分配、未缓冲、已缓冲。
代码和数据区域的虚拟页被分配到了可执行文件的适当位置,此时虚拟页状态为未缓冲,虚拟页指向了磁盘地址。
4. 页表结构
每个进程有一个页表,其中有装入位、修改 (Dirt) 位、替换控制位、访问权限位、禁止缓存位、实页号。
一个页表的项数由什么决定?理论上由虚拟地址空间大小决定。
5. 主存中的页表示例
未分配页:进程的虚拟地址空间中“空洞”对应的页 (如VP0、VP4)
已分配的缓存页:有内容对应的已装入主存的页 (如VP1、VP2、VP5等)
已分配的未缓存页:有内容对应但未装入主存的页 (如VP3、VP6)
6. 逻辑地址转换为物理地址的过程
7. 信息访问中可能出现的异常情况
(1) 缺页 (page fault)
产生条件:当Valid (有效位 / 装入位为0时)
相应处理:从磁盘读到内存,若内存没有空间,则还要从内存选择一页替换到磁盘上,替换算法类似于Cache,采用回写法,淘汰时,根据 “dirty” 位确定是否要写磁盘
(2) 保护违例 (protection_violation_fault) 或访问违例
产生条件:当Access Rights (存取权限) 与所指定的具体操作不相符时
相应处理:在屏幕上显示 “内存保护错” 或 “访问违例” 信息,当前指令的执行被阻塞,当前进程被终止
Access Rights (存取权限) 可能的取值有哪些?
R = Read-only, R/W = read/write, X = execute only
4.4.3 虚拟存储器地址映射与变换
1. 实地址计算机系统
CPU发出的地址就是物理内存地址。
大多数Cray计算机,早期PC,大多数嵌入式系统都使用这种方式。
2. 虚地址计算机系统
CPU发出的地址是虚拟地址。
需要虚实变换,硬件通过OS维护的页表将虚拟地址转换为物理地址。
工作站,服务器,现代PC使用这种方式。
3. 缺页 Page Faults
页表指示虚拟地址不在内存中,处理过程如下:
操作系统负责将数据从磁盘迁移到内存中
当前进程挂起
操作系统负责所有的替换策略
唤醒挂起进程
4. 页式虚拟存储器结构
5. 层次性结构
MMU:Memory Managment Unit,内存管理单元。它是一种负责处理中央处理器 (CPU) 的内存访问请求的计算机硬件。它的功能包括虚拟地址到物理地址的转换 (即虚拟内存管理)、内存保护、中央处理器高速缓存的控制,在较为简单的计算机体系结构中,负责总线的仲裁以及存储体切换 (bank switching,尤其是在8位的系统上)。
6. 虚拟地址 → 物理地址 (页命中)
VA:Virtual Address,虚拟地址
PTEA:Page Table Entry Address,页表项地址
PTE:Page Table Entry,页表项
PA:Physical Address,物理地址
7. 虚拟地址 → 物理地址 (缺页)
8. 快表提高地址转换速度
虚拟地址到物理地址的地址转换速度太慢了
访问页表加上访问数据,需2次访存,速度慢
并且为了缩小页表大小,OS普遍采用多级页表结构,速度更慢
加速方法:引入一个体积小的快表TLB
TLB用于缓存页表中经常被访问的表项
(Valid,VPN,PPN)
Valid:有效位
VPN:Visual Page Number,虚拟页号
PPN:Physical Page Number,物理页号
快表引入相联存储器机制,提高查找速度
采用随机替换算法
9. 经快慢表实现内部地址转换
10. TLB 命中
11. TLB 缺失
12. CPU使用虚拟地址访存中的命中与不命中
三次不命中 MISS 分别是:TLB缺失、缺页、PA 在主存中,但不在Cache中
13. 访问过程的地址转换
14. CPU访存过程
15. 举例:三种不同缺失的组合
4.4.4 虚拟存储器举例
1. 缩写的含义
基本参数 (按字节编址)
• N = 2
n
^n
n : 虚拟地址空间大小
• M = 2
m
^m
m : 物理地址空间大小
• P = 2
p
^p
p : 页大小
虚拟地址 (VA) 中的各字段
• TLBI: TLB index (TLB索引)
• TLBT: TLB tag (TLB标记)
• VPO: Virtual page offset (页内偏移地址)
• VPN: Virtual page number (虚拟页号)
物理地址 (PA) 中的各字段
• PPO: Physical page offset (页内偏移地址)
• PPN: Physical page number (物理页号)
• CO: Byte offset within cache line (块内偏移地址)
• CI: Cache index (cache索引)
• CT: Cache tag (cache标记)
2. 一个简化的存储系统举例
假定以下参数,则虚拟地址和物理地址如何划分?共多少页表项?
• 14-bit virtual addresses (虚拟地址14位)
• 12-bit physical address (物理地址12位)
• Page size = 64 bytes (页大小64B)
页大小为64B,所以页内偏移地址占 6 位;虚拟页表项数应为:2 14 − 6 ^{14-6} 14−6 = 256,所以虚拟页号占 8 位
物理页内偏移地址和虚拟页内偏移地址相同,均为 6 位;物理页表号占 12 - 6 = 6 位
假定部分页表项内容 (十六进制表示) 如下:
假定TLB如下:16 个TLB项,4路组相联,则TLBT和TLBI各占几位?
在使用全相联的情况下,是没有 TLBI 的,只有 TLBT 就是标记位,并且由于是全相联,所以标记位就是全部的地址,即虚拟页号 (页内偏移地址恒不变,不必计入标记);本题是四路组相联,所以 TLBI (TLB index,TLB索引) 占2位,TLBI 用来确定要寻找的表项在哪一个组;那么 TLBT 占 8 - 2 = 6 位。(其中 8 指虚拟页号 8 位)
假定Cache的参数和内容 (十六进制) 如下:16 行,主存块大小为 4B,直接映射,则主存地址如何划分?
由于块大小为 4B,所以块内偏移地址 CO 占 2 位;Cache 中一共有16块,所以 Cache 块地址 (Cache 索引 CI) 占 4 位;前面提到物理地址占 12 位,所以 Cache 标记 CT 占 12 - 2 - 4 = 6 位。
假设该存储系统所在计算机采用小端方式,CPU执行某指令过程中要求访问一个16位数据,给出的逻辑地址为0x03D4,说明访存过程。
答:逻辑地址为 0x03D4,把逻辑地址写成二进制的形式应该为:
0000
0011
1101
0010
0000 \quad 0011 \quad 1101 \quad 0010
0000001111010010
但是由于虚拟地址 (逻辑地址) 应该只有 14 位,所以应该删去两位,也就是删去高位上的两位,最终的虚拟地址应该是:
可以看到,VPN 为 0x0F,VPO 为 0x14,TLBT 为 0x03,TLBI 为 0x3。
再回头看看TLB表,可以发现,在第 TLBI = 0x3 组中,恰有一个标记为 0x03 的表项,说明TLB命中。自然也就不会发生缺页错误。并且还能得到物理页号 PPN 为 0x0D。
那么根据物理页号 PPN 和 虚拟页内偏移地址 VPO 可以得到物理地址:
可以看到,Cache 块内地址 CO 为 0x0,Cache 块地址 CI (Cache 索引) 为 0x5,Cache标记 CT 为 0x0D。
再回头看看 Cache 表,可以发现,块地址 (索引) 为 0x5 的表项标记位恰好为 0x0D,并且有效,那么 Cache 也命中了。
块内地址 CO 为 00,由于要求访问16位数据,因此选中块内前两字节,再以小端序读出,得到数据应该是 0x7236。
4.5 辅助存储器
4.5.1 概述
1. 特点
不直接与 CPU 交换信息
2. 磁表面存储器的技术指标
(1) 记录密度
记录密度指单位长度内存储的二进制信息量。磁盘沿半径方向单位长度的磁道数为道密度
D
t
D_{t}
Dt(道每毫米)。单位长度磁道能记录的二进制信息位数称为位密度
D
b
D_{b}
Db(位每毫米)。
(2) 存储容量
存储容量是指外存所能存储的二进制信息总数量(位或字节)。存储容量可按下式计算:
C
=
n
×
k
×
s
C=n×k×s
C=n×k×s,其中
C
C
C 为存储总容量,
n
n
n 为存放信息的盘面数,
k
k
k 为每个盘面的磁道数,
s
s
s 为每条磁道上记录的二进制代码数。
(3) 平均寻址时间
磁盘的寻址时间分为两个部分:一是磁头寻找目标磁道的找道时间
t
s
t_{s}
ts,二是磁头找到磁道之后,等待所要读 / 写的磁道区段旋转到磁头下方的等待时间
t
w
t_{w}
tw。由于找道时间和等待时间都不固定,因此取平均找道时间
t
s
a
t_{sa}
tsa 和平均等待时间
t
w
a
t_{wa}
twa 构成平均寻址时间
T
a
=
t
s
a
+
t
w
a
=
t
s
m
a
x
+
t
s
m
i
n
2
+
t
w
m
a
x
+
t
w
m
i
n
2
T_{a}=t_{sa}+t_{wa}= \frac{t_{smax}+t_{smin}}{2}+\frac{t_{wmax}+t_{wmin}}{2}
Ta=tsa+twa=2tsmax+tsmin+2twmax+twmin
辅存的速度取决于寻址速度和磁头读写速度。
(4) 数据传输率
数据传输率
D
r
D_{r}
Dr 是指单位时间内磁表面存储器向主机传送数据的位数或字节数,它与记录密度
D
b
D_{b}
Db 和记录介质的运动速度
V
V
V 有关:
D
r
=
D
b
×
V
D_{r}=D_{b}×V
Dr=Db×V。
(5) 误码率
误码率指出错信息位数和读出信息的总位数之比。为了减少出错率,磁表面存储器通常采用循环冗余码来发现并纠正错误。
3. 如何增大磁盘片的容量?
提高盘片上的信息记录密度:
• 增加磁道数目——提高磁道密度
• 增加扇区数目——提高位密度,并采用可变扇区数
4. 平均存取时间
硬盘的操作流程如下:所有磁头同步寻道(由柱面号控制)→ 选择磁头(由磁头号控制) → 被选中磁头等待扇区到达磁头下方(由扇区号控制) → 读写该扇区中数据
磁盘上的信息以扇区为单位进行读写,平均存取时间为:T = 平均寻道时间 + 平均旋转等待时间 + 数据传输时间(忽略不计)
• 平均寻道时间——磁头寻找到指定磁道所需平均时间 (大约5ms)
• 平均旋转等待时间——指定扇区旋转到磁头下方所需平均时间 (大约4~6ms) ( 转速: 4200 / 5400 / 7200 / 10000rpm )
• 数据传输时间——( 大约0.01ms / 扇区 )
5. 磁盘响应时间计算举例
假定每个扇区512字节, 磁盘转速为5400 RPM,声称寻道时间(最大寻道时间的一半)为12 ms, 数据传输率为4 MB/s, 磁盘控制器开销为1 ms, 不考虑排队时间,则磁盘响应时间为多少?
解:从平均的角度来说,假设所有磁道被选中的概率相同,那么平均寻道(找道)时间应该是最大寻道时间的一半,也就是题干中所说的声称寻道时间;同理,平均等待时间应该就是碟片转半圈的时间,所以,磁盘响应时间如下:
但是,在实际情况中,从程序访问的局部性原理来说,每次磁盘访问都集中在局部几个磁道,所以平均寻道时间将会更短,加入寻道时间变为原来的1/3,那么:
4.5.2 磁记录原理和记录方式
1. 磁记录原理
2. 磁表面存储器的记录方式
磁记录方式又称为编码方式,它是按照某种规律将一串二进制数字信息变换成磁表面相应的磁化状态。常用的记录方式有六种:归零制(RZ),不归零制(NRZ),“见1就翻” 的不归零制(NRZ1),调相制(PM),调频制(FM),改进型调频制(MFM)。
4.5.3 硬磁盘存储器
1. 硬磁盘存储器的类型
(1) 按照磁头的工作方式,可以分为固定磁头磁盘存储器和移动磁头磁盘存储器。
(2) 按照磁盘是否具有可换性,又可分为可换盘磁盘存储器和固定盘磁盘存储器。
2. 硬磁盘存储器结构
硬磁盘存储器由磁盘驱动器、磁盘控制器、盘片3大部分组成,其结构如下图。
(1) 磁盘驱动器
又称为磁盘机,主要包括三部分:主轴、定位驱动和数据控制。主轴负责带动磁盘组做高速旋转运动;定位驱动用于检测磁头的实时位置,与磁盘控制器送来的目标磁道位置进行比较,计算位差,还要根据磁头的速度算出正确的速度和方向传给音圈电机,由音圈电机带动小车移动,从而带动磁头作盘的径向移动;数据控制用于完成数据的转换和读写。
(2) 磁盘控制器
• 接收主机发来的命令,转换成磁盘驱动器的控制命令
• 实现主机和驱动器之间的数据格式转换
• 控制磁盘驱动器读写
磁盘控制器是主机与磁盘驱动器之间的接口。
(3) 盘片
由硬质铝合金材料制成。
4.5.4 软磁盘存储器
1. 概述
2. 软盘片
由聚酯薄膜涂磁层制成。
4.5.5 光盘存储器
1. 概述
采用光存储技术:利用激光写入和读出
• 第一代光存储技术:采用非磁性介质,不可擦写
• 第二代光存储技术:采用磁性介质,可擦写
2. 光盘的存储原理
只读型和只写一次型:热作用(物理或化学变化)
可擦写光盘:热磁效应