自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

CPU 進化論:復雜指令集 CISC

商務辦公
本文從歷史的角度講述了復雜指令集出現(xiàn)的必然,復雜指令集對于那些直接使用匯編語言進行編程的程序員來說是很方便的,同時復雜指令集的指令密度更高,相同的存儲空間可以存儲更多程序,這一切都推動了復雜指令集的發(fā)展。

[[401849]]

英國生物學家達爾文于 1859 年出版了震動整個學術界和宗教界的《物種起源》,達爾文在這本書里提出了生物進化論學說,認為生命在不斷演變進化,物競天擇適者生存。

沒有歷史的計算機

生命是這樣,實際上計算機技術也是如此。

計算機技術也和生命體一樣在不斷演變進化,在討論一項技術時,如果不了解其演變過程而僅僅著眼于當下就會讓人疑惑,不巧的是這正是當前計算機教育的現(xiàn)狀——沒有歷史。

因此,在這里我將嘗試從歷史的角度來講講 CPU,以及 CPU 的發(fā)展歷程。

本篇主要關注CPU與復雜指令集CISC。

首先來看下什么是CPU。

什么是CPU?

我們都是程序員,那么從程序員的角度來看,CPU的工作其實是很簡單的。

我們編寫的所有程序,不管是簡單的Hello World,還是復雜的比如PhotoShop之類大型App,最終都會被編譯器轉為一條條簡單的機器指令,因此在CPU看來所有程序是沒有什么本質區(qū)別的,無非就是一個包含的指令多,一個包含的指令少,這些指令就保存在可執(zhí)行文件中,程序運行時被加載到內存開始被CPU執(zhí)行。

管你是簡單程序還是復雜程序,CPU才不關心這些,它只需要簡單一條一條的執(zhí)行就可以了,因此,在程序員眼里 CPU 是一個很簡單的家伙。

有很多同學可能會好奇CPU是怎么構造出來,你可以參考《你管這破玩意叫CPU》。

接下來我們的視角就可以進一步聚焦了,CPU執(zhí)行的是什么機器指令呢?

CPU的能力圈:指令集

我們該怎樣描述一個人的能力呢?寫過簡歷的同學肯定都知道,就像這樣:

會寫代碼

  • 會炒菜
  • 會唱歌
  • 會跳舞
  • 會炒股
  • 。。。

巴菲特有一個詞用的很好,這叫能力圈,如果一個人會“寫代碼”,那么你命令這個人“寫代碼”,他就能寫出代碼來(現(xiàn)實情況下你讓他寫代碼他可能會過來打你)。

CPU也是同樣的道理,每種類型的CPU都要自己的能力圈,只不過CPU的能力圈有一個特殊的名字,叫做 Instruction Set Architecture ,ISA,也就是指令集,指令集中包含各種各樣的指令:

  • 會加法
  • 會從內存把數(shù)據(jù)搬運到寄存器
  • 會跳轉
  • 會比較大小
  • 。。。

指令集告訴我們一個CPU可以干嘛。

你從ISA中找一條指令發(fā)給CPU,CPU就是完成這條指令所代表的任務。

ISA有什么用呢,當然是程序員用來編程啦!

沒錯,最初的程序都是面向CPU直接用匯編來寫程序,這一時期也非常的樸實無華,沒有那么多花哨的概念,什么面向對象啦,什么設計模式啦,統(tǒng)統(tǒng)沒有,總之這個時期的程序員寫代碼只需要看看ISA就可以了。

這就是指令集的概念,注意,指令集是CPU告訴程序員該怎么讓自己工作的。

不同的CPU會有不同類型的指令集,指令集的類型除了影響程序員寫匯編程序之外還會影響CPU的硬件設計,到底CPU該采用什么類型的指令集,CPU該如何設計,這一論戰(zhàn)持續(xù)至今,并且愈發(fā)精彩。

接下來我們看一下第一種也是最先誕生的指令集類型:復雜指令集,Complex Instruction Set Computer,簡稱CISC。當今普遍存在于桌面PC以及服務器端的x86架構就是基于復雜指令集CISC,生產(chǎn)x86處理器的廠商就是我們熟悉的“等,等等等等”英特爾以及AMD。

抽象:少就是多

