《计算机组成原理》复习第三章—存储器

第三章 多层次的存储器

3.1 存储器概述

3.1.1 分类
  • 按存储介质分类:磁表面/半导体存储器
  • 按读取方式分类:随机/顺序存取
  • 按读写功能分类:ROM(只读存储器),RAM(随机存储器)后面会有他们的区别
  • 按信息的可保存性分类:永久性和非永久性
3.1.2 存储器的分级结构

因为存储器的特点是:

  • 速度快 = 价格贵+容量小
  • 价格低 = 速度慢+容量大

所以我们在设计存储器体系结构的过程中,应该分级设计,在速度、价格和容量采取这种措施。

我们可以将存储器结构分为三个部分:cache,主存和辅存

在这里插入图片描述

外存(硬盘等)需要先将数据传送到内存(主存),然后CPU在内存中读写数据,最终内存将修改的数据保存在外存中。

3.1.3 存储器的技术指标
  • 存储字长:主存中一个存储单元内保存的二进制位数

  • 大端存储:数据低位存放在地址的高位。

    例如:0x1234存放在地址中为3412(假设按字节编址,地址从小到大)

  • 小端存储:数据低位存放在地址的低位

    例如:0x1234存放在地址中为(假设按字节编址,地址从小到大)

  • 存取时间又称存储器访问时间:指一次读操作命令发出到将数据读出到数据总线上所经历的时间。通常取写操作时间等于读操作时间,故称为存储器存取时间。

  • 存储周期:指连续启动两次读操作所需间隔的最小时间。

  • 存储器带宽:单位时间里存储器所能存取的信息量,通常以位/秒或字节/秒做度量单位。

这里做题的时候会有几个陌生的地方,解释一下

  • 按字节编址或者按字编址:我理解是存储器内的一个存储单元存储的数据长度是一个字节或一个字
  • 寻址范围:我理解是计算机主存所能容纳最大的数据个数。例如计算机按字编址,字长为32位,那么数据都是以字(4字节)的方式保存在存储器中的,如果主存为64KB,那么寻址范围就是0-16K-1
3.1.4 内存储器的分类及应用

在这里插入图片描述

其实我们可以把握几个点就可以快速掌握RAM和ROM的区别:

  • ROM是只读存储器,那肯定不能修改他的内容,所以用作系统启动是的BIOS
  • ROM既然存在每次系统启动的BIOS,那它肯定是非易失性的,否则第二天你打开电脑发现没有启动区了
  • RAM与ROM对应,因为RAM需要供电刷新,所以是易失性的。

3.2 SRAM(静态)存储器

静态这个词在编程中经常出现,凡是与静态相挂钩的难免会有以下的特性:

  • 速度快
  • 一直保持

所以只要一直供电,SRAM就会一直保存数据。其底层是采用了一个锁存器作为存储元

为什么SRAM比DRAM快?

  • DRAM需要频繁的刷新
  • DRAM采用地址线复用结构,分时传送地址
  • DRAM需要预充电
3.2.1 基本的静态存储元阵列

在这里插入图片描述

左边是六位地址线
A 0 , A 1 , A 2 , A 3 , A 4 , A 5 A_0,A_1,A_2,A_3,A_4,A_5 A0,A1,A2,A3,A4,A5
每一个输入对应着0或1,那么6个输入就对应二进制000000-111111,全部转换十进制一共是64个数字,所以每一个二进制都对应着一个数字选择线的地址

下面是四位数据线,用来获取数据0000-1111

右上角是一个存储位元,整个静态存储共有64*4个存储位元

3.2.2 基本的SRAM逻辑结构

随着地址位数的增多,地址线的数量呈指数倍增长。为了降低选择线的复杂程度,我们采取了双译码的方式:

  • 将地址分为X、Y两部分,分别译码
  • 根据X、Y的地址来定位存储位置

在这里插入图片描述

