【计算机组成原理-chapter3】存储系统

文章目录

1. 存储系统的基本概念

1.1 存储系统的分类

1.1.1 按层次结构分

在这里插入图片描述

注意:

  1. 主存-辅存:解决主存容量不够的问题。
  2. cache-主存:解决主存与CPU速度不匹配的问题。
  3. cache和主存都可以直接与CPU交换数据,而辅存必须先加载到主存后才能被CPU访问。
  4. cache-主存是由硬件自动完成,所以其数据交换对任何程序员都是透明的。
    主存-辅存是由硬件+操作系统完成,所以其数据交换并不是对任何程序员都透明。

1.1.2 按存储介质分

* 按存储介质分类
	1. 半导体存储器(主存、cache)
	2. 磁表面存储器(磁盘、磁带)
	3. 光存储器(光盘)

1.1.3 按存取方式分

* 按存取方式分
	1. 按地址寻址
		1. 随机存储器(RAM): 读取任何一个存储单元所花时间相同,与存储单元所在物理位置无关。比如,内存
			1. 动态随机存储器(DRAM):用做主存
			2. 静态随机存储器(SRAM):用做Cache
			* DRAM和SRAM的具体信息在下面会介绍
			* 特别的,ROM也能随机存储
		2. 顺序存储器(SAM): 读取一个存储单元所需时间取决于其物理位置。比如,磁带
		3. 直接存储器(DAM):既有随机存储,又有顺序存储的特性。先直接选取信息所在区,然后顺序存取。比如,磁盘。
	2. 按地址或者内容寻址
		1. 相联存储器:可以按照内容检索到存储位置进行读写,比如,快表

1.1.4 按信息的可更改性分

* 按信息的可更改性分
	1. 只读存储器(ROM): 只能读,不能写。比如BIOS就存放在ROM中
	2. 读写存储器:即可读,又可写。

1.1.5 按信息的可保存性分

* 按信息的可保存性分
	1. 断电后
		1. 易失性存储器:信息丢失。
		2. 非易失性存储器:信息不丢失。
	2. 读取信息后
		1. 原存储信息被破坏,需要重写。比如DRAM芯片
		2. 原存储信息不被破坏,比如SRAM芯片、磁盘、光盘

1.2 存储系统的性能指标

* 性能指标
	1. 存储容量
	2. 每位价格:注意是每bit
	3. 存储速度 = 存储字长/存储周期

在这里插入图片描述

注意:

  1. 这3个指标相互制约,目标是高容量、低价格、高速度
  2. 存取时间不等于存取周期,前者小于后者。
    存取时间:从存储器读出或者写入一次信息所需要的平均时间。
    存取周期:连续两次访问存储器之间所必须的最短时间间隔。
  3. DRAM需要进行“刷新"操作,所以其恢复时间会比较长。
  4. 恢复时间内CPU不可以对该存储体进行访问【如果有多个存储器】,但是能对其他存储器进行访问。

1.3 小结

在这里插入图片描述

2. 半导体随机存储器

2.1 主存储器的基本组成(DRAM)

2.1.1 DRAM半导体元件的原理

DRAM半导体常用来做主存。主存中的存储元是半导体元件,即给高电压时器件是通的,给低电压时,器件是阻塞的。

而存储元由MOS管 和 电容两个元器件组成,其实现读写的原理如下:
在这里插入图片描述

2.1.2 主存储器芯片的基本原理

存储器的内部电路如下:
在这里插入图片描述
对存储矩阵进行优化,使用行列地址,加快数据的访问(行列地址都是原来的一半):
在这里插入图片描述

注意:DRAM会使用行列地址复用技术,所以DRAM的地址线是以前地址线的一半,即n/2。SRAM还是n条地址线。如果采用了地址复用技术,则会增加行通线和列通线(片选线用行通线代替)。【做题时,默认DRAM使用地址复用,而SRAM没有,这是很多考生忽略的地方】
在这里插入图片描述

存储器的简化电路如下:
在这里插入图片描述

