存储介质,硬件始终是一个绕不过去的话题,后悔上学时没好好学计算机原理,进来查阅了不少资料,试着在这里阐述一二,说个大概,难免有误,欢迎指正。
比特和 IO
如上一篇《序言》中所说,计算机中的数据都是以 0 和 1 来存储和传输的,所以,无论何种存储方式,其实现原理必然是找到一种可以模拟 0 和 1 这两个比特的方法,然后用把众多的可以代表 0 和 1 的存储单元集合起来,排列组合出各种信息,以此来达到存储的目的。
IO 应该是我们平时提到的最多的词之一了,可是,啥是 IO? I=in O=out, IO 就是数据进出存储介质(寄存器,内存,磁盘,网卡等等),所以也可以这样 I=Write O=Read,IO 的快慢一直都是对程序性能影响最大的因素之一(另一个应该是算法),而影响 IO 快慢的,就是各类存储介质的工作原理了。
我们平时接触最多的存储介质基本就是内存、SSD(固态硬盘)和磁盘(机械硬盘)了。可惜现在搞底层技术的软件开发人员越来越少了,大多数应用层的程序员对于这些存储介质的存储原理都不是很清楚,这是很遗憾的事情。应用层的各种软件技术其实受底层硬件的影响非常大,先来看一些有意思的问题:
- 想想上学的时候是不是老想着把机械硬盘换成 SSD,然后炫耀一把开机速度。操作系统软件没变,把硬盘换了,为啥会变快?
- MySQL 数据库跑在 SSD 上是否比跑在机械硬盘上快?
- LSM 思想是为了解决何种问题?
- 为啥断电重启后某些没来的及保存的工作会丢失?
内存
模拟 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 差别不是特别大,访问速度却不在一个数量级。原因有以下几点:
- 内存比 SSD 离 CPU 更近,不要小看这点距离因素,计算机的主板也许并没有多大,但是 30 万千米/秒的光速在 CPU 上 G 的频率下,真的有些慢。。。
- SSD 的数据总是先到内存再到 CPU 的,CPU 不直接和 SSD 交互,从 CPU 的视角来看,SSD 一定比内存慢。
- 受限于 SSD 的 SATA 接口数据传输
SSD 比机械磁盘快的原因在于:SSD 是电信号取数据,磁盘取数据靠的是机械运动(移动磁头),电和机械不在一个数量级。
CPU 和寄存器差不多,比内存快,内存比磁盘快,磁盘又比远程数据传输快,这一层一层的速度差异问题,计算机的设计者是怎样解决的呢?
且看下回 ———— 缓存和局部性原理
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于