可以看到左边是8位行译码,下面是7位列译码,输入的数据也有8位,所以该存储阵列的存储大小为
2 8 × 2 7 × 8   B y t e s = 32 K 2^8×2^7×8\ Bytes = 32K 28×27×8 Bytes=32K

3.2.3 存储器的读写周期

在这里插入图片描述

我们要搞懂什么时候地址线、控制线、数据线有效,才能理解上面波形图的过程。

地址线肯定是第一个有效,否则CPU怎么读地址呢?在地址线有效的时序内,这时候我们要开始读我们的数据。 C S ‾ \overline{CS} CS(片选信号)和 O E ‾ \overline{OE} OE(读出使能)由高电平变为低电平(低电平有效),经过了 t E Q 和 t G Q t_{EQ}和t_{GQ} tEQtGQ时间数据总线I/O出现了有效数据。

在这里插入图片描述

3.3 DRAM存储器

因为SRAM①晶体管过多②存储密度低,空间利用率小③功耗大,所以设计出了DRAM来弥补SRAM的不足

3.3.1 DRAM存储位元的记忆原理
  • SRAM是通过触发器来保存数据,只要保持电源就可以一直存在
  • DRAM是由电容器和MOS晶体管组成,电容器需要不断地充电和放电,所以我们需要不断刷新电路来保存数据
3.3.2 DRAM芯片逻辑结构

在这里插入图片描述

通过这张图,我们对比一下SRAM的逻辑结构可以发现:

  • 增加了行地址锁存器和列地址锁存器

    因为DRAM的容量比SRAM大得多,所以如果地址线单一就会导致电路实现十分复杂。所以这里采用了行地址和列地址来决定一个存储单元。同时为了不额外增加地址线,这里采取了分时传送的方法:对于10位宽度的地址线,先传送A0-A9,再传送A10-A19,实现了地址线的复用。这样仅用10位地址线传送了20位地址。

  • 增加了刷新计数器

    DRAM因为使用了电容器,所以需要定期的刷新,而且要按行刷新,所以刷新计数器的长度等于行地址锁存器。刷新的行地址由刷新计数器给出,而不是CPU!

    SRAM采用了双稳态电路,可以长期保持数据,不需要刷新

3.3.3 DRAM读/写周期

读写周期和SRAM类似,我这里就不提了。但是有必要提一下刷新周期的知识。

DRAM比SRAM慢的原因之一就是DRAM需要不断地刷新,而且每次刷新是对存储阵列一行的数据进行刷新。

刷新周期:两次刷新操作之间的时间间隔

刷新操作分别有集中式刷新分散式刷新异步式刷新

  • 集中式刷新

    DRAM需要在一个刷新周期内对所有行进行刷新,那么这种方式把对所有行的刷新集中在一起。

    下图是在2ms的刷新周期内先进行了3872个读写操作,然后集中进行了128个刷新操作。这样做会导致较长的死时间:CPU在集中刷新的时候不能访问主存

  • 分散式刷新

    这种方式是将每一行的刷新分散在各个读写周期之中,即进行一次读写就刷新一次。这样做会导致存取周期变大,因为每进行一次存取操作就会进行一次刷新操作。在相同的时间内集中式刷新能进行1000次存取操作,而分散式刷新只能进行500次存取操作,还进行了500次刷新操作(实际上只需要刷新128次即可)

  • 异步式刷新

    因为分散式刷新中我们额外做了很多次刷新,所以异步式刷新中我们在一系列的存取操作后进行一次刷新(总共刷新次数等于行数),而不是每一次存取之后都进行一次刷新

