计算机组成原理(三)存储器

上篇文章中提到了计算机的性能,并分析了CPU是如何影响计算机的性能的,这篇文章我们再来探讨下存储器和计算机性能又有什么关系。

存储器的金字塔结构

计算机中很多地方都用到了存储,和CPU运算紧密关联的寄存器,高速缓存;存储程序运行时数据和命令的主内存;持久化存储的硬盘等等。根据数据读写速度的快慢,这些存储器可以构成一个金字塔的层级结构。

上图中的层级关系主要涉及三个计算机的硬件部件:CPU,内存条,硬盘。他们之间的数据沟通有着严格的层级关系,硬盘只能跟内存直接沟通,内存可以跟CPU直接沟通。所以硬盘中的数据必须读到内存中才能被CPU拿到,CPU产生的数据也必须经过内存才能落到硬盘中。有点类似于谍战剧,间谍的上线和下线,都是单线联系。

存储器的金字塔结构中,越上级的设备容量越小,造价越昂贵,越往下容量越大,造价越便宜。

另外,由于存取速度的差异,CPU在设计时用到了高速缓存,我们程序界的一些应用,如mysql也会使用缓存,来加快跟上级的沟通效率。

下图是各存储器价格和速度的一个说明。

寄存器

寄存器可以看成是CPU的一部分,它紧密的参与到CPU的运算过程中,用来暂存数据,指令,地址等,临时存储一下运算器的运算结果并会马上被用到。寄存器的容量很小,通常为4~8各字节,但由于它就在CPU内部,所以存取速度非常之快。

CPU高速缓存

CPU的运算太快了,快到内存的存取速度已经跟不上它的节奏了,后来聪明的CPU发现了局部性原理,这个局部性包括时间局部性和空间局部性。

  • 时间局部性:如果一个数据被访问了,那么它在短时间内还会被再次访问。
  • 空间局部性:如果一个数据被访问了,那么和它相邻的数据也很快会被访问。

有了这两个特性,那么CPU就不用说每次拿数据都实时从内存中去拿了,而是每次拿数据的时候多拿一点(空间局部性),并且存放到自己的高速缓存中(时间局部性)。然后高速缓存中的数据会在合适的时机被刷回到内存中(缓存空间不够用了,LRU淘汰数据页等时机)。

CPU Cache 用的是一种叫作SRAM(Static Random-Access Memory,静态随机存取存储器)的芯片。“静态”的意思就是,只要处于通电状态,SRAM中的数据就能一直存在。一旦断电,数据就会丢失。区别于主内存使用的DRAM,DRAM在下面会讲解。

局部性原理和我们java程序中最相关的关键字就是volatile,volatile的语义是什么呢?它会确保我们对于这个变量的读取和写入,都一定会同步到主内存里,而不是从 Cache 里面读取。这个语义是为了针对多核处理器的情况下,每个物理核的缓存不一致的情况,由于物理核将数据刷回主内存的时机存在一定延迟,所以为了保证一个变量的改变对所有物理核都可见,那就规定它只能从主内存中读取,且修改后必须立刻将数据刷回主内存。

CPU高速缓存也分为了三级缓存,借鉴我们上一篇文章中的图

根据存储空间的大小以及距离CPU核心的远近,CPU高速缓存被分为了L1,L2,L3三级缓存。L1 Cache直接嵌在核心内部,所以L1Cache最快,容量也最小,L1 Cache通常分为指令缓存和数据缓存。 L2 Cache 同样是每个 CPU 核心都有的,不过它往往不在 CPU 核心的内部。所以,L2 Cache 的访问速度会比 L1 稍微慢一些。而 L3 Cache,则通常是多个 CPU 核心共用的,尺寸会更大一些,访问速度自然也就更慢一些。

程序执行时,会先将内存中的数据加载到共享的 L3 Cache 中,再加载到每个核心独有的 L2 Cache,最后 进入到最快的 L1 Cache,之后才会被 CPU 读取。CPU拿到需要的内存地址,之后这个地址会被mmu转换成真正的物理地址,接下来会去查L1 cache,L1 cache不命中查L2 Cache,L2 Cache不命中查L3 Cache,L3 Cache不能命中查内存。

CPU三级缓存的结构保障了CPU的执行速度,最大化减小了内存(慢吞吞的家伙)对它的拖累。

