内存&储存介质
- 纸卡,Paper punch cards
- 延迟线存储器, Delay Line Memory
- 磁芯,Magnetic Core Memory
- 磁带,Magnetic Tapc
- 磁鼓,Magnetic Drum Memory
- 硬盘,Hard Disk Drives
- 内存层次结构,Memory Hierarchy
- 软盘,Floppy Disk
- 光盘,Compact Disk
- 固态硬盘,Solid State Drives
一般来说,电脑内存是“非永久性”,如果电源线不小心拔掉了,内存里所有数据都会丢失,所以内存叫“易失性”存储器。相对应存储器(Storage)
存储器(Storage)和内存(Memory)有点不同,任何写入“存储器”的数据,比如硬盘数据会一直存着,直到被覆盖或删除,断电也不会丢失。存储器是“非易失性”的。
以前是“易失性”速度快,“非易失性”的速度慢,但随着技术发展,两者的差异越来越小。
如今认为稀松平常的技术,比如U盘,能低成本+可靠+长时间存储上GB的数据。
内存条:
硬盘:
纸卡,Paper punch cards
最早的存储介质是 打孔纸卡,以及纸卡的亲戚 打孔纸带。到1940年代,纸卡标准是80列12行。一张卡能存960位数据(8012=960)。
最大纸卡程序,是美国军方的“半自动地面防空系统”简称SAGE。一个在1958年投入使用的防空系统。
主程序存储在62500个纸卡上,大小5MB左右,相当于如今手机拍张照片。
纸卡用了十几年,因为不用点且便宜耐用。然而坏处是读取慢,只能写入一次。打的孔无法轻易补上。对于存临时值,纸卡不好用。需要更快更大更灵活的存储方式。
J. Presper Eckert 在1944年建造ENIAC时发明了一种方法,叫“延迟线存储器”。
原理:
拿一个管子装满液体,如水银,管子一段放扬声器,一段放麦克风。扬声器发出脉冲时,会产生压力波。压力波需要时间,传播到另一端的麦克风。麦克风将压力波转换回电信号。可以用压力波的传播延迟来存储数据。
假设有压力波代表1,没有代表0。扬声器可以输出10101111,压力波沿管子传播,过了一会儿,撞上麦克风。将信号转换回1和0。如果加一个电路,连接麦克风和扬声器,再加一个放大器(Amplifier)来弥补信号衰弱,就能做一个存储数据的循环。信号沿电线传播几乎是瞬时的。所以任何时间点只显示1 bit数据。但管子中可以存储多个位(bit)。
忙完ENIAC后,Ecket和同事John Mauchly 着手做一个更大更好的计算机叫EDVAC,使用了延迟线存储器。总共有128条延迟线,每条能存352位(bits),总共能存45000位(bit)对1949年来说还不错。
这使得EDVAC成为最早的“存储程序计算机”(只要能在内存里存储程序,就算是“存储程序计算机”)之一,但“延迟线存储器”的一大缺点是:每一个时刻只能读一位(bit)数据。如果想访问一个特定的bit,比如第112位(bit),得等待它从循环中出现。所以又叫“顺序存储器”或“循环存储器”。
而想要的是“随机存取存储器”可以随时访问任何位置。
增加内存密度也是一个挑战,把压力波变得紧密,意味着更容易混在一起,所以出现了其它类型的“延迟线存储器”。如“磁致伸缩延迟存储器”。
用金属线的振动来代表数据,通过把线卷成线圈,30cm*30cm的面积能存储大概1000位(bit)。然而,延迟线存储器在1950年代中期就基本过时了。因为出现了新技术,性能,可靠性和成本都更好。-> “磁芯存储器”
“磁芯存储器”,用了像甜甜圈的小型磁圈,如果给磁芯绕上电线,并施加电流,可以将磁化在一个方向。如果关掉电流,磁芯保持磁化,如果沿相反方向施加电流,磁化的方向(极性)会翻转,这样就可以存1和0。
如果只存1位不够用,所以把小甜甜圈排列成网格,有电线负责选行和列,也有电线贯穿每个磁芯,用于读写一位(bit)
磁芯内存的第一次大规模运用是1953年麻省理工学院的Whirlwind 1计算机,磁芯排列是32*32(1024个字节),用了16块板子,能存储大约16000位(bit),更重要的是,不像“延迟线存储器”,磁芯存储器能随时访问任何一位(bit)。
“磁芯存储器”从1950年中期开始成为主流,流行了20多年,而且一般还是手工编织的。
刚开始存储成本大约1美元1位到1970年,下降到1美分左右。不幸的是,即使每位1美分也不够便宜。
5MB约等于4000万bit。
当时,对存储技术进行了大量的研究,到1951年,Eckert和Mauchly创立了自己的公司,设计了一台叫UNIVAC的新电脑,最早进行商业销售的电脑之一。它推出了一种新存储:磁带。
磁带
磁带是纤薄柔软的一长条磁性带子,卷在轴上,磁带可以在“磁带驱动器”向前后移动。里面有一个“写头”绕了电线,电流通过产生磁场。导致磁带的一小部分被磁化,电流方向决定了极性,代表1和0,还有一个“读头”,可以非破坏性的检测极性。
现在大量数据冷备份还是用磁带。
UNIVAC用了半英寸宽,8条并行的磁带,磁带每英寸可存128位数据,每卷有365.76米长。意味着一共可以存1500万位左右,接近2兆字节(2MB)。
虽然磁带驱动器很贵,但磁带又便宜又小,因此磁带至今仍用于存档。磁带的主要缺点是访问速度。
磁带是连续的,必须倒带或快进到达特定位置。可能要几百米才能得到某个字节,这很慢。
1950,60年代,有个类似技术是“磁鼓存储器”,
- 有金属圆筒,盖满了磁性材料以记录数据。
- 滚筒会持续旋转,周围有数十个读写头,等滚筒转到正确的位置,读写头会读或写1位(bit)数据。
- 为了尽可能缩短延迟,鼓轮每分钟上千转。
到1953年,磁鼓技术飞速发展,可以买到存80000位的“磁鼓存储器”。也就是10KB。
硬盘
但到1970年代“磁鼓存储器”不再生产,然而,磁鼓导致了硬盘的发展,硬盘和磁鼓很相似。不过硬盘用的是盘,不像磁鼓用圆柱体,
原理是一样的:
- 磁盘表面有磁性。
- 写入头和读取头,可以处理上面的1和0。
硬盘的好处是薄,可以叠在一起,提供更多表面积来存储数据。
IBM对世上第一台磁盘计算机就是这样子做的,RAMAC 305,它有50张60.96厘米直径的磁盘,总共能存5MB左右。
要访问某个特定bit,一个读/写磁头会向上或向下移动,找到正确的磁盘。然后磁头会滑进去,就像磁鼓存储器一样,磁盘也会高速旋转,所以读写头要等到正确的部分转过来。
RAMAC 305访问任意数据,平均只要六分之一秒左右,也叫寻道时间。虽然六分之一秒对存储器来说算不错,但对内存来说还不够快。
所以,RAMAC 305还有“磁鼓存储器”和“磁芯存储器”。
1970年代,硬盘大幅度改进并变得普遍,如今的硬盘可以轻易容纳1TB的数据。能存储20万张5MB的照片。现代的硬盘的平均寻道时间低于1/100秒。
硬盘的亲戚:软盘。除了磁盘是软的,其它基本一样。软盘是为了便于携带,在1970~1990非常流行。
密度更高的软盘,如Zip Disks,在90年代中期流行起来,但十年内就消失了。光学存储器于1972年出现,30.48cm的“激光盘”,后面逐步发展成:光盘(CD)以及90年代流行的DVD,功能和硬盘软盘一样,都是存数据。但用的不是磁性,光盘表面有很多小坑,造成光的不同反射,光学传感器会捕获到,并解码为1和0。
如今,存储技术在朝固态前进,没有机械活动的部件。比如硬盘,U盘(里面都是集成电路)。
第一个RAM集成电路出现于1972年,成本每比特1美分。使“磁芯存储器”迅速过时,如今成本下降了更多,机械硬盘,被固态硬盘逐步取代,简称SSD。
由于SSD没有移动部件,磁头不用等磁盘转,所以SSD访问时间低于1/1000秒,这很快,但还是比RAM慢很多杯。所以现在计算机,仍然用存储层次结构。
内存和存储技术,从早期的每MB成本上百美元,下滑到2000年只要几美分,如今远远低于1分钱。完全没有打孔纸卡。
存储技术的发展:
纸卡 -> 延迟线存储器(磁致伸缩延迟存储器) -> 磁芯存储器 -> 磁带 -> 磁鼓存储器 -> 硬盘,软盘 -> 机械硬盘,固态硬盘。
文件系统
- 文件格式:可以随便存文件数据,但按格式存储会更方便。
- TXT,文本文件:ASCII。
- WAV 音频文件:每秒上千次的音频采样数据。
- BMP 图片文件:像素的红绿蓝RGB值。
- 文件系统:很早期时空间小,整个存储器就像一整个文件。后面随容量增长,多文件非常必要。
- 目录文件:用来解决多文件问题,存其它文件的信息,比如开头,结尾,创建时间等。
- 平面文件系统,Flat File System:文件都在同一个层次,早期空间小,只有十几个文件,平面系统够用。
-
如果文件紧密的一个个前后排序会造成问题,所以文件系统会:
- 把空间划分成一块块。
- 文件拆分存在多个快里。
- 文件的增删改查会不可避免的造成文件散落在各个快里,如果是磁带这样的存储介质就会造成问题,所以做碎片整理。
- 分册文件系统,Hierarchical File System:有不同的文件夹,文件夹可以层层嵌套。
数据存储,磁带和硬盘,可以在断电状态下长时间存储上万亿个位。非常合适存一整块有关系的数据,或者说“文件”。
文件到底是什么以及计算机怎么管理文件。
随意排列文件数据完全没问题,但按格式排会更好。这叫“文件格式”。
可以发明文件格式,但是最好用现成标准,比如JPEG和MP3。最简单的是文本文件,也叫TXT文件。
就像所有其它文件,文本文件只是一长串二进制数。
原始值看起来像二进制,可以转成十进制,但帮助不大。解码数据的关键是ASCII编码。一种字符编码标准。
在ASCII中十进制的72是大写字母H,以此推论,解码其它数字。
WAV 音频文件
波形(Wave)文件,也叫WAV,它存储音频数据。在正确读取数据前,需要知道一些信息。比如码率(bit rate),以及是单声道还是立体声。
关于数据的数据,叫“元数据”(meta data),元数据存在文件开头,在实际数据前面,因此也叫文件头(Header)
WAV文件的前44个字节:
有的部分总是一样的,比如写着WAVE的部分,其它部分的内容,会根据数据变化。音频数据紧跟在元数据后面,是一长串数字。
数字代表每秒捕获多次的声音幅度。
例如:"HELLO"的波形
现在捕获到了一些声音,放大看一下:
电脑和麦克风,每秒可以对声音进行上千次采样,每次采样可以用一个数字表示。
声压越高,数字越大,也叫“振幅”。
WAVE文件里存的就是这些数据:
每秒上千次的振幅。播放声音文件时,扬声器会产生相同的波形。
BMP 图片文件
位图(Bitmap),后缀.bmp
,它存图片。
计算机上,图片由很多个叫“像素”的方块组成。
每个像素由三种颜色组成:红,绿,蓝。叫“加色三原色”,混在一起可以创造其它颜色。就像WAV文件一样,BMP文件开头也是元数据,有图像宽度,图片高度,颜色深度。
例如:假设元数据说图是4像素宽 * 4像素高,颜色深度24位,8位红色,8位绿色,8位蓝色。
一个字节能表示的最小数是0,最大是255。
图像数据看起来会类似这样:第一个像素的颜色,红色是255,绿色是255,蓝色是255,这等同于全强度红色,全强度绿色,全强度蓝色,混合在一起变成白色。所以第一个像素是白色。下一个像素的红绿蓝值,或RGB值,255,255,0是黄色。下一个像素是0,0,0是黑色。下一个是黄色。
因为元数据说图片是4*4,第一行结尾,所以换一行,下一个RGB值255,255,0是黄色。
不管是文本文件,WAV,BMP,其它格式文件,文件在底层全是一样的:一长串二进制。
为了知道文件是什么,文件格式至关重要。
计算机怎么存文件?
虽然硬盘可能是磁带,磁鼓或集成电路。
通过软硬件抽象后,可以看成一排能存数据的桶。
在很早期时,计算机只做一件事,比如算火炮射程表。整个存储器就像一整个文件。
数据从头寸到尾,直到占满:
但随着计算能力和存储容量的提高,存多个文件变得非常有用。
最简单的方法是把文件连续存储,这样能用,但是怎么知道文件开头和结尾在哪里?
存储器没有文件的概念,只是存储大量位,所以为了存多个文件,需要一个特殊文件,记录其它文件的位置。这个特殊文件有很多名字,这里泛称“目录文件”。
“目录文件”经常存在最开头,方便找,位置0。目录文件里,存所有的其它文件的名字,格式是文件名+一个局号+扩展名,比如BMP或WAV。
扩展名帮助得知文件类型,目录文件还存文件的元数据,比如创建时间,最后修改时间,文件所有者,是否能读/写,或读写都行。最重要的是,目录文件有文件起始位置和长度。
如果要添加文件,删除文件,更改文件名等。必须更新目录文件。
就像书的目录一样,如果缩短或移动了一章节,要更新目录,不然页码对应不上。目录文件,以及对目录文件的管理是一个简单的文件系统例子。
文件系统专门负责管理文件,如果文件都在同一个层次,叫“平面文件系统”。
把文件前后排在一起,有一个问题:
如果给todo.txt
加一点数据,会覆盖掉后面carrie.bmp
的一部分。
所以现代文件系统会做两件事情:
- 把空间划分成一块块,导致有一些“预留空间”可以方便改动,同时也方便管理。用这样的方案,目录文件要记录文件在哪些块里。(碎片化存储)
- 拆分文件,存在多个块里。
假设打开todo.txt
加了些内容,文件太大存不进一块里,不想覆盖掉隔壁的块,所以文件系统会分配一个没使用的块,容纳额外的数据。目录文件会记录不止一个块,而是多个块。(簇)
只要分配块,文件可以轻松增大和减小。很像操作系统的“虚拟内存”
假设想删掉carrie.bmp
只需要在目录文件删掉那条记录。让一块空间成了可用的,注意这里没有擦除数据,只是把记录删了。(数据恢复的原理)之后某个时候,那些块会被新数据覆盖,但在此之前,数据还在原处。
假设往todo.txt
加了更多数据,所以操作系统分配一个新块,用了刚刚carrie.bmp
的块,现在todo.txt
在3个块里,隔开了,顺序也是乱的。这叫“碎片”。 碎片是增/删/改文件导致的,不可避免。
对于很多存储技术来说,碎片是坏事。如果todo.txt
存在磁带上,读取文件要,先读块1,然后快进到块5,然后往回转到块2。来回取数据。
现实世界中,大文件可能存在数百个块里,解决方法是:碎片整理。
计算机会把数据来回移动,排列成正确的顺序。整理后todo.txt
在1,2,3 方便读取。
目前涉及到的只是平面文件系统,文件都在同一个目录里。如果存储空间不多,这种平面文件系统,就够用了,但是,容量爆炸式增长,文件数量也飞速增长,很快所有文件都存储在同一层变得不切实际。
相关文件放在同一个文件夹下会方便很多,然后文件夹嵌套,这叫“分层文件系统”。
实现方法有很多种,最大的变化是:目录文件不仅要指向文件,还要指向目录,需要额外元数据,来区分开文件和目录,这个目录文件在最顶层,因此也叫根目录。所有其它文件和文件夹,都在根目录下。
因此可以看出下图的根目录文件有3个文件,2个子文件夹“音乐”和“照片”。
如果想知道“音乐”文件夹里有什么,必须去那边读取目录文件(格式和根目录文件一样)
除了能做无线深度的文件夹,这个方法也可以轻松移动文件,如果想把theme.wav
从根目录移到音乐目录,不用移动任何数据块,只需要更改两个目录文件,一个文件里删除一条记录,另一个文件里加一条记录。(同一个储存介质中移动文件比复制快的多),theme.wav
依然在块5。
文件系统使不关心文件在磁带或磁盘的具体位置,整理和访问文件更加方便。像普通用户一样直观操纵数据,比如打开和整理文件。
压缩
- 压缩的好处是能存储更多文件,传输也更快。
- 游程编码, Run-Length Encoding。
- 无损压缩, Lossless compression。
- 霍夫曼树, Huffman Tree。
- “消除冗余”和“用更紧凑的表示方法”,这两种方法通常组合使用。
- 字典编码,Dictionary coders,游程编码和字典编码都是无损压缩。
- 感知编码,Perceptual coding。
- 有损压缩,jpeg格式。
- 时间冗余,Temoral redunancy
- MPEG-4 视频编码
文件格式,如何编码文字,声音,图片,例如:.txt
, .wav
, .bmp
,这些格式虽然管用,而且现在还在使用,但它们的简单性意味着效率不高。
希望文件能小一点,这样能存大量文件,传输也会快一些。
解决方法是:压缩,把数据占用的空间压得更小。
用更少的位(bit)来表示数据。
假设,吃豆人图像是 4像素 * 4像素,图像一般存成一长串像素值,为了知道一行在哪里结束,图像要有元数据,写明尺寸等属性。
每个像素的颜色,是三种原色的组合:红,绿,蓝。每个颜色用一个字节存,数字范围是0到255。
如果红绿蓝都是255会得到白色,如果混合255红色和255绿色,会得到黄色。
这个图像有16个像素(44),每个像素3个字节,总共占48个字节(163),但可以压缩到少于48个字节。
无损压缩
方法:
- 减少重复信息。
- 字典编码。
减少重复信息。最简单的方法叫“游程编码”,适合经常出现相同值的文件。
比如,吃豆人图像,有连续7个连续黄色像素。与其全存下来,黄色,黄色....,可以插入一个额外字节,代表有7个连续黄色,然后删掉后面重复数据。
为了让计算机能分辨哪些字节是“长度”,哪些字节是“颜色”格式要一致,所以要给所有像素前面标上长度。
有时候数据反而会变多。但跟多时候是减少字节,之前是48现在是24,小了50%。(lz77压缩算法)
没有损失任何数据,可以轻易恢复到原来的数据。这叫“无损压缩”,没有丢失任何数据。解压缩后,数据和压缩前完全一样。
字典编码(DFTBA),它用更紧凑的方式表示数据块。需要一个字典,存储“代码”和“数据”间的对应关系。
可以把图像看成一块块,而不是一个个像素,为了简单,把2个像素当成一块(占6个字节),也可以定义其它大小。
只有四对:白黄,黑黄,黄黄,白白。
会为这四对,生成紧凑代码(compact codes),这些块的出现频率不同,4个黄黄,2个白黄,1个黑黄,1个白白。
因为 黄黄 最常见,希望用最紧凑的形式来表示它,而 黑黄 和 白白,可以用更长的东西来表示,因为出现频率低。
1950年代,霍夫曼 发明了一种,高效编码方式,叫“霍夫曼树”,算法是这样的:
首先,列出所有块和出现频率,每轮选两个最低的频率,这里选择 黑黄 和 白白 的频率最低,它们都是1,可以把它们组成一个树,总频率2。现在完成了一轮算法。
这次有3个可选,就像上次一样,选频率最低的两个,放在一起,并记录总频率。
然后,只有2个选择,把它们组成一课树,就完成了。
它有一个很酷的属性:按频率排列,频率低的在下面。
现在有了一棵树,怎么让它变成字典?
可以把每个分支用0和1标注,现在可以生成字典。
它们绝对不会冲突,因为树的每条路径是唯一的,意味着代码是“无前缀”的,没有代码是以另一个代码开头的,现在来压缩。
第一个像素对,白黄,替换成10,下一对像素对,黑黄,替换成110,接下来 黄黄 替换成0。
之前48个字节(byte),现在变成了14位(bit),不到2个字节。
字典也要保存下来,否则14 bit毫无意义。所以把字典加到14 bit前面。图像是30个字节,比48个字节好很多。
“消除冗余”和“用更紧凑的表示方法”,这两种方法通常会组合使用。
几乎所有无损压缩格式都用了它们,比如,GIF,PNG,PDF,ZIP。
游程编码和字典编码都是无损压缩,压缩时不会丢失信息,解压后,数据和之前完全一样。无损对很多文件很重要。
感知编码
但其它一些文件,丢掉一些数据,没什么关系,丢掉那些人类看不出来区别的数据,大多数有损压缩技术,都用到了这点,实际细节比较复杂,所以概念一下。
以声音为例子,你的听力不是完美的,有些频率很擅长,其它一些根本听不见,比如超声波。
例如:如果录音乐,超声波数据都可以扔掉,因为人类听不到超声波,另一方面,人类对人声很敏感,所以应该尽可能保持原样,低音介于二者之前,人类听得到,但不怎么敏感,一般是感觉到震动。
有损音频压缩利用了这一点,用不同精度的编码不同频段,听不出什么区别,不会明显影响体验。
所以在电话里的声音和现实中不一样。压缩音频是为了让更多人能同时打电话。
如果网速变慢了,压缩算法会删除更多数据,进一步降低声音质量。
和没压缩的音频格式相比,比如WAV或FLAC。压缩音频文件如MP3,能小10倍甚至更多。
这种删掉人类无法感知的数据的方法,叫“感知编码”。
它依赖于人类的感知模型,模型来自“心理物理学”领域,这是各种“有损压缩图像格式”的基础,最著名的是JPEG。
就像听力一样,人的视觉系统也不是完美的,善于看到尖锐对比,比如物体的边缘。(矢量图无损,png无损,JPG有损)但看不出颜色的细微变化。
JPEG
JPEG利用这一点,把图像分解成8*8像素块,然后删掉大量高频率空间数据。
每个像素都和相邻像素不同,用无损技术很难压缩,因为太多不同点了,很多小细节,但人眼看不出这些细节,因为可以删掉很多,用简单的块来代替。
这样看起来一样,但可能只占10%的原始数据,可以对所有8*8块做一样的操作。图片依然可以认为是原图,只是更粗糙一些。进行了高度压缩,只有原始大小的八分之一。
通常可以取平衡,图片看起来差不多,但文件小不少。
MPEG-4
视频只是一长串连续图片,所以图片的很多方面也适用于视频。但视频可以做一些小技巧,因为帧和帧之间很多像素一样。 这叫“时间冗余”。
视频里不用每一帧都存这些像素,可以只存变了的部分。(帧内压缩和帧间压缩)当帧和帧之间有小小的差异时,很多视频编码格式,只存变化的部分。这比所有像素更有效率,利用了帧和帧之间的相似性,更高级的视频压缩格式会更进一步,找出帧和帧之间相似的补丁,然后用简单的效果实现,比如移动和旋转。变亮和变暗。
动作改变,视频压缩器会识别到相似性,用一个或补丁代表动作,然后帧之间直接移动这些补丁。所以视频中看到的动作(不是实时的),有点可怕,但数据量少得多。
MPEG-4是常见标准,可以比原文件小20倍到200倍。但用补丁的移动和旋转,来更新画面。当压缩太严重时会出错,没有足够空间更新补丁内的像素,即使补丁是错的,视频播放器也会照样播放。导致一些怪异又搞笑的结果。
总的来说,压缩对大部分文件类型都有用,从这个角度来讲,人类不完美的视觉和听觉,也算有用。
压缩可以高效存储图片,音乐,视频。
如果没有压缩,在视频网站上观看电影或电视剧,几乎不可能,因为带宽可能不够(会很卡),而且供应商不愿意免费提供传输那么多数据。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。