3.3.4 存储器容量的扩充
  • 字长位数的扩展(输出端位数扩展)

    比如说我们利用1M×4位的SRAM芯片,设计一个存储容量为1M×8位的SRAM存储器。这里1M×4位是指地址线有20位 ( 2 20 B y t e s ) (2^{20}Bytes) (220Bytes),输出的数据线有4位。当我们需要输出8位时,只需要将两个芯片分别8位中的4位即可。地址线和控制线公用

    在这里插入图片描述

  • 字存储容量的扩展(输入端位数扩展)

    当我们的芯片容量不能满足我们的需求时,我们需要扩充输入端的位数。因为我们芯片的地址位数增多,我们可使用的空间也就会增多(更多的地址位数对应更多的空间嘛)。

    例如我们使用256K×8位的DRAM芯片设计512K×8位的DRAM存储器,地址线由8根要扩充到9根,那么我们肯定需要两个芯片,但两个芯片一共有16根线,怎么设计才能出现9根线呢?

    一个256K的芯片寻址范围 0000   0000 0000\space0000 0000 0000~$ 1111\space1111$。如果我们有九个芯片那么寻址范围就是 0   0000   0000 0~0000~0000 0 0000 0000~ 1   1111   1111 1 ~ 1111~1111 1 1111 1111。这个寻址范围我们可以这样去看:从 0   0000   0000 0~0000~0000 0 0000 0000 0   1111   1111 0~1111~1111 0 1111 1111对应第一个芯片的范围,从 1   0000   0000 1~0000~0000 1 0000 0000 1   1111   1111 1~1111~1111 1 1111 1111对应第二个芯片的范围。这样我们可以看到两个芯片唯一的不同就是最高位,所以我们可以通过使能最高位来控制不同的芯片生效,这样就扩充了地址范围。

    在这里插入图片描述

  • 字长和位数同时扩展

    综合以上两种情况,我们可以先进行字长的扩展,因为字长进行扩展的时候,地址线和控制线都是公用的,所以与原来一个芯片的使用没有区别。再将位数进行扩展即可,注意地址线位数的调整。

期末考试90%会在这里出一道选择题。题面类似于给你一些芯片让你扩展,之后问你某个地址所在的芯片所能表示的最大地址范围或者最小地址范围。这里到时候在B站录个讲解视频吧,方便大家学习。

3.3.5 高级DRAM结构

这里只提一下书上的一个概念:猝发式读取

只需要给出块的起始地址,然后对固定块长度的数据一个接一个地读出或写入

3.4 ROM和闪速存储器

ROM这里也很简略,记住一下几点即可

  • ROM不可以被写入,只能被读出
  • 凡是带ROM的存储器和闪速(FLASH)的存储器,速度都比RAM慢

3.5 并行存储器

  • 双端口存储器:空间并行(两组相互独立的读写控制电路)
  • 多模块交叉存储器:时间并行
3.5.1 双端口存储器

在这里插入图片描述

3.5.2 多体交叉存储器

我来解释一下这个名称哈。多体是指内存中存在多个存储模块,交叉是指取数据从多个存储模块交叉取数据,而不是从一个模块连续取数据。

我们通过对比一下两种方式来谈一谈为什么多体交叉方式更好

  • 顺序方式
  • 交叉方式

因为两种方式的地址总空间都是一样的,但各自的地址分配顺序是不同的。

在这里插入图片描述

顺序方式:前n位用来选择存储模块,后m位用来选择存储体内的地址
在这里插入图片描述

交叉方式:前m位用来选择存储体内的地址,后n位用来选择存储体
在这里插入图片描述

那交叉方式的好处在哪里呢?

当CPU要从主存中取数据的时候,顺序方式的流程是一次取一个数据块,经过总线的输送最终传到了CPU中。CPU使用完一个数据块以后,再从主存中传送下一个数据块。但在主存读出数据块后,经过总线传送到CPU这段时间内,主存也处于空闲状态,只有总线在忙活。假设T为一个数据块的存取周期的话,那么CPU获得一个数据块就需要花费时间T,这样就导致存储器的带宽降低。

而交叉方式则是CPU一次性告诉主存我要取M0,M1,M2,M3这四个数据块(同时访问四个模块),这样在总线传送M0块的时候,存储器忙着取下一个数据块了。假设总线的传送周期为t,数据块源源不断地从主存中取出,一个个排队等待总线的传送,所以每经过t时间,CPU就可以获得一个数据块。这样就会提升存储器地带宽,实现了存储器地并行存取。