直到1970s年代,這一時期編譯器還非常菜,不像現(xiàn)在這么智能,沒多少人信得過編譯器,大部分程序還是用匯編語言純手工編寫 (這一點極為重要,對于接下來理解復雜指令集非常關鍵),這對現(xiàn)代程序員來說是無法想象的,不要說手寫匯編語言,就是看懂匯編語言的程序員都不會很多。

當然,現(xiàn)代編譯器已經(jīng)足夠強大足夠智能,編譯器生成的匯編語言已經(jīng)足夠優(yōu)秀,因此當今程序員,除了編寫操作系統(tǒng)以及部分驅動的那幫家伙,剩下的幾乎已經(jīng)意識不到匯編語言的存在了,不要覺得可惜,這是生產(chǎn)力進步的表現(xiàn),用高級語言編寫程序的效率可是匯編語言望塵莫及的。

題外話說的有點多,總之,這一時期的大部分程序都是直接通過匯編語言編寫的,因此大家普遍認為指令集應該更加豐富一些、指令本身功能更強大一些,程序員常用的操作最好都有對應的特定指令,畢竟大家都在直接用匯編語言來寫程序,如果指令集很少或者指令本身功能單一,那么程序員用匯編指令寫起程序會會非常繁瑣,很不方便,如果你在這個時期用匯編寫程序你也會這樣想。

這就是這個時期一些計算機科學家所謂的抹平差異,semantic gap,抹平什么差異呢?

大家認為高級語言中的一些概念比如函數(shù)調用、循環(huán)控制、復雜的尋址模式、數(shù)據(jù)結構和數(shù)組的訪問等都應該直接有對應的機器指令,這些就是現(xiàn)代大家認為的復雜指令集CISC非常鮮明的特點。

除了更方便的使用匯編語言寫程序,另一點需要考慮就是存儲。

物種起源

當今的計算機都遵從馮諾依曼架構,該架構的核心思想之一是“程序應該和數(shù)據(jù)一樣都作為比特保存在計算機存儲設備中”,下面這張圖是所有計算設備的鼻祖,你現(xiàn)在看這篇文章用計算設備,不管是智能手機或者iPad、PC,亦或是存放這篇文章的微信數(shù)據(jù)中心服務器,其本質都是下面這張簡單的圖,這張圖是一切計算設備的起源。

代碼也是要占存儲空間的

從馮諾依曼結構中我們就能知道為什么當今可執(zhí)行程序中,比如Windows下的EXE或者Linux下的ELF文件,即包含機器指令也包含數(shù)據(jù),對于程序員來說我們可以簡單的認為可執(zhí)行程序中有兩部分內容:數(shù)據(jù)段以及代碼段:

由此可見,程序員寫的代碼是要占據(jù)存儲空間的,要知道在1970s年代,內存大小僅僅數(shù)KB到數(shù)十KB,這是當今程序員不可想象的,因為現(xiàn)在(2021年)的智能手機內存都已經(jīng)數(shù)GB。如圖所示是1974年發(fā)布的Intel 1103內存芯片:

[[401851]]

大小只有 1KB 的英特爾1103存儲芯片的于1974年發(fā)布,這標志著計算機工業(yè)界開始進入動態(tài)隨機存儲DRAM時代,DRAM也就是我們熟知的內存。

大家可以思考一下,幾KB的內存,可謂寸土寸金,這么小的內存要想裝入更多的程序就必須仔細的設計機器指令以節(jié)省程序占據(jù)的空間,這就要求:

  1. 一條機器指令盡可能完成更多的任務,這很容易理解,就像在《你管這破玩意叫編程語言》這篇中的例子一樣,你更希望有一條“給我端杯水”的指令,而不是自己去寫“邁出左腳;停住;邁出右腳;直到飲水機;伸出右手;拿起水杯;接水。。。”等等這樣的匯編代碼
  2. 機器指令長度不固定,也就是變長機器指令,簡單的指令占據(jù)更少的空間
  3. 機器指令高度編碼(encoded),提高代碼密度,節(jié)省空間

復雜指令集誕生的必然

基于對程序員方便編寫匯編語言以及節(jié)省代碼存儲空間的需要,直接促成了復雜指令集的設計,因此我們可以看到復雜指令集是這一時期必然的選擇,該指令集就這樣誕生了并開始成為主流。

就這樣經(jīng)過一段時間后,人們發(fā)現(xiàn)了新的問題,由于單條指令比較復雜,設計解碼機器指令的硬件(CPU的一部分)成了一件非常麻煩的事情,該怎樣解決這一問題呢?

