天天看點

計算機神書:一書貫穿計算機系統方方面面的概念

作者:Randal E. Bryant,David R. O'Hallaron

計算機系統是由硬體和系統軟體組成的,它們共同協作以運作應用程式。計算機内部的資訊被表示為一組組的位,它們依據上下文有不同的解釋方式。程式被其他程式翻譯成不同的形式,開始時是ASCII文本,然後被編譯器和連結器翻譯成二進制可執行檔案。

處理器讀取并解釋存放在主存裡的二進制指令。因為計算機花費了大量的時間在記憶體、I/O裝置和CPU寄存器之間複制資料,是以将系統中的儲存設備劃分成層次結構——CPU寄存器在頂部,接着是多層的硬體高速緩存存儲器、DRAM主存和磁盤存儲器。在層次模型中,位于更高層的儲存設備比低層的儲存設備要更快,機關比特造價也更高。層次結構中較高層次的儲存設備可以作為較低層次裝置的高速緩存。通過了解和運用這種存儲層次結構的知識,程式員可以優化C程式的性能。

作業系統核心是應用程式和硬體之間的媒介。它提供三個基本的抽象:1)檔案是對I/O裝置的抽象;2)虛拟記憶體是對主存和磁盤的抽象;3)程序是處理器、主存和I/O裝置的抽象。

最後,網絡提供了計算機系統之間通信的手段。從特殊系統的角度來看,網絡就是一種I/O裝置。

重要主題:系統不僅僅隻是硬體。系統是硬體和系統軟體互相交織的集合體,它們必須共同協作以達到運作應用程式的最終目的。本書的餘下部分會講述硬體和軟體的詳細内容,通過了解這些詳細内容,你可以寫出更快速、更可靠和更安全的程式。

我們在此強調幾個貫穿計算機系統所有方面的重要概念。我們會在本文多處讨論這些概念的重要性。

01Amdahl

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版)》,經出版方授權釋出。

計算機神書:一書貫穿計算機系統方方面面的概念

作者:[美] 蘭德爾 E.布萊恩特(Randal E. Bryant)

大衛 R. 奧哈拉倫(David R. O'Hallaron) 

譯者:龔奕利 賀蓮

被譽為“價值超過等重量黃金的無價資源寶庫”了解計算機系統首選書目, 十餘萬程式員的共同選擇。

本書是一本将計算機軟體和硬體理論結合講述的經典教程,内容覆寫計算機導論、體系結構和處理器設計等多門課程。卡内基-梅隆大學、北京大學、上海交大等國内外衆多知名高校選用指定教材。

本書的最大優點是為程式員描述計算機系統的實作細節,通過描述程式是如何映射到系統上,以及程式是如何執行的,使讀者更好地了解程式的行為,以及造成效率低下的原因。

如何使用本書從程式員的角度來學習計算機系統是如何工作的會非常有趣。最理想的學習方法是在真正的系統上解決具體的問題,或是編寫和運作程式。這個主題觀念貫穿本書始終。是以我們建議你用如下方式學習這本書:

  • 學習一個新概念時,你應該立刻做一做緊随其後的一個或多個練習題來檢驗你的了解。這些練習題的解答在每章的末尾。要先嘗試自己來解答每個問題,然後再查閱答案。
  • 每一章後都有一組難度不同的作業題,這些題目需要的時間從十幾分鐘到十幾個小時,但建議你嘗試完成這些作業題,完成之後你會發現對系統的了解更加深入。
  • 本書中有豐富的代碼示例,鼓勵你在系統上運作這些示例的源代碼。
  • 向老師或他人請教和交流是很好的學習方式。

福利時間

感謝機械工業華章科技贊助 2 本書給咱讀者嘗鮮(關于本書的讀者群,有意向加入的同學,可添加小編微信codingSmart),參與方式如下:

  1. 進入公衆号回複計算機

繼續閱讀