408复习笔记——计算机组成原理(三):存储系统

408笔记系列(十一)(PS:本人使用的是王道四本书和王道视频)


前言

学习完数据的表示和运算后,我们再重新回到第一章中介绍的计算机系统结构,当时,我们初步认识了计算机的几个主要组成部件:存储器、运算器、控制器以及输入输出设备,以及冯诺依曼体系结构;那么接下来,我们将更加深入的学习这几个计算机主要组成部件;


一、简介

从冯诺依曼的体系结构我们知道存储器是一开始数据和程序存放的地方,是计算机中不可或缺的一部分;在第二章中,我们知道计算机的存储器被划分为主存储器和辅存储器,而且辅存储器我们一般将其视为一种外设;那么主存储器和辅存储器之间是如何协调工作,他们又有那些区别,这些都需要我们接下来这一章慢慢展开介绍;

二、主要内容

1. 存储器的组成

在计算机中,我们的存储器其实除了主存和辅存外,还有一些其他的存储器,我们先看一下计算机的多级存储结构:
在这里插入图片描述
可以看到,CPU中的也有存储器,我们称之为寄存器;主存储器中的存储器包括高速缓存(Cache)、主存以及磁盘缓存;在辅存中的存储器包括磁盘和可移动存储介质,其实就是我们常见的U盘了;

我们分别来介绍这几种存储器吧!

首先是寄存器,其实我们之前说过寄存器,像MAR(地址寄存器),MDR(数据寄存器)等等,寄存器之所以能在CPU中,主要因为他比较小,还记得之前说到的机器字长吗?他代表的就是CPU的运算器中通用寄存器的位数了,一般都是以位作为单位的,此外就是寄存器的造价是非常昂贵的,因此它的访存速度也是最快的了;

接下里是主存储器中的高速缓冲存储器,这个需要结合主存一起来说,我们知道计算机中CPU的速度是非常快的,但是他需要从主存中拿程序和数据,但是主存的速度相较于CPU的速度太慢,这样会严重拖累CPU的运行速度,因此本着能省就省的原则,大佬们觉得能省点时间就一定要省点时间,Cache便应运而生,Cache比主存快,所以比主存贵,但是又比主存小,因此计算机将主存数据的部分备份放在到Cache中,让计算机访存时不仅访问主存时,不仅访问主存还访问Cache,那要是访问到不就赚了嘛,由于程序本身是具有局部性的,所以这样的访问方式的命中率往往是非常高的;这样便可以帮助解决主存和CPU之间速度不匹配的问题;是不是很有意思!!!我们在这章的后面还会详细的学习Cache具体是如何实现的,因为主存和CPU之间是纯硬件实现的,所以对各类程序员都是透明的;

之后便是我们的辅存部分的磁盘了,磁盘缓存是放在主存的,大家可能会有点疑惑,其实这里主存和磁盘之间也有着像主存和CPU一样的缓存装置,而这又是为什么呢?这里的主要矛盾并不是速度不匹配的问题,这里其实是一个容量问题,我们都知道磁盘是很大的,有的甚至有1T,但是我们主存往往都是比较小的,最常见的像8G内存,16G内存等等,但是你有想过一个问题吗?你有的时候一个游戏得有几十个G,你那16内存是怎么装下的呢?其实就是因为我们的游戏等等应用程序是放在磁盘里面的,当我们启动的时候,操作系统帮计算机将该应用程序调用到内存中,让这个游戏的部分程序在内存中运行起来了!这部分内容会在本章后面和操作系统中详细介绍的;因为这里主存和磁盘是通过操作系统实现的,因此对于系统程序员而言,这是可见的;

最后是我们的可移动存储介质,像U盘、光盘、固态硬盘等等,这类存储器我们日常生活中见的最多,他们往往有一个特点就是写的速度要比读的速度慢,原因我们会在之后解释到;

2. 存储器的分类

存储器除了上面的分类,我们也会根据其存储介质、存取方式以及信息的可保存性进行分类;

按照存储介质,我们会划分为磁表面存储器、半导体存储器和光存储器;

按照存取方式,我们会划分为随机存储器、只读存储器和串行访问存储器,其中串行访问存储器又划分为顺序存取存储器和直接存取存储器;

按照信息可保存性划分为易失性存储器和非易失性存储器,指的是断电后存储信息是否会消失;也可以划分为破坏性读出存储器和非破坏性读出存储器

接下来,我们会对第一小节的存储器进行分类,这里不包含CPU中的寄存器:

