一、引子
这一章节,我们要探讨二进制数据在计算机内部如何存储的。
第一章说过,现代计算机的结构大致是这样的:
其中,主机中有一个很重要的部件:主存储器
。也就是我们熟悉的内存。
看一下实际生活中的主存和辅存:
可以发现,主存和辅存的容量是不一样的,主存会更小一点。
为什么主存、辅存的存储容量差异这么大?除了存储容量之外,它们之间还有没有速度差异呢?
还有,除了主存和辅存之外,还有没有其他的用于存储数据的存储器呢?
接下来我们一一探讨上述问题。
二、存储器的层次化结构
1.层次化结构
(1)金字塔
在下面的图中,越靠近上层的速度越快,容量越小、造价越高。
上面的华为手机主存是8GB,由于主存靠近上层,所以主存速度比较快。还有一个机身存储,也就是辅存容量是128GB,只不过手机里面的辅存一般不是磁盘。
可以明显看见,辅存的容量比主存大;当然,辅存的读写速度也更慢。
(2)案例
:bookmark_tabs:举例
手机里面的APP啥的存储在辅存里面,但是辅存读写速度比较慢,因此CPU不能直接和辅存进行数据交互。
因为CPU处理数据速度很快,如果让快速的CPU去直接读取慢速的辅存里面的数据,CPU就会被辅存拖累。
如果我们要启动微信,需要将微信的程序先从辅存调入到主存(就是平时我们启动微信会有一个地球和小人的界面,加载一会儿)。当微信的数据放入主存之后,CPU就可以开始运行相关的代码,这样就可以使用微信了。
如下图:
辅存中的数据要调入主存后才能被CPU访问。
CPU可以直接从主存读数据;也可以直接向主存写数据。
如果大家之前学过操作系统的话,就知道主存和辅存之间的数据交换是由硬件+操作系统来实现的。操作系统需要负责实现页面置换算法,根据页面置换算法,可以决定要把哪些数据从主存换送到外存。
(3)Cache
在主存之上,还有一个Cache
高速缓冲存储器。
虽然主存的读写速度已经很快了,但是主存的速度依然跟不上CPU的运算速度。为了缓解这种速度矛盾,通常计算机硬件会把当前有可能会经常访问的代码数据从主存里面复制一份,存放进Cache里面,然后CPU可以直接读取Cache里面的副本数据。
主存的数据可以放到Cache中,CPU可以直接往Cache中写数据或者读数据,Cache里面被更改的数据也会被写入主存。
举个例子,假如现在你用微信和家人进行视频聊天,那么接下来,微信中处理视频聊天的那一段代码可能会被频繁使用。我们就可以将处理视频聊天的那一段代码从主存复制一份到Cache中。
第一个图中,可以看到,Cache是更靠近上层的存储层,因此Cache的读写访问速度会更快。
那么,CPU直接访问Cache里面有关视频聊天相关的代码,就可以比直接访问主存要快很多。这样就可以保证视频聊天的过程可以更加流畅。
添加 Cache层主要是为了缓解CPU和主存之间的速度矛盾。
主存和Cache之间的数据交换,通常是由硬件自动完成的。
主存-辅存
:实现了虚拟存储系统,应用程序员所看到的主存容量可以比他看到的实际容量要大得多。解决了主存容量不够的问题。
Cache-主存
:解决了主存与CPU速度不匹配的问题。由硬件自动完成,对所有程序员都是透明的。
(4)寄存器
接下来,再往Cache上面看,最接近CPU的是寄存器。
第一章提过很多次寄存器,比如ACC累加寄存器、MQ乘商寄存器。寄存器的读写速度又要比Cache快得多。
所以,CPU在进行加减乘除相关的运算的时候,会将操作数先放入寄存器里面。
CPU里面包含的寄存器数量很有限,有可能只有几十个寄存器。
(5)辅存和外存
再往下看,辅存这一层,大家都很熟悉。
比如机械硬盘(磁盘)就属于辅存。
另外,像磁带、光盘、U盘之类的属于外存。
2.速度与价格举例
:moneybag:速度与价格
看一下下面三星内存条的介绍:
(1)主存和Cache层
这里的Memory就是指三星内存条:(可以看到读写速度,还有复制速度)
当这个内存条和Intel的I5配合工作的时候,内存读速度可以达到三万七千多MB/s。
可以看到,这个内存条只有8GB大小:
除了内存之外,还有Cache层。
大家可以去查一下,各种CPU的型号里面,会介绍它的高速缓存,也就是Cache的容量大小是多少。
比如这里的i5处理器,Cache容量只有12MB,比内存容量要小的多。
如下:
现代的Cache层也是分层的。比如这里的i5处理器分为L1、L2、L3这三层,越靠近上层速度越快,容量越小。
通过这个图的数据也能看到,就算是最低的L3,速度也比内存快很多(内存40GB/s左右,而L3是200GB/s左右)。
如下:
虽然在CPU内部的Cache层,它的存储容量很小,但是它的读写速度非常快,比主存快得多。
为什么Cache层的容量这么小?这是为了控制硬件的开发成本。
在同等容量的情况下,Cache容量的成本要比内存高得多。所以,Cache的容量注定不能很大。
主存和Cache层都可以直接被CPU访问。
(2)辅存
看一下如下的机械硬盘,价格和刚才的内存差不多,但是容量可以达到1TB,比内存的8GB大的多。
同等容量的情况下,显然,辅存的造价比内存低得多。
这里给出的是SATA接口的极限速度,并不是机械硬盘可以达到的速度。这个机械硬盘实际能够达到的读写速度可能只有100MB/s左右,比内存慢了很多很多。
早期的辅存都采用机械硬盘,现代大多电脑都采用SSD固态硬盘作为辅存。看一下下面的某固态硬盘,550块钱可以买到500GB的固态硬盘,读写速度可以达到500MB/s,比原来的机械硬盘要快得多。
由于固态硬盘的读写速度比机械硬盘快得多,所以,如果电脑的系统安装在固态硬盘里面会比安装在机械硬盘里面启动速度快得多。
开机就是要把系统相关的数据从辅存读入到主存,辅存速度越快,读入的速度也就越快,开机的速度也就越快。
(3)外存
看一下如下的光盘,每一片可以存储25GB数据。也很便宜。
外存制造成本比辅存又要低得多。速度也要比辅存更慢。
三、存储器的分类
1.按照层次分类
上面已经说过了这个金字塔:
需要重点关注中间三层高速缓存、主存和辅存。
高速缓存和主存可以直接被CPU读写。
而辅存里面的数据只有调入到主存之后,才可以被CPU访问。
2.按照存储介质分类
无论是什么存储器,终究还是用来存放二进制数据0、1的。
那么,根据存储二进制位的存储介质不同,可以对存储器进行这样的分类:
①半导体存储器
用半导体器件存储0、1数据。
这一类的存储器读写速度一般较快。
②磁表面存储器
③光存储器
比如光盘、DVD等。
3.按照存取方式分类
(1)指明读写地址
①随机存取存储器(RAM)
之前说过,所有的存储器都是分为一个一个的存储单元,每个存储的单元会有各自的地址编号。
对于RAM,我们要读取任意位置的存储单元,所需要的读写时间都是相同的。
读写速度并不会因为存储单元的物理位置而改变。
比如内存条,就是一种随机存取存储器。
②顺序存取存储器(SAM)
复读机里面放的磁带就是一种顺序存取存储器。
复读机或者录音机会有一个磁头,来读写磁带里面存放的数据。比如磁头指在中间位置,当轮轴转动,磁条会划过读写磁头,就会读出里面的数据。
如果读写磁头想要读取磁带后半部分的数据,那么就需要让磁带一直转动至后。
③直接存取存储器(DAM)
比如机械硬盘(磁盘),就是一种直接存取存储器。
磁头B会前后移动,移动到想要读取的区域。(有点随机存取的意思)如下:
然后中间的马达(中间白色区域),会带动磁盘旋转。
当想要读写的数据划过磁头下方的时候,磁头就可以进行相应的读写。(有点顺序存取的意思)如下:
DAM比SAM快,但是比RAM慢。
注:后面两种存储器(SAM和DAM)读写某个存储单元所需时间与存储单元的物理地址有关。所以又叫做串行访问存储器。
(2)指明读写内容
RAM、SAM、DAM是指定数据的存储地址,然后直接去那个地址读或者写。(按照地址访问)CAM可以指明想要找的数据内容是什么,根据内容去查找存储位置。(按照内容访问)
4.按照信息的可更改性分类
5.按照信息的可保存性分类
主存里面的数据在断电之后会消失,手机在没电关机之后,再开机会很慢。因为之前手机正在运行的操作系统、各种软件的数据本来存放在主存里面,断电之后,主存里面的数据被清空了。所以开机之后,需要重新把数据从辅存调入主存。
手机系统或者电脑系统安装在辅存里面,断电之后依然存在。
四、存储器的性能指标
MDR数据寄存器的位数反映了存储字长;MAR位数反映了存储字数是多少。相乘就是存储容量。
单位成本指每一个比特位需要付出的金钱成本。比如之前的内存8GB,259块钱。8GB是64Gbit,所以单位成本就是259/64Gbit。
每一个存储周期可以读或者写一个存储字这么多数据。
存储周期又可以划分为存取时间和恢复时间。
存取时间和存取周期是不一样的。如下图:
每次读或者写的数据,需要花费存取时间这么长时间。在这一次读或者写之后,存储器需要一段恢复时间才能再进行下一次的读或者写。
所以经过单独的一次读或者写,只需要 存取时间Ta这么长的时间。但如果需要进行连续多次读写,那么多次读写之间至少需要存取周期Tm这么长的时间间隔,因为还需要留有一段恢复时间。