通常來講,電腦內存是「非永久性」,若是電源線不當心拔掉了,內存裏全部數據都會丟失,因此內存叫「易失性」存儲器。相對應存儲器(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倍。但用補丁的移動和旋轉,來更新畫面。當壓縮太嚴重時會出錯,沒有足夠空間更新補丁內的像素,即便補丁是錯的,視頻播放器也會照樣播放。致使一些怪異又搞笑的結果。
總的來講,壓縮對大部分文件類型都有用,從這個角度來說,人類不完美的視覺和聽覺,也算有用。壓縮能夠高效存儲圖片,音樂,視頻。若是沒有壓縮,在視頻網站上觀看電影或電視劇,幾乎不可能,由於帶寬可能不夠(會很卡),並且供應商不肯意免費提供傳輸那麼多數據。