注意:

  1. 一般容易出芯片有多少个引脚的题目。即 地址线数 + 数据线数 + 1根片选 + 读写线数, 一般读写控制线题目会说是1根还是2根。
  2. 译码驱动电路是用来将信号放大的,防止信号衰落。

2.1.3 实现不同的寻址

现代计算机按字节编址,但是通常都支持按字、半字、按字节寻址,但是最终都会转为按字节编址。如果一台计算机的存储字长为32位,则一个字 = 32bit, 半字 = 16bit。则访问字转为字节时,是对应二进制数左移2位(32bit/8=2^2, 是2次方所以左移两位);同理半字转为字节是左移1位。下面是该例子的示意图:
在这里插入图片描述

2.1.4 小结

在这里插入图片描述

2.2 DRAM和SRAM

DRAM指动态随机存储器,使用栅极电容存储信息。
SRAM指静态随机存储器,使用双稳态触发器存储信息。
两者的区别是存储元不一样。

2.2.1 DRAM和SRAM的存储元

上面我们介绍了DRAM的组成,接下来,我们对比着介绍一下SRAM的组成:
在这里插入图片描述

2.2.2 DRAM和SRAM的对比

在这里插入图片描述

注意:

  1. 破坏性读出:由于DRAM使用的是电容,读取信息后,电容中的电荷被释放了,如果是1会变成0,会造成破坏;而双稳态触发器不会。
  2. 读取后需要重写:由于DRAM是破坏性读出,所以为保证不被破坏需要重写。
  3. 运行速度:由于DRAM读后需要重写,比SRAM多一步操作,所以更慢。
  4. 集成度:DRAM比较慢,需要集成。
  5. 发热量:SRAM有六个触发器,所以功耗大。
  6. 存储成本:SRAM更快,所以更贵。
  7. 刷新:DRAM是电容,电荷会慢慢消失,所以需要刷新,保持电容电荷。而其刷新分为三种:
    1. 分散刷新
    2. 集中刷新
    3. 异步刷新
    * 注意:刷新是由存储器独立完成的,并不需要CPU控制。
  8. 送行列地址:由于DRAM会使用地址复用的技术,地址线引脚数目减半,所以会先传行地址,再传列地址,需要两次。
    注意:DRAM的地址引脚数目会减半,在做引脚体数目的题时特别注意。

2.2.3 DRAM的刷新

在这里插入图片描述

注意:

  1. 分散刷新,机器的存取周期中的存取时间用来读写,恢复时间用来刷新,因此不存在死时间。
  2. 集中刷新和异步刷新都存在死时间,异步刷新缩短了死时间。
  3. 在工作中DRAM的内容会产生变化。错误,可以通过刷新机制解决。

2.3 ROM

在这里插入图片描述

注意:

  1. 可能你会疑惑,ROM是只读存储器,为什么EPROMFlas MemorySSD还可以写?传统的ROM确实是只读,但是由于历史的发展,使得很多为归类为ROM的芯片也能写。
  2. 闪存的写比读慢,因为它需要先擦除数据。
  3. EPROM虽然可以读写数据,但是改写较为繁琐,写入时间很长,且速度慢,所以不能作为随机存储器。

我们知道,电脑在断点后主存和cache的数据都会丢失,那么开机时,加载操作系统的指令从哪里来?

电脑主板上有一个叫做BIOSROM芯片,专门用来做这个事情的。

虽然,BIOS主存的DRAM在主板的不同位置,但是我们认为在逻辑上主存 = DRAM + ROM,且两者统一编址。在做题时特别注意。

3. 主存与CPU的连接

3.1 单块存储芯片与CPU的连接

在这里插入图片描述

现在计算机中,MDR和MAR通常放在CPU中,做题时放在主存和CPU都可以算对。

在这里插入图片描述

3.2 多块存储芯片与CPU的连接

3.2.1 位扩展

