存储(二)—— 内存、SSD、磁盘

存储介质,硬件始终是一个绕不过去的话题,后悔上学时没好好学计算机原理,进来查阅了不少资料,试着在这里阐述一二,说个大概,难免有误,欢迎指正。

比特和IO

如上一篇《序言》中所说,计算机中的数据都是以0和1来存储和传输的,所以,无论何种存储方式,其实现原理必然是找到一种可以模拟0和1这两个比特的方法,然后用把众多的可以代表0和1的存储单元集合起来,排列组合出各种信息,以此来达到存储的目的。
IO应该是我们平时提到的最多的词之一了,可是,啥是IO? I=in O=out, IO就是数据进出存储介质(寄存器,内存,磁盘,网卡等等),所以也可以这样I=Write O=Read,IO的快慢一直都是对程序性能影响最大的因素之一(另一个应该是算法),而影响IO快慢的,就是各类存储介质的工作原理了。
我们平时接触最多的存储介质基本就是内存、SSD(固态硬盘)和磁盘(机械硬盘)了。可惜现在搞底层技术的软件开发人员越来越少了,大多数应用层的程序员对于这些存储介质的存储原理都不是很清楚,这是很遗憾的事情。应用层的各种软件技术其实受底层硬件的影响非常大,先来看一些有意思的问题:

  1. 想想上学的时候是不是老想着把机械硬盘换成SSD,然后炫耀一把开机速度。操作系统软件没变,把硬盘换了,为啥会变快?
  2. MySQL数据库跑在SSD上是否比跑在机械硬盘上快?
  3. LSM思想是为了解决何种问题?
  4. 为啥断电重启后某些没来的及保存的工作会丢失?

内存

模拟01

内存的一个基本单元是有一个晶体管和一个电容构成的,可以认为晶体管是控制电容充放电的开关,通过对电容充放电来改变电容中电荷的数量,通过电容中电荷数量的多少来模拟0和1,电容充满电是0,放完电是1。这样,一个基本单元可以存储1比特的数据。
基本单元结构简单,占地儿小,所以可以大规模集成,许多这样的内存单元按一定的顺序(矩阵)排列到一起,给编上号,就组成了我们平时口中所说的内存。而这些编号,就是内存地址了。

持久性

我们都知道,内存中的东西,断电就没了,无法保存,所以大多(内存数据库不算)数据库,消息队列,包括zookeeper都是数据来了写到磁盘上才算安全,因为指不定啥时候就断电了,内存是不靠谱的。硬盘也会坏啊,所有又有了replication,这个话题后续会将,这里先跳过。
现在我们来看看为什么断电了,内存的数据就丢失了。
所谓数据丢失,最终是比特位0和1的丢失,0和1为啥会丢失?电容漏电了。。
组成内存单元的电容并非真正传统意义上的电容,它是由两个成对的逻辑门电路(比如两个非门)组成的,交替充电,把电荷留在电路中,所以这个电容是模拟出来的,而电容中的电荷会天然流失,比如一开始电荷是满的,后来电荷流失超过一半了,比特位就从0变成1了。
为了解决电荷流失的问题,需要每隔一段时间(1~3ms)进行一个充电,补齐电荷,所以一旦断电,没人给充电了,内存中的数据也就玩完了。
当然只有用到的内存需要周期性持续充电,不使用的内存就无所谓了。
为啥玩手机时,只看电子书,电耗的不快,一旦玩起游戏来,电量蹭蹭往下掉,我想这里面也有一部分原因跟这个内存充电保持电荷有关。

SSD

模拟01

SSD也是通过电容中的电荷量来模拟0和1的,不同的是,SSD的一个存储单元可以表示一个以上的比特位。
举个例子,比如电容中电荷在容量的3/4之上的时候是表示00,1/2到3/4时表示01,1/4到1/2时表示10,1/2以下时表示11。
通过这种方式,一个存储单元就可以存储2个比特位了,当然,越精细实现难度越大,成本也就越高。

持久性

固态硬盘在存储单元上大致可以认为和U盘是一个东西,为什么掉电不丢数据,这是因为在内存单元结构的基础上,加了一层绝缘装置,充完电以后,电荷不会流失。所以不需要周期性的充电,所以即使断电,数据也依然可以保存。当然,电荷不是绝对的不流失,SSD或者U盘里的数据,放个七八年,估计也就完蛋了。

磁盘

模拟01

磁盘是最常见的,最便宜,容量也最大,其存储原理,与内存或者SSD完全不同。
磁盘表面是一层磁性涂料,被划分为一个一个区域,每一个存储单元可以看作是一个小磁针,磁盘的磁头加电后可以对下面的小磁针进行磁化,使小磁针保持在南极或者北极,以不同的磁极来表示0和1.
从磁盘上读取数据时,磁头不加电,这时经过小磁针,会在小磁针磁场的作用下产生不同方向的电流,通过电磁感应方式来读出磁盘上存储的数据。

持久性

小磁针被磁化后,不需要加电维持,所以数据可以持久保存。当然,如果你硬要把磁盘放到很强的磁场附近,当我没说。

访问速度

三者相比,内存最快。
内存存储单元结构和SSD差别不是特别大,访问速度却不在一个数量级。原因有以下几点:

  1. 内存比SSD离CPU更近,不要小看这点距离因素,计算机的主板也许并没有多大,但是30万千米/秒的光速在CPU上G的频率下,真的有些慢。。。
  2. SSD的数据总是先到内存再到CPU的,CPU不直接和SSD交互,从CPU的视角来看,SSD一定比内存慢。
  3. 受限于SSD的SATA接口数据传输
    SSD比机械磁盘快的原因在于:SSD是电信号取数据,磁盘取数据靠的是机械运动(移动磁头),电和机械不在一个数量级。

CPU和寄存器差不多,比内存快,内存比磁盘快,磁盘又比远程数据传输快,这一层一层的速度差异问题,计算机的设计者是怎样解决的呢?
且看下回 ———— 缓存和局部性原理


因僧问我西来意,我话山居不记年。
草履只栽三个耳,麻衣曾补两番肩。
东庵每见西庵雪,下涧常流上涧泉 。
半夜白云消散后,一轮明月到床前。