期末总结系列2——存储器

计组期末总结系列2——存储器

 

————————下面是一些开头的废话,可以不看————————

由于电脑坏了,又不能整天玩手机,舍友说计组不会,为了方便同学复习,同时总结一下整个学期学习的内容,所以决定写写一些重点的内容,另,本人水平有限,如果文中有错误还请批评指正。

——————我是分割线,上面的废话可以不看,下面才是重点———————

 

在计算机中用于记录数据的硬件,就可以叫做存储器,比如内存。存储器以存储芯片为核心构成。关于存储芯片的原理我也说不清楚(电路学的不好-_-||)但是只需要知道它能保持电信号并且在需要的时候可以读出就行了。

在存储芯片内部,存储芯片排成一个矩阵,只需要给出相应的地址,就能读写制定的单元。每个单元可以存n位二进制数,一般是8位,正好是一个字节。顺便说一下单位的转换。

1个二进制位叫做1个比特,写作1bit(注意是小写)

8个二进制位叫做1个字节,写作1Byte(简写为1B,注意这是大写)

1024个字节叫做1千字节,写作1KB

1024个千字节叫做1兆字节,写作1MB

以此类推GB、TB等。。。

所以通常运营商所说的10M网的意思是10Mbps,也就是Mb/s,代表兆比特每秒而不是兆字节每秒。转换的话要除以8才是理论的下载峰值。

 

接着说存储单元地址,既然是矩阵,那么直接给出行列下标即可。为了说明原理,在不失去规律的前提下缩小规模,例如储存矩阵是4*4的,那么共有16个存储单元如图所示。

jz2-1

比如我要选择第2行第3列的位置,那么行号就是2,列号就是3,也就是2,3,但是每次给两个值太麻烦了,想办法转换成给一个数字,并且希望数字加1后自动换行,比如2,3的下一个就是30。最好的办法就是用四进制的数字23代表地址,23+1 结果正好是30。同时为了电路实现方便,采用2进制来表示,并且可以直接用3-8译码器之类的芯片来选择不同的行和列。具体电路就是分别把前两位和后两位送入两个译码器即可。

比如上面的地址就可以写成1011,前两位是行下标,后两位是列下标。这不是巧合,还记得上次说过二进制、八进制、十六进制的转换吧,四进制也同理,每两位二进制数位正好是是一位四进制数位的权值。这样上图这16块地址单元就可以通过4位的二进制数字来表示了,也就是地址长度为4位。如果给定存储器大小计算地址长度,则直接看这个数2的几次幂即可。

 

扩展位数和扩展容量

如果用一个存储芯片直接作为一个存储单元的话,可能会出现位数不够的情况,比如一片存储芯片只能存4bit,但是需要做成每个单元存8bit的存储矩阵。那么就需要同时用两片芯片来共同工作,一个存前(高)四位一个存后(低)四位,首先要先理解工作原理才能理解接线的方法。一个芯片的原理图如下

以上文中的RAM为例,只是示意图,为了说原理,实际并没有这么小的芯片。其中A的引脚是地址引脚,CS是片选、WE是读写功能选择。D引脚是数据引脚,可读可写。

jz2-2

想要扩展每个单元的位宽,也就是说当选择一个单元的时候,两片芯片选择的地址应该相同,并且要同时生效、功能一样。所以,地址引脚、片选、读写选择都应该接到一起。如下图

jz2-3

由于需要一个存储高4位一个存储低4位,所以地址线要分别接起来。如图

jz2-4

第二个芯片的四位正好充当了高四位的储存。

 

还有一种情况,假如位数够了容量不够怎么办?同理,想要多大的容量就用多少芯片组合工作,还是先说原理,当一个芯片不够的时候,我们需要多个芯片同时储存不同的信息,也就是说用下一个芯片的第一个地址单元当上一个芯片最后一个单元的下一个单元,比如上文中最大地址号是1111那么下一块本来已经没有了,因为四位最大就是1111,但是我们希望储存到下一个芯片的第0个地址,0000,同时还要满足地址的连续,而1111+1 = 10000,后四位正好是0000,那么你一定发现了,第4位也就是D4(从左到右依次为D4D3D2D1D0)代表了第几块芯片。

另外,当地址为10000的时候还要保证第二块芯片生效而第一块无效,所以片选这时候就要单独考虑了,存储芯片的片选是低电平有效,所以直接用一个非门即可(三片以上用译码器),由于控制了片选,所以读写接到一起是没问题的,并且数据线也同理接到一起。

jz2-5

另外的一种接法就是这两种的综合,同时扩展位宽和容量。思路是这样的,先扩展位宽,之后把扩展位宽后的两片当做一个整体,再扩展容量。接线图如下。

jz2-6

接下来说说cache,为了提高CPU从存储器读取数据的速度,所以设计了缓存,思路是这样的,短期内读取过的数据做一个临时的存储,再次读到的时候不再访问主存,直接读缓存。举个例子,比如我让你算1234+567,你可能要算下,结果是1801,如果我只过两秒问你同样的问题,那么第二次你的回答就会直接是你刚刚计算过的结果,并且短时间内问你同样的问题你都不会再去计算。这就是缓存。(扯点题外话,在大型网站的开发中会大量利用缓存基础来提高效率或者分流访问流量。)

缓存通常容量很小,但是读取速度很快。做缓存的方法有这么几种,直接映像、全相联映像、组相联映像。本文依然在不丢失规律的前提下缩小规模,便于观察原理。仅以直接映像为例进行说明,其他的类似。

jz2-7

假设主存有32字节、缓存有16字节(实际上主存会远大于缓存)如左下图,所以主存地址5位就够了,在表中用十六进制表示

我们的目的是要用16字节的内容来记录32字节中的部分内容,首先以4字节为单位划分缓存和主存,如上右图,主存会分成8块,缓存会分成4块。再按照缓存的大小继续划分主存,可以得到2个区,直接映像的思路是直接用缓存中对应的块来对应映射主存中的块。

缓存中第0块只对应主存中的第0区第0块或者第1区第0块(也就是第4块)。

缓存中第1块只对应主存中的第0区第1块或者第1区第1块(也就是第5块)。

缓存中第2块只对应主存中的第0区第2块或者第1区第2块(也就是第6块)。

缓存中第3块只对应主存中的第0区第3块或者第1区第3块(也就是第7块)。

那么问题来了,怎么区分缓存中存的内容是主存中的第几个区的内容?

需要一个表来记录,由于位置相对不变,只是不知道对应主存中的第几个区,所以只记录区号即可,这个表就叫做块表。缓存被划分了多少块表就有多少行,每行里的内容存储的就是这块缓存对应了主存中的哪个区。

举个例子来看,以1C号内存为例,内存地址是0001 1101(A7A6A5A4A3A2A1),按照划分规则,则A1A0代表的就是块内地址,A3A2代表的就是区内块号、剩下的1位就是区号。如果你这些都明白了,再去仔细看下课本,一定会很轻松。

0 Comments
Leave a Reply