如果数据总线的位数大于单块存储芯片的位数【注意是位数】,则需要进行位扩展,从而充分利用总线位数,提高系统效率。
在这里插入图片描述
位扩展的核心:多块存储芯片共享地址、片选信号和读写信号。

3.2.2 字扩展

3.2.2.1 线选法

在这里插入图片描述
线选法的字扩展核心:芯片共享地址信息和读写信息,芯片的CS分别由CPU的一位地址位控制。
缺点:CPU连接芯片的CS的地址线不能同时为0或者1。

3.2.2.2 片选法

在这里插入图片描述
线选法的字扩展核心:芯片共享地址信息和读写信息,CPU用多位地址线经过一个译码器与芯片的CS相连。
优点:解决了线选法的缺点

3.2.2.3 小结

在这里插入图片描述

3.2.3 字位扩展

同时出现位不足,和地址过多的现象,所以同时采用位扩展和字扩展,即字位扩展:
在这里插入图片描述

3.3 小结

在这里插入图片描述

3.4 关于译码器知识的补充

在这里插入图片描述

4. 双端口RAM和多模块存储器

在这里插入图片描述

双端口RAM和多模块存储器就是来解决以上两个问题的。

4.1 双端口RAM(一个内存条提高CPU访问速度)

双通道RAM是指同一个存储器有左右两个独立编址,分别具有两组相互独立的地址线、数据线和读写控制线,允许两个独立的控制器同时异步的访问存储单元。
在这里插入图片描述

4.2 多模块存储器(多个内存条提高CPU访问速度)(时间并行)

4.2.1 多体并行存储器(高位交叉编址、低位交叉编址)

在这里插入图片描述
高位交叉编址,相对于只是对存储体进行了扩容,而低位交叉编址在扩容的同时也提高了速度,理想为T/r倍。

高位m体交叉编址和低位m体交叉编址都是每次读取m个模块,时间上并行。

如果采用低位交叉编址的方式,具体该选几个存储体?
在这里插入图片描述

4.2.2 单体多字存储器(空间并行)

在这里插入图片描述
单体多字存储体使得一次能读取m个字【若存储体为m】,速度的提示和低位交叉编址的多体并行存储体差不多,都是T/r

但是,单体多字存储体不够灵活,比如上图,访问这四个连续的字,CPU需要读取两次,而低位交叉比较灵活,可以克服这个缺点。

4.3 小结

在这里插入图片描述

实际应用:如何让电脑变成“双通道”
在这里插入图片描述

5. Cache

5.1 Cache概述

5.1.1 程序访问的局部性原理

  1. 时间局部性:正在使用的信息等会可能还需要用到。比如for循环
  2. 空间局部性原理:与正在使用的信息在物理位置上相邻的信息等会可能用到。比如,数组

5.1.2 cache工作原理

我们知道CPU工作的速度原高于其访问主存的速度,这就拉低了CPU的工作效率,所以我们在CPU与主存间设置一个更加高速的cache,即cache-主存结构,用来解决CPU与主存速度不匹配的问题, 即加速CPU对主存的访存操作。

cacheSRAM(静态随机存储器)组成,容量和体积都比主存小,所以现在计算机中,cache通常放在CPU内部。

基于程序局部性原理,可以把CPU目前访问的地址“周围”的部分数据【即主存块】复制一份到cache中。

那么上述的周围具体如何定义?

通常会将cache和主存以同样大小进行分块,比如1KB为一块, 那么cache和主存之间以块为单位交换数据,一旦主存中的某个信息被CPU之间访问,则立即将该信息所在块复制一份到cache中。

注意:通常主存的“块”又叫“页/页面/页框”,cache的块又叫“行”

如果主存中某块被复制到cache的块中,那么CPU访问cache时,如何知道cache的哪个快对应着主存的哪个块?

这就需要我们在将主存块复制到cache时,要标记主存块的信息,即标记位。然后再用1位来表示有效位,如下图所示:
在这里插入图片描述

具体标记位的位数与cache与主存的映射方式有关,后面会介绍。

5.1.3 性能分析