在这里插入图片描述

我们定量分析一下多体交叉存储器:

假设模块存取一个字的存取周期为T,总线将数据传送到CPU的时间为t,交叉的模块数为m。

对于串行处理,一次存取一个模块,下一个模块需要等上一个模块存取完再被CPU访问。那么存取m个模块需要 m × T m×T m×T的时间

对于并行处理,必须满足 T = m × t T=m×t T=m×t,也就是在一个存取周期内能将其他所有模块都加载入内存。然后每经过时间t就可以读出一个模块的数据。其实就是第一个模块的存取需要花费时间T,其余模块都只需要花费t即可。那么存取m个模块需要的时间为 T + ( m − 1 ) × t T+(m-1)×t T+(m1)×t

交叉存储之所以会节省时间,是因为在一个模块存取的过程中,其他的模块也在存取,提高了存储器的带宽,也充分利用了CPU的并行性。

这里给大家举一个程序的局部性原理的例子

//假设M=1024,N=1024
//程序段A:
int sumarrayrows(int A[M][N])
{
int i, j, sum=0;
for  (i=0; i<M, i++)
	for (j=0; j<N, j++)  sum+=A[i][j];
  return sum;
}
//程序段B:
int sumarraycols(int A[M][N])
{
int i, j, sum=0;
for  (j=0; j<N, j++)
	  for (i=0; i<M, i++)  sum+=A[i][j];
     return sum;
}

如果我们内存中只能存放1024个int类型的数字的话,那么内存中只能存放一个以 A [ x ] A[x] A[x]为首地址的数组。因为A访问顺序为 A [ 0 ] [ 0 ] , A [ 0 ] [ 1 ] . . . , A [ M − 1 ] [ N − 1 ] A[0][0],A[0][1]...,A[M-1][N-1] A[0][0],A[0][1]...,A[M1][N1],每访问N次才需要换一次页,这样我们共需要缺页置换M次。

而程序段B则第一次访问 A [ 0 ] [ 0 ] A[0][0] A[0][0],第二次访问 A [ 1 ] [ 0 ] A[1][0] A[1][0]。这样每访问一次就要换一次页,我们共需要缺页置换N×M次

3.6 cache存储器(相联存储器)

先来一张intelCPU的cache(红色框出来的就是cache)

cache主要解决时CPU和主存之间速度不匹配的问题,一般来说主存太慢,CPU太快,CPU做完任务空闲了很长时间主存也没有完成他的任务。这时候就需要cache做一个缓冲:当CPU访问信息,先看看cache中是否存在该信息,再决定是否访问内存。若被访问信息在cache中,称为命中(hit),否则称为缺失或失靶(miss)

  • CPU和cache之间数据传输以为单位,通常为64字节
  • 主存和cache之间数据传输以为单位

感觉cache这部分还是很重要的,所以以下几个问题需要好好理解

  • 主存块和cache之间的映射方式

    全相联,直接相联,组相联

  • cache的替换策略

    FIFO,LRU,LNU,随机

  • cache的写操作策略

    写直达与写回

3.6.1 主存与cache映射