存储器存储器类型
高速缓冲存储器(Cache)半导体存储器、随机存储器、易失性存储器、非破坏性读出存储器
主存半导体存储器、随机存储器和只读存储器、易失性存储器和非易失性存储器、破坏性读出存储器和非破坏性读出存储器
磁盘磁表面存储器、只读存储器、串行访问存储器中的直接存取存储器、非易失性存储器、非破坏性读出存储器
可移动存储介质磁表面存储器(磁带)和光存储器(光盘)和半导体存储器(U盘)、只读存储器和串行访问存储器、非易失性存储器、非破坏性读出存储器

上面我们在后面都会有解释,这里是一个整体的汇总;接下来我们就来解释一下为什么会这么划分?

  • Cache
    我们一般用什么来组成Cache呢?——SRAM,静态随机存储器,所以解决了第一个点:为什么Cache是随机存储器?那么SRAM又是什么呢?SRAM的存储元是双稳态触发器,就是下图那个鬼样子,你不用管他电路怎么回事,但从他的名字我们可以知道它是一种稳态的,因为它用到的是一种MOS管,信息被读出后依然可以保存原状态,所以解决了第二个点,为什么Cache是非破坏性存储器?从下图可以看出这是一个电路,所以当突然断电后,存储器中的信息无法保存而消失,所以解决了第三个点:为什么Cache是易失性存储器?至于半导体存储器主要因为MOS管是一种半导体;
    SRAM的特点便是存取速度快、但是集成度低,功耗大,一般用于组成高度缓冲存储器;
    在这里插入图片描述
  • 主存
    我们一般会用DRAM(动态随机存储器)来组成主存,和Cache一样,都是随机存储器,也就解决了第一个问题;DRAM的组成单元是栅极电容,如图所示,可以看到接地处的C是一个电容,我们知道电容是用来存储电荷的,因此主存也是一个半导体存储器,而当断电后,电容中的电荷便会消失,因此主存也是一个易失性存储器,电容中的电荷在通电后就是通过数据线流出,当电容中有电荷则将数据线输出为1,若电容中没有电荷,则将数据线输出为0,但是输出后,电容中的电荷便会消失,因此,主存又是一种破坏性读出存储器,那电容中的电荷消失后我们又是怎么处理的呢?这里就需要引入DRAM的刷新周期,DRAM一般每隔2ms都会对电容进行按行刷新,这种刷新方法我们称之为集中刷新,但是集中刷新会导致主存中出现一个较长的“访存死区”,在“访存死区”时间内,不能访问存储器;为了避免这个问题,又提出两种刷新方法:分散刷新和异步刷新;
    在这里插入图片描述
    分散刷新指的是将每行的刷新分散到各个工作周期中,存储系统的工作周期分为正常读写和刷新,存储器中没有死区,但是增加了系统的存取周期,降低了整机的速度;
    异步刷新指的是将2ms的刷新周期除以行作为两次刷新操作之间的时间间隔t,每隔时间t产生一次刷新请求;缩短了“死区时间”也提高了整机速度;
    这里还有一点需要注意的是,主存因为比较大,因此我们对DRAM采用地址复用的技术,地址线为原来的1/2,地址信号分行列两次传送,此时片选线分为行选通线和列选通线两根
    此时你一定很疑惑,这解释的还不全呀!还有很多相对的啊?其实主存还包括一个我们十分熟悉的BIOS芯片,存储的是“自举装入程序”,负责引导装入操作系统,而BIOS一般都是在辅存中的,逻辑上是主存的一部分,而BIOS芯片是只读存储器、非易失性存储器和非破坏性读出存储器;
    在这里插入图片描述
    以上是DRAM和SRAM的区别;

之后的磁盘和可移动存储介质一般为只读存储器包括以下几种:掩模式只读存储器(MROM)、一次可编程只读存储器(PROM)、可擦除可编程只读存储器(EPROM)、闪存(FM)和固态硬盘(SSD),其中EPROM又包含紫外线擦除(UVEPROM)和电擦除(E2PROM);

3. CPU与主存

上面我们已经比较详细的介绍了主存的组成,以及主存的分类,那么CPU与主存是如何连接以及主存在容量和速度上有没有方法可以更好的提升呢?

那么我们首先看主存有没有可能扩容呢?我们可以通过增加存储芯片和改变连线的方式来对主存进行位扩展、字扩展和字位同时扩展;

位扩展指的是对存储子长进行扩位,使得主存存储字长与CPU的数据线保持一致;字扩展指的是通过片选信号来区分各芯片的地址范围;
在这里插入图片描述
CPU地址线的低位与存储芯片的地址线相连,以选择芯片中的某一个单元,CPU地址线的高位则在扩充存储芯片时使用,用来选择存储芯片,这部分由外接译码器实现;