通常使用平均访问时间来衡量cache的性能:
在这里插入图片描述

注意:cache的平均访问时间有两种公式,注意看清题目给的是同时还是非同时。

在这里插入图片描述

5.1.4 小结

在这里插入图片描述

5.2 cache与主存的映射方式

cache与主存以块为单位进行数据交换,那么主存的块映射到cache的哪一个块?也就是CPU要进行访存操作时,如果知道Cache中是否有相应的信息?主要有以下三种方式:

  1. 全相联映射:指主存块可以放在cache块的任意地方
  2. 直接映射:每个主存块只能映射到一个特点的位置 cache块号 = 主存块号 % cache块总数
  3. 组相联映射:几个cache块组合,变成cache组,每个主存块只能放在cache的特定组,而组内位置是任意的。 组号 = 主存块号 % 分组数

5.2.1 全相联映射(任意放)

在这里插入图片描述

注意:全相联映射中,cache的标记信息为对应主存块号。

CPU访问想访问主存信息时:

  1. CPU会遍历所有cache块的标记位,看是否有相应的主存块号
  2. 若标记匹配且有效位=1,则cache命中。
  3. 若未命中或者有效位=0,则正常访问主存。

优点:cache空间利用充分,命中率高
缺点:查找标记最慢。

5.2.2 直接映射(放在特定位置)

在这里插入图片描述

注意:当cache的块数为2^n时,可以优化cache的标记位数。

CPU访问想访问主存信息时(拿上图举例):

  1. 根据主存块号的后3位确定cache块。
  2. 若主存块的前19位cache标记匹配且有效位=1,则cache命中。
  3. 若未命中或者有效位=0,则正常访问主存。

优点:查找标记快
缺点:cache空间利用率低,命中率低

5.2.3 组相联映射(组特定,组内任意)

在这里插入图片描述

注意:和直接映射类似,当cache的组数为2^n时,也可以优化cache的标记位数。