内存

内存用的是一种叫作DRAM(Dynamic Random Access Memory,动态随机存取存储器)的芯片,比起 SRAM 来说,它的密度更高,有更大的容量,而且它也比 SRAM 芯片便宜不少。

在DRAM中,每个记忆单元由一个电容和一个开关电路组成,主要的作用原理是利用电容内储存电荷的多寡来代表一个二进制位元(bit)是1还是0。

由于电晶体会有漏电流的现象,导致电容上所储存的电荷数量并不足以正确的判别数据,进而导致数据毁损。因此对于DRAM来说,周期性地充电是一个不可避免的条件。由于这种需要定时刷新的特性,因此被称为“动态”记忆体。相对来说,静态记忆体(SRAM)只要存入数据后,即使不刷新也不会遗失记忆。

与SRAM相比,DRAM的优势在于结构简单——每一个位元的资料都只需一个电容跟一个电晶体来处理,相比之下在SRAM上一个位元通常需要六个电晶体。正因这缘故,DRAM拥有非常高的密度,单位体积的容量较高因此成本较低。但相反的,DRAM也有存取速度较慢,耗电量较大的缺点。

CPU高速缓存是在CPU内部来实现的硬件结构,而内存是一个可插拔的接口型的物理结构,所以通常情况下,处理器高速缓存的大小我们控制不了,但是我们仍可以选择更大的内存来支持我们的程序需求。

一个进程启动后,会在内存中开辟一块区域来作为它的专属区域,存放它运行时的数据,指令,数据等。所以如果一台计算机上要启动的进程很多,或者有几个很占内存的大进程时,可以选择容量更大的内存条。

内存的速度虽然比CPU慢一个量级,但是相对于我们人为感知来说,它已经很快了,所以我们在写程序或者考虑使用中间件来提升程序的运行速度时,也基本都是在内存层面下手。

硬盘

现阶段市场的硬盘可以分为两种,固态硬盘(SSD)和机械硬盘(HDD)。

机械硬盘

早些年我使用的笔记本电脑就是单块HDD硬盘,这种硬盘在计算机运作时它也会跟着呜呜转,这是机械硬盘的物理结构产生的现象。机械硬盘内部是一个旋转寻址的结构,盘面用来存储数据,中间的电机主轴带动盘面进行快速旋转,磁头臂用来将磁头移动到盘面的某个磁道上,磁头用来读取磁道上某扇区的数据。

 如下图所示,一个盘面被划分成了一个个同心圆,每一个同心圆都叫做一个磁道。每个磁道又被划分成了一个个扇区,扇区的结构就像下图所示的那样,每个扇区的大小是固定的,为 512Byte。所以最外层扇区面积大 数据密度比较小,最内层扇区面积小 数据密度比较大。扇区也是磁盘的最小存储单位。

读取和写入数据的时候,磁盘会以扇区为单位进行读取和写入数据,即使电脑只需要某个扇区内的几个字节的文件,也必须一次把这几个字节的数据所在的扇区中的全部512字节的数据全部读入内存,然后再进行筛选所需数据。

通常来说,硬盘里面都会有多个盘面,盘面堆叠起来,盘面之间有空隙来放置磁头臂和磁头。另外说明一下,每个盘面的正反面都可以存数据的,所以一个盘面的正反面会对应有两个磁头来读写数据。如下图所示,多个盘面堆叠起来后,由于所有磁头都是绑定在一起移动的,相应的,磁头所处的相同位置的扇区会构成一个柱面。上面说到扇区是磁盘的最小存储单位,而多个相同位置的扇区构成的柱面就是磁盘读写数据的基本单位。

 

硬盘的性能主要看一个指标:转速。因为机械硬盘找数据的方式就是,旋转盘面,将指定的扇区旋转到磁头臂可以访问到的位置,然后移动磁头臂将磁头指向指定的磁道,这样磁头能能读取到该磁道该扇区的数据了。磁头读取数据的速度很快,可以忽略不计,所以硬盘随机存取数据的主要耗时就在于:

  1. 平均延时:旋转盘面,把几何扇区对准悬臂位置的时间 
  2. 平均寻道时间:盘面选转之后,我们的悬臂定位到扇区的的时间。