这里值得注意的是,MAR的位数只需主存的地址空间有关,因为存储芯片可以通过增加芯片的方法进行扩容,CPU地址线低位是与存储芯片的地址线保持一致的

我们知道主存的速度相较于CPU是要慢很多,那么有什么样的方法可以让CPU在访问主存的时候变得更快呢?这里我们给出三种解决方案:双端口RAM,单体多字存储器和多体并行存储器;

此前我们需要知道一个概念:存储周期与存取时间;我们知道DRAM会需要刷新,因此在从主存中取出后,会有一段恢复时间,所以存储周期是大于存取时间的;

  1. 双端口RAM
    双端口做了什么呢?你不是要提速吗?那好呀!你直接两个CPU一起访问主存,那速度肯定就上来了啊,一个慢,两个不就快了嘛!想法很不错,但是现实往往很骨感!当然这针对的是多核CPU啊,单核的就不要想了啊!

那么这个想法有什么问题呢?首先两套相互独立的地址线、数据线核读写控制线,这便使得硬件设计更加困难,并且当两个CPU同时对相同地址进行访存时,在以下两种情况下便会发生错误:

1). 两个端口同时对同一地址单元写入数据;
2). 两个端口同时对同一地址单元操作,一个写入数据、一个读出数据;

在这里插入图片描述

  1. 单体多字存储器
    单体多字其实做的就是增大了存储器的宽度,提高了单体存储器的工作速度,但是缺点也是很明显的:指令和数据在主存内必须是连续存放的,一旦遇到转移指令。或操作数不能连续存放,这种方法效果便不明显;
    在这里插入图片描述
  2. 多体并行存储器
    多体并行存储器划分为两种:高位交叉多体并行存储器和低位交叉多体并行处理器;
    首先是高位多体交叉并行处理器,
    这里CPU总是按顺序访问存储模块,存储模块不能并行访问,因而不能提高存储器的吞吐率,模块内的地址是连续的,存取方式仍然是串行存取,因此依然是顺序存储器;但是高位四体交叉存储器也可能在一个存储周期内连续访问四模块的,只是可能性非常低
    在这里插入图片描述
    低位交叉编址相较于高位交叉编址,采用流水线的方式并行存取,提高了存储器的带宽;从上图可以看出通过低位交叉编址,四个存储器对应的十进制数对4取模都是一样的,而由于计算机程序存在着局部性的原理,从冯诺依曼的体系结构我们也可以看出程序是按照规定的顺序执行其他指令;所以当从一个存储器中存取数据后,我们可以直接从下一个存储器进行数据的存取,而不会因为主存的恢复时间等待该存储器的存储周期结束,同流水线的模式一样,可见下图:
    在这里插入图片描述
    这样若存储周期为T,总线的传送周期为r,连续存取m个字的时间便是T+(m-1)*r;这里需要注意的是,交叉存储器的模块数应当大于等于T/r,虽然存储器可以在r时间内向CPU提供一个存储字长的二进制信息,但是每个存储体必须要经过T才能向CPU提供一个存储字长的信息;

4. 高速缓冲存储器和虚拟存储器

这里可以说是整个计算机组成原理里面出大题非常频繁的地方了,但是当我们理解后,这里的大题其实也非常的常规,并且考察的知识点也是非常套路啦!

这里高速缓冲存储器和虚拟存储器解决的是两件事:CPU和主存之间的速度不匹配以及主存的容量问题;其实我们刚刚复习的双端口RAM、单体多字存储器和多体并行存储器都是在帮助我们提高CPU访存的速度,但是这种程度的提高并不能满足现实的需求,因此我们在主存和CPU之间增加了高度缓冲存储器,也就是Cache,由于Cache的集成度较低,我们不可能造一个和主存一样大的Cache,因为这样不现实,所以结合计算机程序所特有的局部性原理,我们将主存中的部分副本放在Cache中,让CPU在访存时先访问Cache,如果Cache中有该内容,便不需要再去访问主存了,从而提高计算机的整体速度;虚拟存储器其实和Cache是相同的原理,虚拟存储器位于主存和磁盘之间,既然是虚拟存储器,那这个存储器便是不存在,他只是提供一个虚拟地址,而我们在编程中使用的便是这样的虚拟地址,首先我们对磁盘和主存都进行了分页,以相同大小的页进行划分,之后在主存中会有一张页表用来记录主存中页在磁盘的页框号与主存中页框号的对应关系,拿到虚拟地址后我们会去查询页表,看该地址是否已经放入主存,如果已经在主存中,那么我们就把虚拟地址变为物理地址,再对Cache或者主存进行高度缓存的那一套;这里因为页表是存放在主存中的,而我们知道访问主存是很慢的,所以我们又在页表和CPU之间加入了TLB,又称快表,与此相对应,我们就将页表称之为慢表啦!CPU先访问TLB,如果TLB中有则不再访问慢表;这里值得注意的是TLB是一个相联存储器,因为TLB往往内容是非常少的,所以使用相联存储器可以直接对内容进行快速查询;
在这里插入图片描述

