通常来讲,电脑内存是“非永久性”,若是电源线不当心拔掉了,内存里全部数据都会丢失,因此内存叫“易失性”存储器。相对应存储器(Storage)算法
存储器(Storage)和内存(Memory)有点不一样,任何写入“存储器”的数据,好比硬盘数据会一直存着,直到被覆盖或删除,断电也不会丢失。存储器是“非易失性”的。segmentfault
之前是“易失性”速度快,“非易失性”的速度慢,但随着技术发展,二者的差别愈来愈小。
现在认为稀松日常的技术,好比U盘,能低成本+可靠+长时间存储上GB的数据。less
内存条:svg
硬盘:性能
纸卡,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)。spa
忙完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年代,有个相似技术是“磁鼓存储器”,
到1953年,磁鼓技术飞速发展,能够买到存80000位的“磁鼓存储器”。也就是10KB。
硬盘
但到1970年代“磁鼓存储器”再也不生产,然而,磁鼓致使了硬盘的发展,硬盘和磁鼓很类似。不过硬盘用的是盘,不像磁鼓用圆柱体,
原理是同样的:
硬盘的好处是薄,能够叠在一块儿,提供更多表面积来存储数据。
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分钱。彻底没有打孔纸卡。
存储技术的发展:
纸卡 -> 延迟线存储器(磁致伸缩延迟存储器) -> 磁芯存储器 -> 磁带 -> 磁鼓存储器 -> 硬盘,软盘 -> 机械硬盘,固态硬盘。
若是文件紧密的一个个先后排序会形成问题,因此文件系统会:
数据存储,磁带和硬盘,能够在断电状态下长时间存储上万亿个位。很是合适存一整块有关系的数据,或者说“文件”。
文件究竟是什么以及计算机怎么管理文件。
随意排列文件数据彻底没问题,但按格式排会更好。这叫“文件格式”。
能够发明文件格式,可是最好用现成标准,好比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。
文件系统使不关心文件在磁带或磁盘的具体位置,整理和访问文件更加方便。像普通用户同样直观操纵数据,好比打开和整理文件。
文件格式,如何编码文字,声音,图片,例如:.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倍。但用补丁的移动和旋转,来更新画面。当压缩太严重时会出错,没有足够空间更新补丁内的像素,即便补丁是错的,视频播放器也会照样播放。致使一些怪异又搞笑的结果。
总的来讲,压缩对大部分文件类型都有用,从这个角度来说,人类不完美的视觉和听觉,也算有用。压缩能够高效存储图片,音乐,视频。若是没有压缩,在视频网站上观看电影或电视剧,几乎不可能,由于带宽可能不够(会很卡),并且供应商不肯意免费提供传输那么多数据。