最先的計算設備--算盤,手動計算器,存儲着當前的計算狀態。dom
最先的機電計算器之一,哈佛Mark 1號,這臺機器的大腦是繼電器。繼電器裏,有個控制線路,控制電路是開仍是關,控制線路連着一個線圈,當電流經過線圈的時候,線圈產生電磁場,吸引金屬臂,從而閉合電路。electron
可是繼電器的機械臂有質量,所以沒法快速的開關。除了速度慢以外,還會形成磨損,增長故障率。編碼
因此,想要進一步提升計算能力,須要更快更可靠的東西來代替繼電器,即真空管。以下圖,向控制電極施加正電荷,會容許電子流動,施加負電荷,會阻止電子的移動。因此經過控制電路,能夠打開或關閉電路,和繼電器的功能同樣,但磨損更少,每秒能夠開閉數千次。spa
這標誌着計算機從機電轉向電子。(electro-mechanical computing to electronic computing)操作系統
爲了下降成本和大小,同時提升可靠性和速度,須要一種新的電子開關——晶體管。晶體管遠遠小於繼電器和真空管,每秒能切換上百萬次,而且能工做幾十年。.net
從繼電器---真空管--晶體管,讓電路開閉的愈來愈快。3d
計算機採用二進制,多進制帶來的問題是,狀態越多,越難區分信號。code
只用開和關兩種狀態,能夠減小這類問題。視頻
另外一個使用二進制的緣由是,有一整個數學分支,專門處理「真」和「假」,已經解決了全部法則和運算,即「布爾代數」。布爾代數中,變量的值不是數字,而是true和false,能進行邏輯操做。布爾代數中有三個基本操做,NOT、AND、OR,用晶體管能夠實現。blog
晶體管有三根線,2根電極和1根控制線,控制線通電時,電流就能夠從一個電極流向另外一個電極。將控制線當輸入,底部電極用於輸出,因此一個晶體管有一個輸入和一個輸出
這樣的話,打開輸入,輸出也會打開(輸入爲true,輸出爲true),關閉輸入,輸出也會關閉(輸入爲false,輸出爲false),對應的真值表:
實現NOT GATE:將輸出放在上面那個電極,打開輸入,電流流過接地,那麼輸出沒有電流,即輸入true,輸出false。
當輸入是off,電流無法接地,就流過了輸出,輸出是on。
對應的NOT真值表
實現ADD GATE:將兩個晶體管鏈接在一塊兒,A和B都打開了,纔會有輸出。
對應的ADD真值表:
實現OR GATE:將兩個晶體管並聯起來,以下。
對應的OR真值表:
NOT門,AND門,OR門均可以用晶體管表示。抽象表示以下,能夠用來構建更大的組件。
計算機如何存儲和表示數字?
數字:位來表示(1和0 即true和false),1bytes = 8bits(0~255),32位計算機或64位計算機意味着是一塊塊處理數據,每塊是32位或64位
字母:給字母編碼,用數字來表示 ASCII--Unicode
因此,短信,YouTube視頻,互聯網上的網頁,操做系統,只不過是一長串的1和0。
表示和存儲數字是計算機的重要功能,但真正的目標是計算和有意義的處理數字。好比兩個數字相加。這些操做由計算機中的「算術邏輯單元」(ALU)處理。ALU是計算機中負責運算的組件。
ALU有兩個單元,算數單元和邏輯單元
算數單元:負責計算機裏的全部數字操做,如半加器和全加器組成的加法器(由一大堆邏輯門巧妙的鏈接在一塊兒)
但想要處理超過1+1的運算,就須要全加器了。
有了半加器和全加器,利用他們來相加兩個8位的數字。
這樣也能夠獲得16或32位加法器,可是須要更多的邏輯門,而這種方式每次進位都須要一點時間,而現在的計算器量級是每秒幾十億次運算,因此會形成影響。現代計算機用的加法電路有點不一樣,「超前進位加法器」。
邏輯單元:執行邏輯操做,ADD--OR--NOT等操做。
計算出以後若是扔掉了就沒什麼意義了,得找個辦法存起來,這就用到了計算機內存了
ADD-OR鎖存器實現存儲1位的信息
完善一下,將兩個輸入改爲一個輸入,添加一個容許寫入線,獲得門鎖
抽象一下,把門鎖放到一個盒子裏,這個盒子可以存儲一個bit
容許輸入線輸入1,打開門,數據輸入1,1就能夠保存在門鎖中,數據輸出是1,此時關閉容許寫入線,不管數據輸入是1仍是0,門鎖中保存的都是1,輸出也永遠都是1。
若是並排放8個鎖存器,那就能夠存8位信息,好比一個8bit的數據,一組這樣的鎖存器就叫作寄存器。
寫入寄存器以前,要先啓用裏面全部的鎖存器。用一根線鏈接全部的「容許輸入線」,將之設置爲1,容許寫入
若是這樣並排放置,以64位寄存器爲例,須要64根數據線,64根連到輸出端,一根線啓用全部的鎖存器,加起來須要64+64+1 = 129根線。就要存256位就須要256+256+1 = 513條線,這樣線太多,解決方法就是矩陣。
在矩陣中,不是並列排放鎖存器,而是作成網格
啓用某個鎖存器,就打開相應的行線和列線就好
咱們只想打開交叉處鎖存器的容許寫入線,全部其餘的鎖存器保持關閉。看下圖,只有行線和列線均爲1,ADD門纔會輸出1,用一根容許寫入線連全部的鎖存器,因此爲了讓該鎖存器容許寫入,行線和列線以及容許寫入線都必須是1,每次只有一個鎖存器會這樣,這樣就能夠只用一個數據線來鏈接全部的鎖存器來傳輸數據,由於只有一個鎖存器會啓用,只有那個會存數據,其餘鎖存器會忽略數據線上的值,由於沒有容許寫入。一樣能夠用相似的技巧,作容許讀取線來讀數據,從一個指定的鎖存器中讀取數據。
因此對於256位的存儲,只須要1條數據線傳輸數據,1條容許寫入線,1條容許讀取線,還有16條行線+16條列線用於選擇鎖存器,即須要1+1+1+16+16 = 35條線。相比於並排排列的513條線,節省許多。
接下來就須要某種方法來惟一指定交叉點的地址,好比剛剛存了一位的地址是「12行8列」,因爲最多隻有16行(16列),因此能夠用4bit來表示行數(列數),這樣行地址(12)就能夠表示成1100,列地址(8)表示成1000,即12行8列的地址就能夠表示成11001000。計算機將地址轉化成對應的行列時須要用到多路複雜器。
將256位內存抽象成一個總體,以下圖,其中:
輸入一個8位的地址,4位表明列,4位表明行
容許寫入線和容許讀取線
一條數據線,用於讀/寫數據
256位的內存也無法作成什麼事,因此還要擴大規模。將之並排放置,像寄存器同樣,一行8個,這樣每一個存一位,一行8個就能夠存一個8位的數字,也就是能夠存一個字節。爲了存一個8位的數字,同時給這8個256位內存同樣的地址,每一個地址存一位,這就意味着總共能夠存儲256個字節。
抽象一下,將之當作一個總體的可尋址內存,有256個地址,每一個地址能讀或寫一個8位值
這樣不斷的把內存打包到更大的規模,就能夠擴展到上兆字節(MB)和千兆字節(GB)的現代計算機,隨着內存地址的增多,內存地址也必須增加,8位最多能夠表明256個內存地址,更多字節的存儲就須要32位的地址。
內存的一個重要的特性是:能夠隨時訪問任何位置,所以稱之爲「隨機存取存儲器」(Random Access Memory或RAM)
看一下下圖的內存,上面焊了8個內存模塊
打開一個,而後放大,會看到32個內存方塊
放大其中一個方塊,看到有4個小塊
再放大,就能夠看到存儲「位」的矩陣,這個矩陣是128位 * 64位,總共8192位,一層層疊加,8192 * 4 * 32 * 8 = 800萬位,也就是1兆字節(1 MB)。
矩陣層層嵌套,來存儲大量的信息。就像計算機中的不少事情,底層都很簡單,讓人難以理解的是,一層層精妙的抽象。