1.存储设备的原理
为什么会有内存和外存?我们的状态机的状态是内存和寄存器。寄存器未必一定要作为状态,如写 C 代码的时候,寄存器对我们是不可见的。
如果能够实现一种计算机的体系结构,能从内存里取出数据进行运算,然后写回内存,寄存器本身不是绝对必要的,但是从计算机诞生依赖就存在了。为什么?
当我们谈抽象状态机,谈一个计算模型,根本不需要分内存和寄存器,比如图灵机,生命游戏。对于存储状态的需求:对于计算机来说,真正关心的是如何表示一个状态。表示状态还有个需求:一定要快。
暂存当前状态的需求:
可以寻址
根据编号读写数据
访问速度尽可能快
越快就意味着越难 persist
甚至为了快,不惜断电丢失(这个并不是必须的,可以造出断电不丢失的计算机)
机械玩具图灵机就没有这个烦恼
早期的计算机并不是用电路来存储数据。用机械波的方式,delay line。再后来,磁芯内存,Magnetic core,所以代码报错、存储错误会提示 core dump,这种存储器接近今天的 DRAM 了,但这种存储器有机械运动,所以注定速度快不起来。
计算机原则上有内存就能计算了,算完输出,关机,下次再开机重新算就行。但是随着计算机能力的增长,我们希望这次计算的结果能断电保存,下次通电也还能用。我们可以用特殊指令取出,慢一点也没关系。此外如果发生了 crash,RAM和 reg 的东西没有了,但是持久化存储的数据不变。除了有限的 “当前状态”丢失,我们希望更大、更多的数据能 “留下来” (并且被操作系统有效地管理起来)。
这就是操作系统里持久化的问题。持久化的第一课,持久存储介质。
存储介质是一切文件的基础。存储介质在逻辑上就是一个 bit/byte array,所有的都是。一个存储设备理解成一个数组没有任何问题。 但是呢,根据局部性原理,我们按块读写,可以降低成本加快速度,比如 512Byte 4kB 2MB 这样的块。
存储介质评价方法:价格、容量、速度、可靠性(多快好省)。
接下来再走一下存储设备的发展道路,看看人类历史上计算机科学与技术的人类高光时刻。
存储介质:磁
用磁实现持久化相对来说还是比较容易的。对于 1bit,我们需要一个能反复改写的状态。要能寻址+用电路改写。
比较早的存储介质,磁带,magnetic tape。1928 年的存储设备。
非常便宜,容量巨大,用于重要数据冷备份。现在在京东也能买到。HP 的 30TB 磁带只要 ¥700.
读写速度还可以,顺序读写 400MB/s,但是随机读写几乎做不到。
磁鼓 magnetic drum
用旋转的二维平面存储数据。读写延迟不会超过旋转周期。
磁盘 hard disk
价格低,容量高,顺序读取还行,随机读取勉强也能做。现在是计算机系统的主力数据存储设备。
为了读写一个扇区,读写头要到对应的磁道。
也有一些算法,比如“电梯”调度算法。早期这些算法是操作系统做的,但是现代 HDD 都有很好的 firmware 管理磁盘 IO 调用(磁盘里面的操作系统)。
HDD 上也有 CPU ,甚至有缓存,对于操作系统来说,现在完全不必理会磁盘的细节。一些调度读优先,写的话,晚一点也行。现在的操作系统已经不自作聪明去管这些了,因为磁盘里的操作系统了解自己的全部。
上个时代流行的设备:软盘。用来搬数据。现在有网盘,U盘。软盘的思路是把盘片和读写磁头分开。所以一个软盘就是一个磁片。今天的应用场景:博物馆。
存储介质:坑
最早,追溯到纸带机
CD,这上面是真有坑的。一个完美的反射面,挖坑使得反射光线能力下降,这就区分出01了。一个CD700MB,DVD4.7G,Blue ray 100GB 巨大的容量。然而只能读不能写。当然也可以复杂的做到,但是多方面综合考虑,不划算。
光盘复制超级快,压盘复制。顺序读写速度高。
持久化存储:电
前面都是历史。被淘汰的东西。前面的设备的致命缺陷是存在机械上的结构。机械部件至少有 ms 级别的延迟。想要彻底的解决存储的问题,必须是电路。跟上CPU速度的东西也就是电路了。
一个相对比较新的东西 flash memory闪存(1991)。大概的原理是通过充放电保存 1-bit 信息的存储。这个东西几乎都是优点。价格低,虽然生产线的价格高,但是只要生产量上来,单片的价格还是可以做的很低(大规模集成电路),容量大(3D空间每个坐标都是1bit),读写速度快(直接通过电路读写,而且容量越大速度越快电路级并行),甚至快到淘汰了旧的 SATA 接口,使用了 M.2 接口(NVMe协议),而且可靠性高,没有机械部件,随便摔。
但是有个致命缺点。
1999年,发明了U盘,91 年只是有了闪存这个介质和技术,99年朗科注册了这个专利,把USB接口直接连接到存储上,使得数据的移动变得非常容易,彻底干死了软盘。但是,肯定也听说过“不要在U盘里放重要数据”。同样来自于这个缺陷。
由于闪存的原理,放电无法放干净,放多了,放到最后就放不出来了,那么这个bit就坏了,就永远就是这个值了。也即放电数千或数万次后,就好像是“充电”状态了。
然而文件的同一个位置写几千次是一个很正常的需求,比如日志。不管是 SSD 还是 U 盘,这是一个固有缺陷,只要用了闪存作为介质,这是一个必须要解决的问题。
U盘,SSD,SD卡,都是NAND Flash。
现在的最新的SSD,已经是相当于一台计算机了,有 CPU,on-chip RAM,缓存,store buffer,操作系统,···,很长一段时间内SSD的结构是公司的商业机密。这样的 SSD 可以有大概 1PB 数据写入的能力。
而 SD 卡,标准没有规定SD卡里要有什么,所以最便宜的SD卡可能只做一个最简单的分发数据,良心的厂家会在 SD 卡上也放一个 ARM 芯片。如果标准不规定,那么就一定有人追逐利润,然而从外表看不出任何区别。
所以U盘和SSD的区别。SSD是软件定义磁盘,即每一个 SSD 里都藏了一个完整的计算机系统。
管理这个闪存的软件叫 FTL(Flash Translation Layer),闪存翻译层,里面有个技术叫 “Wear Leveling”,即软件管理那些可能出问题的 blocks。根据写入的负载,把写入均匀的分到每个闪存块上。闪存管理的核心和内存管理差不多,把 Logical block address 翻译成 Physical block address,道理简单,实现很困难。
SSD 有 Page 和 Block 两层结构。Page 是读的最小单位如4KB,Block 是写入的最小单位如 4MB。有最小的读写限制,就有了 read/write amplification ,读写放大,即读写不必要的内容。
存储介质的抽象,最终都是一个巨大的字节数组,操作系统写入数据,对 SSD 来说,会均匀的写入使用少的块上。
这也就可以理解为什么 SSD 刚出现的时候争议很大,2010 年市场上有消费级的 SSD 出现,也有人有怀疑,到底能不能把“均匀写入”这件事情做好。
此外,读写放大也有影响,因此有了缓存,SSD得到操作系统要写入的数据不着急写进入,先放进缓存,攒够了再写入磁盘。因此可以观察到一个现象,刚开始写入的时候速度很快,过一会儿速度会明显的慢下来。不管是U盘还是SSD,都是这样,刚拿到数据立即返回操作系统“继续给我东西”,然后才慢慢的偷偷一点点把数据真的写进入。这部分也非常的复杂。所以现在的 SSD 也不简单。
FTL 也带来了很多有趣的问题,性能、可靠性、安全性问题。写时复制,如果数据不想让别人看到,删除掉数据,格式化磁盘,并没有真实的删掉数据。在理解了 FTL 之后,即便格式化后写入数据(不写满)也有可能数据还存在原来的physical block。(copy on write机制)因为刚写过的cell,可能要等很久以后才写下一次,这也是 FTL 的机制决定的。由此带来的新的研究问题,文件系统加密。
最后更新于