储存器
一般来说计算机的内存是非持久性 non-permanent的,比如你正在编辑某份文档,你还没来得及保存,电脑断电了,内存里所有的数据都会丢失,那么你刚才所编辑的部分就不在了。
储存器 storage和内存 memory有所不同,任何写入储存器的数据会一直保存,直到被删除或是被覆盖,断电也不会丢失,是持久性 permanent的。比如硬盘,U盘就是储存器。
曾经持久性的介质速度慢,非持久性的介质速度快,但随着技术的发展,两者之间的差异越来越小。
最早的储存器是打孔卡,以及它的亲戚,打孔纸带。20世纪40年代,纸卡标准化成了80列 * 12行,一张卡能储存960bit数据(80*12=960)。纸卡一直沿用了十几年,因为无需用电,且便宜耐用,然而纸卡的坏处的读取缓慢,而且只能 写入一次 write-once。
再后来出现了磁芯储存器,这是第一个真正意义上随机访问储存器。
再后来20世纪50 60年代出现的磁鼓储存器,才使得现代 硬盘 hard disk drives的诞生,硬盘和磁鼓非常类似,硬盘用的是硬的磁盘子,而磁鼓用的是一个大号的圆柱体,但是储存原理是一样的,磁盘表面有磁性,写入头和读取头可以处理上面的0和1。硬盘的好处是薄,所以可以叠在一起,为储存数据提供了更多表面积。访问随机地址的时间叫做 寻道时间 seek time。
作为90后,小时候上电脑课我们还有软盘,软盘其实和硬盘是一样的,只不过磁盘是软的,更为便携,在1970-1990非常流行,就和现在的U盘一样。
光学储存器于1972年出现,当时是12英寸的激光盘。后来出现光盘CD,DVD等都是我们较为熟悉的产物了。在功能上这些技术与硬盘软盘非常相似,但它们用的不是磁性,光盘的表面有许多的小坑,造成光的不同反射,光学传感器会捕捉到不同的反射,并解码为0和1。
现如今,储存技术在朝固态 solid state前进,没有了机械的部件。比如固态硬盘,U盘里面都是集成电路。
文件&文件系统
储存器可以断电的情况下长时间的储存数据,使得它们非常适合储存 一大块数据, 或者叫做文件 files。比如我们都见过的文本文件,图片文件,视频文件等等。
随意排列文件的数据是完全可以的,但是如果以特定格式排列会更有用,这叫做文件格式 file format。你可以自己发明文件格式,比如程序员就经常这样做,但最好的方式一般是使用现成的标准,比如jpeg,mp3,txt。
比如TXT文件,里面的数据就是文字,但和所有文件一样,TXT文件其实只是一长串二进制的数字,但通过编码(比如ASCII)就可以将这一长串二进制数字翻译成人类看得懂的数据。
再比如波形wave文件,也就是WAV文件,它一般储存音频,在能够正确读取数据之前,我们需要知道它的一些必要信息,比如 码率 bit rate,是单声道还是立体声。这里,关于数据的数据,叫做元数据 meta data。
元数据在文件的开头,也就是原始数据之前,也叫做文件头 heard。比如上图中,音频数据位于DATA SIZE之后,以一长串数字形式储存,这些值代表声音的幅度。
又比如BMP文件,元数据之后就是每个像素的颜色。总之,它们归根结底都是一样的,一串长长的二进制。
现在,我们需要将这些文件储存到储存器,但是储存器并没有文件的概念,它们只能存储一大堆的bit。所以为了存储多个文件,我们需要一个特殊的文件,记录其他文件的位置,这个特殊的文件有很多名字,我们这里泛称叫目录文件,大多数情况下它都在储存器的开头,位置0,所以不用担心找不到它。
目录文件内,存着所有其他文件的名字,并且还存储着有关这些文件的元数据,比如创建时间,最后修改时间,文件所有者,是否可读写,文件的起始位置等。如果要添加文件,删除文件,修改文件或之类的操作,我们必须更新目录文件中的信息。好比图书的目录,如果你缩短或移动了其中一章,你就必须更新目录,否则页码就对不上,目录文件以及对其的管理,就是一个非常简单的文件系统 file system。
文件系统隐藏了文件在存储上的复杂性,比如给储存分块 block,给文件预留空间,允许文件被拆分成多块并不连续的存储在储存器上,这很像原来提到的内存虚拟化。比如我们删除了某个文件,文件系统会把文件的记录清除掉,但是并不会真正清零文件占用的存储块,只有在覆盖的时候才会真正的被删除掉,所以有时候数据是可以被恢复的,尽管看上去已经被删除了。
刚才提到过,文件存储在储存器上并不是连续的,可能被分在不同的块上,也可能并不连续,也没有顺序,这种叫做碎片 fragmentation。碎片是新增/删除/修改文件导致的不可避免的副产品。碎片会导致磁盘来回转,比如从1到5再到2,而真实的情况,1个文件可能被分在上百个块中,而碎片整理 defragmentation就是为了解决这个问题而出现的。原理也非常简单,修改文件存放的块,使其连续。
刚才讨论的文件系统叫做平面文件系统,所有文件都处于同一平面,这在只有十几个文件的情况下是还不错的,但是实际上我们的文件系统经常会存储成千上万个文件,而将所有文件存在同一个层次,变得不切实际。就像现实世界的文件一样,相关的文件放在一起会方便得多,文件系统也可以把相关的文件放在同一个文件夹下,这叫做分层文件系统,我们现在的计算机就是如此。
在分层文件系统下,文件系统的文件就会增加元数据去区分它是文件还是目录,假设我们的目录文件在最顶层,这个目录也叫做根目录 root directory,所有其他文件和文件夹都会在这个目录之下。
在这种文件系统下,我们移动文件只需要把文件目录中的记录移动即可,并不会真正去移动文件存储的数据。
文件系统使我们不必关心文件在储存器上的具体位置,使得我们可以更方便的整理和访问文件。
压缩
虽然我们可以很简单的去操作文件,但是我们依然希望文件数据能够尽量的小,这样我们就可以用相同的容量去存储更多的文件,同时传输的速度也会变快。解决的方法是压缩 compression,即把数据压成更小的尺寸。
压缩数据的一种方法是减少冗余信息,最简单的方法称为行程编码 run-length encoding RLE。
例如,一段图片的信息,里面有连续7个像素的相同颜色,正常情况下数据内会有连续7相同的数据表示连续7个像素块使用同一种颜色,比如 黄-黄-黄-黄-黄-黄-黄 ,我们可以增加额外字节标识 比如 7-黄 来代表连续的7个黄色像素,然后删除后面的多余数据,为了避免计算机混淆哪个字节的代表执行哪个字节代表颜色,应用此结构的方法应该是一致的。所以会在每个颜色前添加数据,虽然会添加数据,但总的来说它会大大减少图像的字节数。
并且在压缩过后,图片可以被拓展成原始版本且没有任何降级。具有这种特性的压缩技术被成为无损压缩 lossless compression,因为被压缩的数据可以完整的被拓展回压缩之前的样子。
另一种压缩方式回删除不要的或次要的信息,尤其是那些无法被人类感知到到信息,这个技巧是大多数有损压缩技术 lossy compression techniques的基础。比如声音,可以过滤掉人类无法听到超声波和低频,有损音频压缩器使用这个方法来以不同的精度编码不同的频段,即使结果很粗糙,人们也不会注意到差异,或者至少对体验没有影响。比如手机通话,音频数据被压缩,随着信号质量或带宽的下降,压缩算法会删除更多的数据。
以与人类感知一致的方式抛弃或降低精度的想法,被称之为感知编码 perceptual coding,并依赖人类的认知模型。比如mp3,jpeg。抛弃一些我们听不到的或是感官上察觉不出来的差别。