計算機自從 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 / 時脈頻率
總結
本篇文章我們主要介紹了 計算應用分類、計算機發展的八大思想、計算機結構層次、基本硬體入門,還有計算機通訊、處理器發展、效能的定義。