以上便是CPU访存时在存储器中发生的一个大概的过程,过程如上图所示,现在我们来看细节:

  1. Cache是主存的副本,那么Cache如怎样映射主存的内容的呢?难道就是单纯的从主存中取出一部分作为Cache?那么我又怎么知道取出的是那一部分呢?,我要找的数据在这一部分的那里呢?
  2. Cache既然主存小很多,那么Cache满了怎么办呀?
  3. 你之前在双端口RAM就说过两次写同一个地址会出问题,那么你现在Cache是主存的副本,那我要是对Cache或者主存进行了写操作,数据不一致怎么办呢?

首先是第一个问题,我们的映射方式分为三种:直接映射、全相联映射和组相联映射;这里我们需要知道我们将Cache和主存就像主存和磁盘分页一样,按照块进行划分,我们也将Cache中的一块称之为一行;
在这里插入图片描述
首先是直接映射方式,直接映射其实是对每一个主存地址进行取模,得到相同余数的就是都放在Cache对应余数的位置,如图所示,分为三个部分:标记、行号和块内地址;
在这里插入图片描述
全相联映射方式其实很简单,就是主存的块可以往Cache中随便放,想放哪里都可以!!!所以全相联映射的地址结构只有标记和块内地址;
在这里插入图片描述
组相联映射其实就是把全相联映射和直接映射结合了起来,直接映射不再是一个主存块只对应一个Cache块了,而是几路组相联映射就对应几个Cahce块;此时我们的地址结构便划分为标记、组号和块内地址;
在这里插入图片描述
第二个问题其实也是适用于页表以及快表,我们称之为替换策略,包括随机算法、先进先出算法(FIFO)、最近最少使用(LRU)和最不经常使用(LFU)

随机算法就是随机的替换,不解释;先进先出直接联想队列,不解释;主要我们需要知道的是最近最少使用,他为一个组中的每一行都添加了一个计数器,我们也称之为替换控制位,计数器的位数与该组的行数有关,也就是几路组相联的路数有关,命中时所命中的行计数器清零,比其低的计数器加1,其余不变;未命中且还有空闲行,新装入的行计数器置0,其余全加1;未命中且无空闲行,淘汰最高值,新装入置0,其余加1;最不经常使用指的是新行建立后从0开始计数,没访问一次,计数器加1;其中只有最近最少使用替换算法(LRU)是按照程序的局部性原理,因此效果最佳;

那么当Cache写命中时怎么办呢?我们分为写回法和全写法,写回法便是 不立即写回主存,而是在每个Cache加一个标志位,又称脏位,再被替换时写回主存,但是这样会存在一定的安全隐患;为此还有全写法,全写法便是写命中后直接写回主存,增加了访存次数,但是安全性更高;

与Cache写命中相对应的还有Cahe写不命中,写不命中与写命中的两个方法相对应的分别是写回法搭配写分配法,全写法搭配非写分配法;写分配法指的是先将主存中写命中而Cache写不命中的块写入Cache,在对Cache中的副本进行写操作;而非写分配法指的是只是对主存中命中的块进行写,而不调入Cache;

此外,我们还需要知道Cache分为指令Cache和数据Cache,而这样划分主要为减少指令流水线的冲突,在数据Cache中分为Cache存储体和地址映射表,地址映射表中每一行都有对应的标记项,标记项包括标记位+替换控制位+脏位+有效位;标记位其实就是我们刚刚在各类映射方式里面地址结构中提到的标记,将物理地址中Cache行号或者组号和块内地址去掉便是标记了,替换控制位我们刚刚是在替换算法的地方提到的,与组相联的路数有关,脏位刚刚在写回法中提到的,一般是一位,有效位是一位,指的是Cache行中的信息是否有效;

这里一定要结合大题来理解了!!!


三、常见题及易错题总结

数据的表示与运算答案:D、D、D、C、B、C、B、C、A、D、D、A

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
答案见下一章!!!(这一章不仅多而且非常重要,大家学习时一定要理解了,弄懂整个过程再看细节问题;这一章,我发现不能再像之前数据结构那样写了,太浪费时间了,也没有什么用,我决定之后一章一次写,学完一节先记录下重点,之后以整体为一个框架来写,再解决框架中的小知识点;加油,冲呀)

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值