3.1.概述
3.1.1.定义
存储器,用于存储数据和程序。存储器中,以二进制的方式存储数据和程序,存储器由N个存储单元构成,存储单元由N个存储电路组成,这N个存储电路用来保存一个N位二进制数。每个存储单元的编号称为==地址==,存储器中能存放的数据的总位数(byte)称为存储容量,常用单位,KB、MB、GB…..
3.1.2.分类
3.1.3.性能指标
存储器的性能指标主要有以下两个:
- 读写速度
单位时间内的存取的信息量,单位:位/秒。 - 存储容量
能存放的数据的总位数。
3.1.4.存储体系
存储是计算机硬件结构中最重要的部分之一,前文我们知道了存储器五花八门分为很多种,那么如何选择合适种类的存储器拼在一起,构建一个合理的计算机的存储体系喃?其实构建计算机的存储体系的时候主要要解决以下几个问题:
主存速度够快吗?
照摩尔定律,计算机的CPU上晶体管每18个月数量会翻一倍,因此CPU的读写速度现阶段要远远高于主存的读写速度。如果主存速度太慢,CPU往往就会处于一个等待主存给出结果的空闲等待状态,怎么才能构建出一个跟得上CPU速度的存储体系喃?
主存容量够大吗?价格够低吗?
读写速度越快的存储器,价格往往越高,内存条的价格大家都是有目共睹的,一根内存条小几十个G就要大几百元,计算机又要存储大量数据,几百个G甚至上T的存储能力根本就不够,如果全部选择速度很快的存储器,那么价格会很贵,所以如何在保证存储能力的同时,不至于价格过高喃?
以上问题的解法就是一个字——拼!但这种拼不是乱拼,而是将性能和价格合适的存储器以合适的数量放在合适的位置上拼成一个大的存储体系,现代计算机给出的合理拼法是:
首先我们要知道计算机虽然要存储大量数据,但是其实当前运行时要用到的数据其实只是一部分,而当前要用到的数据也不是一次性全部都会用到,CPU也是一条指令一条指令执行的,CPU要用到的和当前指令相关的数据更是很小一部分。
因此现在计算机在最下层用价格低廉的辅助存储器来存储当前不需要用到的、离线的数据,中间层用适量的主存储器来存放当前计算机运行时会用到的数据,然后为了匹配CPU和主存的速度差,在他们中间加入了小小的几个高速缓存存储器(cache)。
3.2.主存
3.2.1.读写
地址总线,通过MAR与存储体进行交互,单向的,只会往存储器中传地址信息,地址总线中传送的地址信息会存放在MAR中,经过译码器译码以后才会选中存储体中具体的存储位置。
数据总线,通过MDR与存储体进行交互,双向的,可读可写,配合地址总线定位到的存储位置完成数据的读写。
对该地址的数据的具体操作,读?写?通过控制电路来控制。
读写交互的逻辑也可以简化为下图:
3.2.2.编址
数据存储在内存的一个个存储单元里,就像我们人生活在单元楼的一户户房子里,找到具体某一家人是通过门牌号,而在计算机里找到某一个数据是通过它的地址,这个地址就是数据的门牌号,如何给这些存储单元编号,编址是一个很重要的问题。
编址方式有两种:
+ 按字节编址
+ 按字编址
了解这两种编址之前首相要大致了解一下字节、字、字长的区别。
字节,8位为一个单位长度。
字,长度浮动,既可以是16位也可以是32位。
字长,即字的长度,对存储器一次读、写最多能使用的长度(位数),也就是单个存储单元的容量。
假设当前计算机的一个存储单元容量是32位,
按字节编址:
0、1、2、3......
按字编址:
32位,意味着一个存储单元存放4个字节,所以按字编址为
0、4、8、12......
实际使用中,两种方式一般是混用的,存储单元间按照字编址,存储单元内按照字节编址:
3.2.3.容量计算
存储器的容量可以根据地址总线和数据总线的数量计算出来。
地址总线,2的地址线数量的次方=存储单元的数量
数据总线,数据线的条数=单个存储单元的容量(位数)
3.3.缓存
3.3.1.工作原理
CPU的读写效率远远高于主存的读写速度,如果CPU每次取所需读取/写回的的数据都直接与主存进行交互,直接从主存中读写,那么CPU大段时间会处于空等状态。
缓存作为主存和CPU之间的中间层,用来适配两者的速度差,减少CPU的空等。
将数据从主存中调入缓存中暂时存放,为了保证大多数时候CPU需要的数据和指令在缓存中能被命中,缓存中存放的数据会遵循局部性原理。
程序的局部性原理:程序在执行的时候呈现出局部性规律,在一段时间内,整个程序的执行仅限于程序中的某一个部分,相应的,执行所访问的存储空间也局限于某个内存区域。局部性又分为时间局部性和空间局部性。
时间局部性指的是,如果程序中的某条指令一旦执行,则不久后可能会被再次执行,执行指令时访问的数据单元在不久后会被再次访问。
空间局部性指的是,一旦访问了某个存储单元,不久后,其附近的存储单元也将被访问。
3.3.2.编址
前面在主存中已经介绍过了,主存的编址方式是存储单元之间编址,然后存储单元内部也会编址,这种编址方式就是分块、块内再编号。分块分出来的地址是块号,块内再编号编出来的是块内偏移地址。
缓存为了方便将主存中的数据调入,也采用了相同的编址方式,主存中的数据调入缓存会以整个块为单位调入缓存,数据的组织方式上不会有任何改变,只是地址编号要做一次映射从主存中的地址映射到缓存中的地址罢了。
3.3.3.读写
读,即将数据调入CPU,如果在缓存中命中,则直接从缓存中调入,如果缓存中未命中则由cache从主存中调入。
需要从主存中调入时,如果cache中空间足够就直接调入,如果空间不足则先替换腾位再调入。
由于cache和主存都是按照 块号+块内偏移 进行编址,cache是以整块为单位进行调入、调出,所以CPU读取cache的时候,也是直接根据 块号+块内偏移 来进行定位读取。
3.4.辅存
辅存,一般采用磁表面存储器,一般呈盘状,表面有多个同心圆形状的磁道,工作时,由磁头在磁层上进行读写操作。
辅存的读写过程由两个动作组成:
- 寻道
磁头运动,在磁盘上找寻磁道。
- 寻找扇区
找到磁道后等待磁盘运动,找到扇区。
辅存的读写速度也是由这两个动作的时间之和决定。