贯穿计算机系统所有方面的重要概念,终于有人讲明白了
導讀:我們在此強調幾個貫穿計算機系統所有方面的重要概念。我們會在本文多處討論這些概念的重要性。
作者:Randal E. Bryant,David R. O'Hallaron
來源:華章計算機(hzbook_jsj)
計算機系統是由硬件和系統軟件組成的,它們共同協作以運行應用程序。計算機內部的信息被表示為一組組的位,它們依據上下文有不同的解釋方式。程序被其他程序翻譯成不同的形式,開始時是ASCII文本,然后被編譯器和鏈接器翻譯成二進制可執行文件。
處理器讀取并解釋存放在主存里的二進制指令。因為計算機花費了大量的時間在內存、I/O設備和CPU寄存器之間復制數據,所以將系統中的存儲設備劃分成層次結構——CPU寄存器在頂部,接著是多層的硬件高速緩存存儲器、DRAM主存和磁盤存儲器。
在層次模型中,位于更高層的存儲設備比低層的存儲設備要更快,單位比特造價也更高。層次結構中較高層次的存儲設備可以作為較低層次設備的高速緩存。通過理解和運用這種存儲層次結構的知識,程序員可以優化C程序的性能。
操作系統內核是應用程序和硬件之間的媒介。它提供三個基本的抽象:
文件是對I/O設備的抽象;
虛擬內存是對主存和磁盤的抽象;
進程是處理器、主存和I/O設備的抽象。
最后,網絡提供了計算機系統之間通信的手段。從特殊系統的角度來看,網絡就是一種I/O設備。
重要主題:系統不僅僅只是硬件。系統是硬件和系統軟件互相交織的集合體,它們必須共同協作以達到運行應用程序的最終目的。本書的余下部分會講述硬件和軟件的詳細內容,通過了解這些詳細內容,你可以寫出更快速、更可靠和更安全的程序。
01 Amdahl
Gene Amdahl,計算領域的早期先鋒之一,對提升系統某一部分性能所帶來的效果做出了簡單卻有見地的觀察。這個觀察被稱為Amdahl定律(Amdahl's law)。
該定律的主要思想是,當我們對系統的某個部分加速時,其對系統整體性能的影響取決于該部分的重要性和加速程度。若系統執行某應用程序需要時間為Told。假設系統某部分所需執行時間與該時間的比例為α,而該部分性能提升比例為k。即該部分初始所需時間為αTold,現在所需時間為(αTold)/k。因此,總的執行時間應為
Tnew=(1-α)Told+(αTold)/k=Told[(1-α)+α/k]
由此,可以計算加速比S=Told/Tnew為
舉個例子,考慮這樣一種情況,系統的某個部分初始耗時比例為60%(α=0.6),其加速比例因子為3(k=3)。則我們可以獲得的加速比為1/[0.4+0.6/3]=1.67倍。雖然我們對系統的一個主要部分做出了重大改進,但是獲得的系統加速比卻明顯小于這部分的加速比。
這就是Amdahl定律的主要觀點——要想顯著加速整個系統,必須提升全系統中相當大的部分的速度。
表示相對性能
性能提升最好的表示方法就是用比例的形式Told/Tnew,其中,Told為原始系統所需時間,Tnew為修改后的系統所需時間。如果有所改進,則比值應大于1。我們用后綴“×”來表示比例,因此,“2.2×”讀作“2.2倍”。
表示相對變化更傳統的方法是用百分比,這種方法適用于變化小的情況,但其定義是模糊的。應該等于100·(Told-Tnew)/Tnew,還是100·(Told-Tnew)/Told,還是其他的值?此外,它對較大的變化也沒有太大意義。與簡單地說性能提升2.2×相比,“性能提升了120%”更難理解。
Amdahl定律一個有趣的特殊情況是考慮k趨向于∞時的效果。這就意味著,我們可以取系統的某一部分將其加速到一個點,在這個點上,這部分花費的時間可以忽略不計。于是我們得到
舉個例子,如果60%的系統能夠加速到不花時間的程度,我們獲得的凈加速比將仍只有1/0.4=2.5×。
Amdahl定律描述了改善任何過程的一般原則。除了可以用在加速計算機系統方面之外,它還可以用在公司試圖降低刀片制造成本,或學生想要提高自己的績點平均值等方面。也許它在計算機世界里是最有意義的,在這里我們常常把性能提升2倍或更高的比例因子。這么高的比例因子只有通過優化系統的大部分組件才能獲得。
02 并行和并發
數字計算機的整個歷史中,有兩個需求是驅動進步的持續動力:一個是我們想要計算機做得更多,另一個是我們想要計算機運行得更快。當處理器能夠同時做更多的事情時,這兩個因素都會改進。
我們用的術語并發(concurrency)是一個通用的概念,指一個同時具有多個活動的系統;而術語并行(parallelism)指的是用并發來使一個系統運行得更快。并行可以在計算機系統的多個抽象層次上運用。在此,我們按照系統層次結構中由高到低的順序重點強調三個層次。
1. 線程級并發
構建在進程這個抽象之上,我們能夠設計出同時有多個程序執行的系統,這就導致了并發。使用線程,我們甚至能夠在一個進程中執行多個控制流。
自20世紀60年代初期出現時間共享以來,計算機系統中就開始有了對并發執行的支持。傳統意義上,這種并發執行只是模擬出來的,是通過使一臺計算機在它正在執行的進程間快速切換來實現的,就好像一個雜耍藝人保持多個球在空中飛舞一樣。
這種并發形式允許多個用戶同時與系統交互,例如,當許多人想要從一個Web服務器獲取頁面時。它還允許一個用戶同時從事多個任務,例如,在一個窗口中開啟Web瀏覽器,在另一窗口中運行字處理器,同時又播放音樂。
在以前,即使處理器必須在多個任務間切換,大多數實際的計算也都是由一個處理器來完成的。這種配置稱為單處理器系統。
當構建一個由單操作系統內核控制的多處理器組成的系統時,我們就得到了一個多處理器系統。其實從20世紀80年代開始,在大規模的計算中就有了這種系統,但是直到最近,隨著多核處理器和超線程(hyperthreading)的出現,這種系統才變得常見。圖1給出了這些不同處理器類型的分類。
▲圖1 不同的處理器配置分類。隨著多核處理器和超線程的出現,多處理器變得普遍了
多核處理器是將多個CPU(稱為“核”)集成到一個集成電路芯片上。圖2描述的是一個典型多核處理器的組織結構,其中微處理器芯片有4個CPU核,每個核都有自己的L1和L2高速緩存,其中的L1高速緩存分為兩個部分——一個保存最近取到的指令,另一個存放數據。
這些核共享更高層次的高速緩存,以及到主存的接口。工業界的專家預言他們能夠將幾十個、最終會是上百個核做到一個芯片上。
▲圖2 多核處理器的組織結構。4個處理器核集成在一個芯片上
超線程,有時稱為同時多線程(simultaneous multi-threading),是一項允許一個CPU執行多個控制流的技術。它涉及CPU某些硬件有多個備份,比如程序計數器和寄存器文件,而其他的硬件部分只有一份,比如執行浮點算術運算的單元。
常規的處理器需要大約20000個時鐘周期做不同線程間的轉換,而超線程的處理器可以在單個周期的基礎上決定要執行哪一個線程。這使得CPU能夠更好地利用它的處理資源。比如,假設一個線程必須等到某些數據被裝載到高速緩存中,那CPU就可以繼續去執行另一個線程。
舉例來說,Intel Core i7處理器可以讓每個核執行兩個線程,所以一個4核的系統實際上可以并行地執行8個線程。
多處理器的使用可以從兩方面提高系統性能。首先,它減少了在執行多個任務時模擬并發的需要。正如前面提到的,即使是只有一個用戶使用的個人計算機也需要并發地執行多個活動。其次,它可以使應用程序運行得更快,當然,這必須要求程序是以多線程方式來書寫的,這些線程可以并行地高效執行。
因此,雖然并發原理的形成和研究已經超過50年的時間了,但是多核和超線程系統的出現才極大地激發了一種愿望,即找到書寫應用程序的方法利用硬件開發線程級并行性。
2. 指令級并行
在較低的抽象層次上,現代處理器可以同時執行多條指令的屬性稱為指令級并行。
早期的微處理器,如1978年的Intel 8086,需要多個(通常是3~10個)時鐘周期來執行一條指令。最近的處理器可以保持每個時鐘周期2~4條指令的執行速率。其實每條指令從開始到結束需要長得多的時間,大約20個或者更多周期,但是處理器使用了非常多的聰明技巧來同時處理多達100條指令。
如果處理器可以達到比一個周期一條指令更快的執行速率,就稱之為超標量(superscalar)處理器。大多數現代處理器都支持超標量操作。
3. 單指令、多數據并行
在最低層次上,許多現代處理器擁有特殊的硬件,允許一條指令產生多個可以并行執行的操作,這種方式稱為單指令、多數據,即SIMD并行。例如,較新幾代的Intel和AMD處理器都具有并行地對8對單精度浮點數(C數據類型float)做加法的指令。
提供這些SIMD指令多是為了提高處理影像、聲音和視頻數據應用的執行速度。雖然有些編譯器會試圖從C程序中自動抽取SIMD并行性,但是更可靠的方法是用編譯器支持的特殊的向量數據類型來寫程序,比如GCC就支持向量數據類型。
03 計算機系統中抽象的重要性
抽象的使用是計算機科學中最為重要的概念之一。例如,為一組函數規定一個簡單的應用程序接口(API)就是一個很好的編程習慣,程序員無須了解它內部的工作便可以使用這些代碼。不同的編程語言提供不同形式和等級的抽象支持,例如Java類的聲明和C語言的函數原型。
我們已經介紹了計算機系統中使用的幾個抽象,如圖3所示。在處理器里,指令集架構提供了對實際處理器硬件的抽象。使用這個抽象,機器代碼程序表現得就好像運行在一個一次只執行一條指令的處理器上。
底層的硬件遠比抽象描述的要復雜精細,它并行地執行多條指令,但又總是與那個簡單有序的模型保持一致。只要執行模型一樣,不同的處理器實現也能執行同樣的機器代碼,而又提供不同的開銷和性能。
▲圖3 計算機系統提供的一些抽象。計算機系統中的一個重大主題就是提供不同層次的抽象表示,來隱藏實際實現的復雜性
在學習操作系統時,我們介紹了三個抽象:文件是對I/O設備的抽象,虛擬內存是對程序存儲器的抽象,而進程是對一個正在運行的程序的抽象。
我們再增加一個新的抽象:虛擬機,它提供對整個計算機的抽象,包括操作系統、處理器和程序。虛擬機的思想是IBM在20世紀60年代提出來的,但是最近才顯示出其管理計算機方式上的優勢,因為一些計算機必須能夠運行為不同的操作系統(例如,Microsoft Windows、MacOS和Linux)或同一操作系統的不同版本設計的程序。
計算機系統是由硬件和系統軟件組成的,它們共同工作來運行應用程序。雖然系統的具體實現方式隨著時間不斷變化,但是系統內在的概念卻沒有改變。所有計算機系統都有相似的硬件和軟件組件,它們又執行著相似的功能。
一些程序員希望深入了解這些組件是如何工作的以及這些組件是如何影響程序的正確性和性能的,以此來提高自身的技能。《深入理解計算機系統》這本書便是為這些讀者而寫的。
現在就要開始一次有趣的漫游歷程了。如果你全力投身學習這些概念,完全理解底層計算機系統以及它對應用程序的影響,那么你會步上成為為數不多的“大牛”的道路。
??
本文摘編自《深入理解計算機系統(原書第3版)》,經出版方授權發布。
延伸閱讀《深入理解計算機系統(原書第3版)》
推薦語:被譽為“價值超過等重量黃金的無價資源寶庫”理解計算機系統首選書目,?十余萬程序員的共同選擇。本書是一本將計算機軟件和硬件理論結合講述的經典教程,內容覆蓋計算機導論、體系結構和處理器設計等多門課程。卡內基-梅隆大學、北京大學、上海交大等國內外眾多知名高校選用指定教材。
劃重點????
干貨直達????
Python高能小技巧:不要在for與while循環后面寫else塊
終于有人把量化投資講明白了
人工智能時代都需要哪些數學知識?這些經典教材給你劃重點
4種數據分析基礎方法,終于有人講明白了
更多精彩????
在公眾號對話框輸入以下關鍵詞
查看更多優質內容!
PPT?|?讀書?|?書單?|?硬核?|?干貨?|?講明白?|?神操作
大數據?|?云計算?|?數據庫?|?Python?|?可視化
AI?|?人工智能?|?機器學習?|?深度學習?|?NLP
5G?|?中臺?|?用戶畫像?|?1024?|?數學?|?算法?|?數字孿生
據統計,99%的大咖都關注了這個公眾號
????
總結
以上是生活随笔為你收集整理的贯穿计算机系统所有方面的重要概念,终于有人讲明白了的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 这些“震惊世界的新发现”,原来都是科学界
- 下一篇: 极度烧脑+惊人发现:4个颠覆你世界观的量