所以硬盘转速越快,随机读取数据的平均延时就越小。

机械硬盘随机读写的性能受限于部件进行物理移动需要的时间,而顺序读写数据就很快了,以顺序存储为例,顺序存储的逻辑是,将数据存到一个柱面上,这样,只进行一次物理寻址就能存储大量连续的数据。而当一个柱面的容量不够时,可以只旋转一下盘面,尽量将一批数据顺序存储到一个磁道上,这样的话就能大大节省旋转盘面与移动磁头臂的时间,速度大概是随机存储的100倍。顺序读取数据同理。

  1. 顺序读是随机读性能的400倍以上。顺序读能达到84MB/S
  2. 顺序写是随机读性能的100倍以上。顺序写性能能达到79M/S

数据库存储数据时的WAL机制就是利用的硬盘顺序读写比较快的特点,如mysql的redolog等,先利用顺序读写的速度优势将数据的变化先记录下来,在空闲时或者buffer空间不足需要刷脏页时再去随机写,将指定数据页的数据真正的改变。

固态硬盘

固态硬盘与机械硬盘的物理构成完全不同,完全是基于电信号的传递来读写数据的,速度比机械硬盘要快上不上。但是固态硬盘的耐用性要差些。

  1. 顺序读:220.7MB/s。随机读:24.654MB/s。
  2. 顺序写:77.2MB/s。随机写:68.910MB/s。

通过这个数据可以看到,固态硬盘的顺序写与随机写速度差异不大,但是顺序读仍然比随机读快了将近10倍。

不同于机械硬盘用盘面来存数据,固态硬盘的数据存储用的是闪存颗粒,闪存颗粒可以简单理解为一个电容 + 一个电压计。根据一个电容能表示的比特数的多少,闪存颗粒分为了SLC(Single-Level Cell),MLC(Multi-Level Cell)、TLC(Triple-Level Cell)以及QLC(Quad-Level Cell)。根据字面意思,就是一个电容中分别存放了一、二、三、四个比特值。

那么为什么会有这么多种颗粒呢?哪种颗粒比较好呢?

一个闪存颗粒可以表示的比特数越多,那么它的电容电量的精度就要求越高,读写的速度也就更慢,寿命也更短。所以SLC是最好的颗粒,造价也最贵。

刚才提到固态硬盘的耐用性要差些,这句话怎么理解呢?

这就需要提到固态硬盘的P/E擦写问题,对于 SSD 硬盘来说,数据的写入叫作 Program。写入不能像机械硬盘一样,通过覆写(Overwrite)来进行的,而是要先去擦除(Erase),然后再写入。

数据擦除是按照“块”为单位来进行的,固态硬盘的寿命其实就是“块”可以被擦除的次数。上面提到的 SLC 的芯片,可以擦除的次数大概在 10 万次,MLC 就在 1 万次左右,而 TLC 和 QLC 就只在几千次了。

固态硬盘数据存储在裸片上,类似于机械硬盘的盘面,裸片也是多个堆叠在一起的。每个裸片上划分了多个平面,一个平面的存储容量大概在GB级别。每个平面又划分了多个块,一般一个块(Block)的存储大小, 通常几百 KB 到几 MB 大小。一个块里面,还会区分很多个页(Page),就和我们内存里面的页一样,一个页的大小通常是 4KB。

SSD读写数据的基本单位是页,擦除数据的基本单位是块。

硬盘是存储器金字塔结构中容量最大的一个。正常来说,固态硬盘要比机械硬盘昂贵不少,具体使用哪种要根据实际情况具体权衡。

总结 

到这里,我们已经将整个储存器的金字塔结构从顶至底梳理了一遍。寄存器就在CPU核心的内部,和运算器的运算过程息息相关。CPU高速缓存 L1 Cache和L2 Cache也在CPU核心内部,L3 Cache在多个核心共享的区域(核心外)。内存的容量比CPU高速缓存更大,但是受限于物理结构并且距离CPU核心较远,读写速度更慢。硬盘是持久化存储数据的媒介,容量最大,读写速度也最慢,其中SSD比HDD的读写速度要快不少,但是寿命更短。

接下来我们来分析下,计算器存储器的差异是怎么利用缓存来弥补的,缓存在我们日常程序开发中又是怎么使用的。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值