CPU真的在直接執(zhí)行機器指令嗎?

作為程序員,我們知道,對于重復使用的代碼其實是沒有必要一遍遍編寫的,你可以把這些代碼封裝到函數(shù)中,這樣每次使用時只需要調用這個函數(shù)就好了,這個思路可以解決上述問題。

對于指令集中的每一條機器指令都有一小段對應的程序,這些程序存儲在CPU中,這些程序都是由更簡單的指令組成,這些指令就是所謂的微代碼,Microcode。

就這樣CPU的指令集可以添加更多的指令,代價僅僅是再多一些簡單的微代碼而已,是不是很天才的設計。

在這里也可以看到,一般我們認為CPU直接執(zhí)行機器指令,嚴格來說這是不正確的,對于含有微代碼設計的CPU來說,CPU直接執(zhí)行的并不是機器指令,而是微代碼,微代碼是CPU以及機器指令的中間層,機器指令相對于微代碼來說是“更高級的語言”,機器指令對程序員來說可見,但微代碼對程序員來說不可見,程序員無法直接使用微代碼來控制CPU。

而在這一時期,這些微代碼普遍存放在ROM中,Read-Only Memory,而ROM普遍要比內存便宜,因此依靠存儲在ROM中的微代碼來設計更多復雜指令進而減少程序本身對內存的占用是非常劃算的。

新的問題

一切看上去都很好,有了復雜指令集,程序員可以更方便的編寫匯編程序,這些程序也不需要占用很多存儲空間,代價就是CPU中需要有微代碼來簡化CPU設計。

然而這一設計隨著時間的推移又出現(xiàn)了新的問題。

作為程序員我們知道代碼難免會有bug,微代碼也不會有例外。但修復微代碼的bug要比修復普通程序的bug困難的多,你無法像普通程序那樣來測試、調試微代碼,這一切都太復雜了。

而且微代碼設計非常消耗晶體管,1979年代的Motorola 68000 處理器就采用該設計,其中三分之一的晶體管都用在了微代碼上。

同年,計算機科學家Dave Patterson被委以重任來改善微代碼設計,為此他還專門發(fā)表了論文,但他后來又推翻了自己想法,認為微代碼設計的復雜性問題很難解決,有問題的是微代碼這種設計本身。。

因此,有人開始反思,是不是還會有更好的設計。。。

預知后事如何請聽下回分解。

總結

CPU是整個計算機系統(tǒng)的核心,CPU指令集ISA更是核心中的核心。

本文從歷史的角度講述了復雜指令集出現(xiàn)的必然,復雜指令集對于那些直接使用匯編語言進行編程的程序員來說是很方便的,同時復雜指令集的指令密度更高,相同的存儲空間可以存儲更多程序,這一切都推動了復雜指令集的發(fā)展。

然而任何事物都有其必然性以及局限性,復雜指令集也不例外,隨著時間的推移采用復雜指令集的CPU設計出現(xiàn)各種各樣的問題,面對這些問題一部分人開始重新思考指令集到底該如何設計,我們將在下篇文章中繼續(xù)講述這一話題。

希望本篇對大家理解復雜指令集有所幫助。

本文轉載自微信公眾號「碼農的荒島求生」,可以通過以下二維碼關注。轉載本文請聯(lián)系碼農的荒島求生公眾號。

 

責任編輯:武曉燕 來源: 碼農的荒島求生
相關推薦

2013-03-06 09:51:54

2012-07-25 10:44:39

2009-10-28 09:11:17

2018-11-06 12:23:12

2020-11-18 13:03:10

云防火墻安全運營云安全

2013-10-17 16:46:00

DevOps

2017-04-10 10:06:09

互聯(lián)網(wǎng)

2009-12-07 10:19:19

服務器IT基礎架構惠普

2016-07-11 11:28:22

華三

2015-06-05 12:14:57

DevOps云應用開發(fā)Docker

2014-10-08 15:13:12

GITC2014全球互聯(lián)網(wǎng)技術大會

2014-10-22 09:09:16

敏捷華為

2021-03-13 08:00:59

機器人AI人工智能

2012-03-31 11:09:24

ITWindows

2025-04-25 00:00:00

2023-09-14 07:25:07

自主指令集核心

2009-06-18 09:39:05

無線網(wǎng)絡802.11n標準

2024-09-25 15:55:19

2009-12-08 17:46:29

惠普服務器進化
點贊
收藏

51CTO技術棧公眾號