CPU访问想访问主存信息时(拿上图举例):

  1. 根据主存块号的后2位确定cache组。
  2. 遍历该组内的所有标记,若主存块的前20位组内某个标记匹配且有效位=1,则cache`命中。
  3. 若未命中或者有效位=0,则正常访问主存。

组相联映射是全相联映射与直接映射的结合,所以其综合效果最好。

5.2.4 小结

在这里插入图片描述

5.3 Cache块的替换算法

Cache很小,主存很大。如果Cache满了怎么办?这就需要相应的块被替换,具体有RANDFIFOLRULFU

注意:由于直接映射的位置是固定的,所以直接映射不需要考虑替换算法,只有全相联映射和组相联映射才考虑替换算法【在cache块满的情况下才考虑】。

5.3.1 随机算法(RAND)

在这里插入图片描述

5.3.2 先进先出算法(FIFO)

在这里插入图片描述

5.3.3 近期最少使用算法(LRU)

在这里插入图片描述

5.3.4 最不经常使用算法(LFU)

在这里插入图片描述

  1. 命中时,所命中的计数器清零,比其低的计数器+1,其余不变。
  2. 未命中且还有空闲时,新装入的块的计数器置0,其余非空闲+1
  3. 未命中且无空闲时,计数值最大的块的信息被替换,计数器置0

5.3.5 小结

在这里插入图片描述

注意:

  1. 以上都可能发生抖动现象:频繁的换入换出现象。
  2. 只有LRU用到了程序的局部性原理,其他的都没有,所以其效果最好。
  3. 若Cache块的总数为2^n,则LRU的计算器的位数 = n

5.4 写策略

CPU修改了cache中数据副本,如何确保主存中数据母本的一致性?这就需要用到写策略:写命中与写不命中。

5.4.1 写命中

写命中指:CPU对某个地址要进行写,且该地址的数据已经被复制到cache中。

5.4.1.1 写回法

写回法:当CPU对cache写命中时,只修改cache的内容,而不修改内存的内容,只有当此块被换出的时候才写回主存。

优点:减少了CPU访问主存的次数
缺点:存在数据不一致的问题

特别需要注意的是cache还需要增加一个标记位,即脏位,为1表示要写回。

5.4.1.2 全写法

全写法:当CPU对cache写命中时,将数据同时写入cache和主存,通常使用写缓冲。

缺点:增加了CPU访问主存的次数
优点:能保证数据的一致性

在这里插入图片描述

如果使用写缓冲,则CPU是将数据直接写入cache和写缓冲区,在CPU做其他事情的时候,由一个专门的电路将写缓冲中的数据写入到主存中
使用写缓冲有一个缺点,就是在CPU频繁写的时候,回使得写缓冲饱和,使得CPU阻塞,不得不停下手中的事情,来立即写回数据。

5.4.2 写不命中

写命中指:CPU对某个地址要进行写,而该地址的数据没有被复制到cache中。

5.4.2.1 写分配法

当CPU对Cache写不命中时只写入主存,把主存中的块调入Cache,在Cache中修改。通常搭配写回法使用。

5.4.2.2 非写分配法

当CPU对Cache写不命中时只写入主存,不将主存中的数据调入Cache。通常搭配全写法使用。

注意:非写分配法,只有“读”未命中才调入Cache

5.4.3 多级Cache

在这里插入图片描述

5.4.4 小结

在这里插入图片描述

6. 虚拟存储系统

6.1 页式存储

页式存储:一个进程在逻辑上被分为若干个大小相等的“页面”,“页面”大小与主存块的大小相同。每个页面可以离散的放入不同的主存块中。

6.1.1 地址转换

我们编写的程序通过翻译程序生成的一系列指令,其中指令的地址码使用的是逻辑地址。【因为每次将程序加载到主存的位置是不一样的,我们不可能提前预知进程被放在哪里,所以只能是逻辑地址】
这就导致CPU执行的机器指令中的地址码使用的是逻辑地址,因此需要通过页表将逻辑地址转为物理地址。【页表里面记录了每个逻辑页面放在哪个主存块中】

注意:

  1. 逻辑地址(虚地址):指程序员视角看到的地址。
  2. 物理地址(实地址):实际在主存中的位置。

逻辑地址转为物理地址流程如下:
在这里插入图片描述

6.1.2 快表(TLB)

如果我们想加快地址转换的速度,该怎么做?结合CPU利用Cache加快访问主存速度,不难想到,如果我们可以弄一个访问速度更快的快表,在进行地址转换时,先到快表中查相应的主存块号,如果有则直接地址转换;如果没有,则到页表里面去查,然后将相应的信息复制一份到快表中。

增加快表后的地址转换:
在这里插入图片描述

注意:访问快表比慢表(即页表)更快的原因:

  1. 快表是放在一个SRAM存储器中
  2. 快表是一种“相联寄存器”,可以按内容寻址,所以像这种根据内容逻辑号查找对应的主存号会更快。

在这里插入图片描述

6.2 虚拟存储器

主存和辅存一起构成虚拟存储器,虚拟存储器拥有主存的速度和辅存的容量。

6.2.1 页式虚拟存储器

页式虚拟存储器:我们可以把程序拆分成一个个与主存块大小相同的页面,然后以页为单位,将部分页面先调入主存。

虚拟地址 = 页号 +页内地址

页面字段:
在这里插入图片描述

6.2.2 段式虚拟存储器

页式虚拟存储器:按照功能模块将程序分成多个段,然后以段为单位,将部分段先调入主存。

虚拟地址 = 段号 + 段内地址

6.2.3 段页式虚拟存储器

段页式虚拟存储器:按照功能模块将程序分成多个段,再将段分成一个个与主存块大小相等的页面,然后以页为单位,将部分页面先调入主存。

虚拟地址 = 段号 + 段内页号 + 页内地址

7. 补充

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  1. 存储容量128KB指 128K×8, 后面的B是字节,所以是8位
  • 5
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ElegantCodingWH

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值