計算機自從 20 世紀 40 年代誕生以來,一直以史無前例的進步向前發展,如果說農業革命是第一次革命、工業革命是第二次革命的話,那么第三次革命就是 信息革命
。
計算機技術的進步幾乎影響着社會的方方面面,硬件的進步使得程序員可以編寫出各種各樣優秀的應用軟件。也許不久的將來虛擬現實、無人駕駛、無現金支付就會成為現實。
計算應用分類
計算機從用途上來講主要分為三種:
個人計算機(Personal Computer)
,也稱為 PC,這是人們最熟知的一種計算機,個人計算機強調用戶體驗,價格低廉,性價比高,個人計算機雖然出現時間很短,但是卻大大推動了計算機歷史的進程。
-
服務器(Server)
,服務器通常借助網絡訪問,用於執行大負載任務,可以處理復雜的應用,服務器相比個人計算機,有着更強的計算、存儲和 I/O 能力。發生故障時,服務器比個人計算機恢復代價高。服務器分為兩種,一種用於處理簡單小型的 web 服務,沒有顯示器和鍵盤。而另外一種是高端服務器,高端服務器通常稱為超級計算機,一般由成千上萬台處理器組成,內存非常大,同時價格也非常高。
-
嵌入式計算機(embedded computer)
是數量最多的一類計算機,應用和性能十分廣泛,一般應用於汽車、電視中的微處理器,飛機、火車、家用冰箱、洗衣機等,嵌入式計算機系統是由單一應用程序或者一組相關聯的應用程序組成,用戶通常意識不到自己正在使用計算機。
技術的不斷發展也讓計算機在不斷進步,對整個信息技術工業產生影響,自從個人計算機 PC 出現以來,計算機發展迅速,出現了一種個人移動設備(Personal Mobile Device, PMD)
,PMD 由鋰電池供電,通過無線的方式訪問網絡,價格低廉。PMD 不再像 PC 一樣擁有顯示器和鼠標,作為替代的是一塊觸摸屏,甚至支持語音輸入,PMD 的出現代表后 PC 時代的到來,而 PMD 將在未來生活中扮演更多角色。
雲計算(cloud computing)
替代了傳統的服務器,它依賴於一種倉儲規模計算機(Warehouse Scale Computer, WSC)
的巨型數據中心,比如 AWS ,Google 這樣的頂級科技公司,通過雲計算實現 軟件即服務(Software as a Service, Saas)
是軟件工業的使命。
八個偉大思想
計算機世界的快速發展,離不開幾個關鍵思想的影響,這些思想深刻影響着計算機設計人員
使用抽象簡化設計
抽象真是一個牛逼的詞匯,提高硬件和軟件生產率的主要技術之一就是使用抽象(abstraction)
來表示不同的設計層次,對高層次隱藏內部的實現細節,使其只看到一個大致簡化版的模型。
摩爾定律
計算機設計者一個永恆的問題就是 摩爾定律(Moore's Law)
驅動的快速變化,它是由英特爾的創始人 摩爾
提出的,它的主要內容是:當價格不變時,集成電路上可容納的元器件的數目,約每隔 18 - 24 個月便會增加一倍,性能也將提升一倍,這一定律揭示了信息進步的速度。
通過並行提高性能
並行處理是計算機的一大進步,並行指的是計算機系統中能同時執行兩個或多個處理的一種計算方法,並行處理的主要目的是提高效率,縮短工作時間,但是會帶來更大的復雜性。
通過流水線提高性能
在計算機結構設計中,一個特殊的並行場景是使用流水線,流水線也是一種硬件並行的設計。你一定見過大型車間或者制造廠中的流水線工業設計。
加速大概率事件
加速大概率事件要比優化小概率事件更能提高性能,大概率事件通常比小概率事件簡單,大概率事件規則意味着設計者需要知道什么事件是經常發生的。
通過預測提高性能
古人通常講一句話是 未雨綢繆
,表明要做一件事情需要提前做好准備,才能更好的完成工作。預測也是一種提前做好准備的思想,通過預測的方式提前開始某些操作,會比等到確切知道這些操作啟動時要快,通過另一方面提高系統性能。
存儲器層次
存儲器層次我在之前的文章中多次提到了,這是金字塔的層次設計模型,如下圖所示
在存儲器層次結構中,速度最快,容量最小的並且價格最昂貴的位於頂層,而速度最慢、容量最大而且價格便宜的位於底層。
通過冗余提高可靠性
計算機不僅要保證工作的速度、還要保證工作的可靠。由於任何一個物理器件都有可能會失效,因此可以通過使用冗余部件的方式提高系統的可靠性(dependable)
,冗余部件可以替代失效部件並且可以幫助其檢測錯誤。
計算機程序
一個應用程序可能由數千萬行代碼組成,我們知道,計算機中的硬件只能提供最簡單的低級指令,從復雜的應用程序到簡單的指令需要經過軟件的幾個層次來逐步解釋和翻譯。下圖展示了軟件結構的幾個層次
最外層是應用軟件,最核心是硬件
,系統軟件(systems software)
位於兩者之間。
系統軟件:通常提供服務性質的軟件,包括操作系統、編譯程序等。
操作系統和編譯程序是對於所有計算機來說都是必須的,這兩個系統軟件是非常重要的,操作系統是計算機硬件和軟件之間的接口;為用戶提供各種調用和協調服務,操作系統主要的功能如下
- 處理用戶輸入和輸出
- 協調內存和 CPU
- 為各種應用軟件提供服務
而編譯程序是完成另一項重要功能的程序:它把高級語言例如 C、Java、C++ 編寫的程序翻譯成為機器指令,這個翻譯過程是非常復雜的。
編譯程序
在計算機世界中,它能識別的只有兩個信號:0 和 1,所以我們認為計算機只能識別二進制數。每個字母就代表計算機中的二進制位(binary digit)
或者 一位(bit)
。八個二進制位成為一個字節(byte)
,字節是最小的尋址單元,一連串的二進制位構成了計算機術語中的 指令(instruction)
,即 01010101110110 等等。。。。。。
第一代程序員是直接使用二進制數與計算機通信的,這是一項非常乏味的工作,所以為了改善這種枯燥無聊的編寫方式,程序員很快發明了助記符
,最初助記符是通過手工翻譯成為二進制的,這種轉換過程過於浮躁無聊和繁瑣,為了改善這種情況,程序員發明了一種 匯編程序(assembler)
的軟件,可以將助記符自動轉換為對應的二進制。比如我們使用助記符 add A,B
,這段代碼就會自動的被二進制 0101011011
。該指令告訴計算機將使用 A 和 B 進行相加操作。這種助記符使用的語言就是匯編語言(assembly language)
。而機器可以理解的二進制語言稱為 機器語言(machine language)
。
- 匯編程序:將指令由助記符形式翻譯成二進制形式的程序
- 匯編語言:以助記符形式表示的語言
- 機器語言:以二進制元形式表示的機器指令
然而,隨着時代的發展,匯編語言也慢慢面的枯燥乏味,所以出現了像是 C、Java 這樣的高級語言,也就是我們開發所使用的語言,高級語言的出現,大大提高了編程效率,但是,萬變不離其宗,高級語言也要經過
這一個轉換過程。高級編程語言和編譯程序大大提高了軟件的生產率。
使用高級語言有以下幾個好處:
其一,可以讓程序員使用更自然的語言來思考
其二,高級語言提高了程序員的生產率,加速程序的開發過程
其三,采用高級語言編寫程序提高了程序對於計算機的獨立性
硬件入門
看到這里你可能會有疑問,為什么要學硬件呢?換個角度來講,憑什么培訓三個月出來的程序員能夠和科班學習四年的程序員一起競爭找工作?想過這個問題沒有?
那是因為,培訓機構不會為你的長遠考慮,短期找到工作能夠交差即可。把一個程序員的素養等價為找到工作即可,這本來就是這個行業的污點所在,CRUD 程序員不需要專業的程序素養,完成工作即可。為什么程序總有填不完的坑,不考慮程序健壯性、可拓展性、設計模式,寫代碼只為了自己,而不是以工程化的標准來要求自己就是培訓班和科班的素養和差距。這也是我為什么最近在研究計算機基礎的原因,因為我不夠有素質
。
為什么學硬件?就是能夠讓你從計算機的角度思考問題。好了不多說了,說多了該被培訓班 diss 了。
任何一台計算機的基礎硬件都需要完成最基本的功能:輸入數據、輸出數據、處理數據、存儲數據。我們討論的主題就是描述這些功能是怎樣完成的。
下面我們就要探討一下這些硬件
顯示器
顯示器是一個非常吸引人的輸出設備,大多數個人移動設備都用 液晶顯示(Liquid Crystal Display, LCD)
來獲得輕巧、低功耗的顯示效果。LCD 能夠控制光的傳輸。今天,大多數 LCD 顯示器都采用 動態矩陣顯示(active matrix display)
技術,其每個像素(pixel)
都由一個晶體管精確的控制電流,從而使圖像更加清晰。在彩色動態矩陣 LCD 中,還有一個 紅 - 綠 - 藍屏決定三種顏色分量的強度,每個點需要三個晶體管開關。
- 液晶顯示,這是一種顯示技術,用液體聚合物薄層的帶電或者不帶電來傳輸或者阻止光線的傳輸
- 動態矩陣顯示,一種液態顯示技術,使用晶體管控制單個像素上光線的傳輸
- 像素,圖像元素的最小單位,屏幕由成千上萬的像素來組成
圖像由像素矩陣組成,可以表示成二進制位的矩陣,稱為 位圖(bit map)
。不同分辨率所能夠支持的矩陣大小不同,彩色顯示器使用 8 位來表示每個三原色(紅、綠和藍),每個像素用 24 位表示,可以顯示百萬種不同的顏色。
計算機硬件使用光柵刷新緩沖區(又稱為幀緩沖區)來保存位圖以支持圖像。
圖中的 X0 Y0 ,X1 Y1 都表示像素
觸摸屏
后 PC 時代,移動設備的高速發展,使觸摸屏成為一種趨勢,觸摸屏有兩種實現
電阻式觸摸屏(Resistive touchscreens)
:電阻式觸摸屏基於施加到屏幕上的壓力來工作。 電阻屏由許多層組成。 當按下屏幕時,外部的后面板將被推到下一層,下一層會感覺到施加了壓力並記錄了輸入。 電阻式觸摸屏用途廣泛,可以用手指,指甲,手寫筆或任何其他物體進行操作。
電容式觸摸屏(capacitive touchscreen)
:電容式觸摸屏通過感應物體(通常是指尖上的皮膚)的導電特性來工作。 手機或智能手機上的電容屏通常具有玻璃表面,並且不依賴壓力。 當涉及到手勢(如滑動和捏合)時,它比電阻式屏幕更具響應性。 電容式觸摸屏只能用手指觸摸,而不能用普通的手寫筆,手套或大多數其他物體來響應。
機箱
下面是一個 ipad2
的剖面圖
這里面包括集成電路,也稱為芯片(chip)
、CPU、前置攝像頭、后置攝像頭、麥克風、耳機插孔、揚聲器、加速計、陀螺儀、Wi-Fi 網絡和藍牙網絡等。
為了進一步理解硬件,下面展示了一款蘋果 A5 微處理器的實現細節,處理器從邏輯上包括兩個主要部件:數據通路和控制器
數據通路主要用來執行算數運算
控制器主要負責指導數據通路、存儲器和 I/O 設備按照正確的指令進行執行
除此之外,上述剖面圖還包括 GPIO
,通用型之輸入輸出的簡稱。
DDR SDRM 接口是內存條接口,通過提供多個隔行掃描的內存訪問,從而提高內存帶寬
內存是程序運行的存儲空間,它同時用於保存程序運行時所使用的數據,內存由 DRAM 芯片組成。DRAM(Dynamic random access memory)
是動態隨機訪問存儲器的縮寫。在處理器內部使用的是另外一種存儲器 - 緩存(cache memory)
,這是一種小而快的存儲器,一般作為 DRAM 的緩沖。cache 使用的是 靜態訪問存儲器(Static Random Access Memory, SRAM)
,它的速度要比 DRAM 更快,價格也更加昂貴。
我們上面探討了影響計算機的幾大設計思想,其中非常重要的一個思想就是 抽象
,計算機硬件和軟件的接口就是一種抽象,這種抽象又被叫做 指令集體系結構(instruction set architecture)
,或者簡稱為 體系結構(architecture)
。提供給應用程序員基本指令集和操作系統接口稱為 應用二進制接口(Application Binary Interface)
。
這種抽象的好處是讓程序員能夠單獨的實現應用程序,而不用考慮其內部的硬件,內部硬件和系統應用程序只提供對用戶的服務。對程序員隱藏內部實現細節。
與其他計算機通信
上面我們已經基本介紹到了輸入、輸出、控制器、存儲器,但是對於計算機,還有一項非常重要的功能我們沒有介紹 - 計算機網絡
,通過計算機聯網,可以實現與其他計算機通信,任何計算機都不能成為信息的 孤島
,計算機通信能為我們帶來下面這些好處
- 信息交互:在聯網的兩台計算機之間實現信息交互
- 資源共享:有些 I/O 設備可以由網絡上的計算機共享
- 遠距離訪問:用戶可以通過遠距離操作計算機
隨着傳輸速度以及通信傳輸的距離,通信代價也在隨之增長,網絡的傳輸是多種多樣的,最常見的就是 以太網
,以太網是一種連接局域網的傳統技術,它能夠使設備通過協議(一組規則或通用網絡語言)相互通信,以太網的接入設備可以相互識別對方,以太網中的一個例子就是 局域網(Local Area Network, LAN)
,局域網通過交換機進行組網。還有一種距離更遠的網絡是 廣域網
,廣域網可支持萬維網(World Wide Web)
。
- 局域網:一種在一定的地理區域使用的傳輸數據的網絡
- 廣域網:一種可將區域擴展到幾百幾千米范圍的網絡
隨着計算機的不斷發展,通信速度和性能也在不斷提升。
處理器和存儲器制造技術
處理器和存儲器在高速發展,計算機最初使用的是晶體管,然后后面慢慢出現了集成電路、超大規模集成電路。下表展示了這個演變過程
時間 | 計算機構造 |
---|---|
1951 | 真空管 |
1965 | 晶體管 |
1975 | 集成電路 |
1995 | 超大規模集成電路 |
2013 | 更大規模集成電路 |
晶體管(transistor)
是一種固體半導體器件,具有多種功能。晶體管作為一種可變電流開關,能夠基於輸入電壓控制輸出電流。集成電路(IC)
由成千上萬的晶體管組成。后面不斷的發展為更多晶體管組成的 超大規模集成電路(VLSL)
。
性能
計算機的性能是很難評判的,我們將從以下幾個方便來展開探討
性能的定義
個人計算機用戶比較感興趣的就是 響應時間(response time)
,響應時間就是指一個任務從開始到完成所需要的時間,又稱為執行時間。而數據中心感興趣的常常是 吞吐率(throughput)
。
- 響應時間:也叫
執行時間(execution time)
,是計算機完成某項任務所需要的總時間,包括硬盤訪問、內存訪問、I/O 活動、操作系統開銷和 CPU 的執行時間等。 - 吞吐率:也叫
帶寬(bandwidth)
,性能的另一種度量參數,表示單位時間內完成的任務數量。
性能的度量
如果使用時間來度量計算機,那么完成同樣的任務,需要時間最少的計算機是最快的。程序的執行時間一般以秒
為單位。我們可以使用 CPU 執行時間
來表示在 CPU 上花費的時間,而不包括其他 I/O 或應用程序的時間。CPU 時間可以進一步分為用於用戶程序的時間和操作系統為用戶服務花去的 CPU 時間,前者稱為 CPU 時間,后者稱為系統 CPU 時間。
- CPU 執行時間:簡稱 CPU 時間,執行某一任務在 CPU 上花費的時間
- 用戶 CPU 時間:為用戶服務所花費的時間
- 系統 CPU 時間:為執行程序花費在操作系統上的時間。
為了一致性,我們使用 CPU 性能表示用戶 CPU 時間,用系統性能表示系統空運行的響應時間。
幾乎所有的計算機都會使用時鍾來驅動硬件中的各種事件。時鍾間隔的時間稱為 時鍾周期(clock cycle)
。也可以用它的倒數來描述,稱為 時鍾頻率(clock rate)
。
CPU 性能及其因素
我們一般使用下面的公式來表示 CPU 的性能
CPU 執行程序的時間 = 程序 CPU 時鍾周期數 * 時鍾周期時間
由於時鍾頻率和時鍾周期互為倒數的關系,所以也可以用
CPU 執行程序的時間 = 程序 CPU 時鍾周期數 / 時鍾頻率
有了公式后,我們可以對各個指標進行描述,在時鍾周期時間內,程序 CPU 時鍾周期數越低,CPU 性能越高。在周期數相同的情況下,時鍾頻率越高,CPU 性能越高。
指令的性能
CPU 最終是要執行指令的,一個考慮指令執行時間的方法是:執行時間等於執行的指令 * 每條指令的平均時間。所以,一個程序需要的時鍾周期數為
CPU 時鍾周期數 = 程序指令數 * 每條指令的平均執行周期
我們一般使用 CPI(clock cycle per instruction)
表示執行每條指令所需的時鍾周期的平均值。不同指令執行的周期可能不同,所以 CPI 表示的是一個平均值。
所以我們可以使用 CPU 時間 = 指令數 * CPI * 時鍾周期時間
或者 CPU 時間 = 指令數 * CPI / 時鍾頻率
總結
本篇文章我們主要介紹了 計算應用分類、計算機發展的八大思想、計算機結構層次、基本硬件入門,還有計算機通信、處理器發展、性能的定義。