把主存划分为大小相等的块(block),把cache划分多个大小与block相等的槽(slot)。因为内存空间远远大于cache空间,所以block与slot一一对应那是不可能的。所以要采取映射方式来将内存映射到cache,假设我们地址是20位:

  • 全相联映射:主存块映射到cache的任意行

    在这里插入图片描述

    这种方式简单粗暴,每一个block与每一个slot相联,20位地址前11位用来选择block,后9位用来选择对应的字。

    这种方式匹配时间较长,需要不断遍历cache。

  • 直接映射:主存块映射到cache的固定行

    在这里插入图片描述

    这种方式也比较简单。第0块,第16块,第32块···都映射到第0槽上,映射关系就是简单的取余运算
    c a c h e 行 号 = 主 存 块 号   m o d   c a c h e 行 数 cache行号=主存块号~mod ~ cache行数 cache= mod cache
    前7位用来标记主存的组群,中4位标记组中的块号,后9位用来选择对应的字

    这种方式判断时间很短,但如果当前映射的位置已经满了而其他位置仍未空,就无法有效利用cache的空间

  • 组相联映射:主存块映射到cache的固定组中的任意行

    这种方式综合了直接和全相联映射的方式。首先先将一组主存块固定映射到一组cache槽,然后组内进行全相联映射
    c a c h e 组 号 = 主 存 块 号   m o d   c a c h e 组 数 cache组号=主存块号~mod~cache组数 cache= mod cache
    前8位用来标记主存的块群,中3位用来对应的cache组,后9位还是选择对应的字。

    在这里插入图片描述

我们来最后总结一下:

  • 全相联的映射关联程度最高,一个块与所有的cache槽都有对应。同时缺失率最低,命中时间最长
  • 直接相联的关联程度最低,一个块只对应一个cache槽。同时缺失率最高,命中时间最短
  • N-路组相联映射一个块对应N个cache槽

命中率与哪些因素有关?

:程序的行为、cache的容量、组织方式、映射方式

3.6.2 替换策略(操作系统讲过)

FIFO:先入先出呗

这里FIFO的命中率并不随组的增大而提高

LRU:记住一个原则:访问过该行的计数器为0,其他行因为没被访问就加一。计数器值越大说明越久没被访问

LFU:替换引用次数最少

3.6.3 写操纵策略

写操作就是要修改某个数据。当我们cache命中后,如果CPU修改了cache中的数据而没有修改内存中的数据,那么就会引起程序的错误。所有为了使cache和主存内容保持一致,我们有两中写操作策略:

  • 写直达法:写命中时,cache与内存一起修改

  • 写回法:写命中时,只修改cache的内容,而不立即写入主存,只有此行被换出时才写回主存。

3.6.4 命中率

我们假设 t c t_c tc表示命中时cache的访问时间, t m t_m tm表示未命中时的主存访问时间, h h h表示命中率,那么系统平均访问时间
t a = h t c + ( 1 − h ) t m t_a=ht_c+(1-h)t_m ta=htc+(1h)tm
我们用 e e e表示存取效率(访问cache的时间除以实际花费的时间),则有
e = t c t a = t c h t c + ( 1 − h ) t m ) e={\frac{t_c}{t_a}}={\frac {t_c} {ht_c+(1-h)t_m})} e=tatc=htc+(1h)tmtc)

本章小结

  • 对存储器的要求是容量大、速度快、成本低。为了解决这三方面的矛盾,计算机采用多级存储体系结构,即cache、主存和外存。
  • CPU能直接访问cache和主存,但不能直接访问外存。
  • 存储器的技术指标有存储容量、存取时间、存储周期、存储器带宽。
  • 广泛使用的SRAM和DRAM都是半导体随机读写存储器,前者速度比后者快,但集成度不如后者高。二者的优点是体积小,可靠性高,价格低廉,缺点是断电后不能保存信息。
  • ROM弥补了SRAM和DRAM的缺点,即便断电仍然保存已写入的数据。
  • 双端口存储器和多模块交叉存储器属于并行存储器结构。前者采用空间并行技术,后者采用时间并行技术。
  • cache是一种高速缓冲存储器,是为了解决CPU和主存之间速度不匹配而采用的一项重要的硬件技术,并且发展为多级cache体系,计算机系统的目标是使cache的命中率接近于1。
  • 主存与cache的地址映射有全相联、直接、组相联三种方式。其中组相联方式是前二者的折衷方案,适度地兼顾了二者的优点,从灵活性、命中率、硬件成本来说较为理想。
  • 虚拟存储器

推荐阅读:What Every Programmer Should Know About Memory

  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值