《深入理解計算機系統》
讀書筆記
婁雨禛 PB16060356
第一部分 概述
綜述
本書從幾個生動的計算機程序實例引入,帶我們走進了一個龐大的計算機世界。計算機系統的誕生經歷了無數個創新性時刻,每一個看似顯然的成果都是來之不易的。比如,讓計算機用一種我們能夠理解的語言和我們交談,就包含預處理、編譯、鏈接、執行四個過程,每一個過程的進行和兩個過程之間的過渡都包含極其復雜的機器語言轉換。又比如,讓計算機系統能夠快速響應我們的指令,它需要一個高性能的處理器作為“大腦”,這個處理器的架構與制程包納了極其復雜的電路設計,任何一個極微小的差錯都會造成極其可怕的后果,而“超標量處理器”的誕生,更是經歷了一代又一代的革新與改進,最終達到了極致的精巧。如果我們深入去學習,就會發現每一個要點都可以去無窮無盡地去挖掘。
計算機語言部分
計算機只認得零和壹,而我們的正常語言包含千千萬萬種指令,這種從復雜到簡單的轉化過程,光想想就是宏偉的工程。在幾百年的歷史中沉淀下來的編程語言精華,從底層到上層,是機器語言、匯編語言、源程序語言、圖形化語言。圖形化語言接近我們的生活,幾乎不需要學習;原程序語言開始使我們困惑,因為它有很多限制,只有這些限制才保證了語言更嚴格地向下傳遞;匯編語言已經令我們頭暈,因為它分步執行,死板不通,同時極容易出錯,但只有這種嚴酷的死板才能被進一步簡化傳達;機器語言儼然是本天書,真正地將我們的語言體系與屬於計算機自己的語言體系分隔。
本書重點介紹了源程序語言的特殊性質和匯編語言的寄存器實現。在學習過程中,我們要體悟到,造成源程序語言所有特殊性質的根本,是二進制語言的編碼技巧。我們用零和壹去表示整數、浮點數,用二進制算法去表示加減乘除,這個過程看似簡單,實則包含深刻的數學。
比如,補碼的引入就不是顯然的,但這並不顯然的東西在時間的磨礪中留存下來,因為它在計算機語言的計算過程中提供了相當程度的便捷。補碼加法、補碼的非、補碼乘法,等等,在正常思路中的數學二進制計算很復雜時,換個思路,在補碼的范疇中想一想。
又比如,我們在十進制數學中並不習慣用移位來處理計算,但在計算機語言中,移位的思想深刻進入了計算機處理器中,因為它是單次計算的最簡潔表達。從十進制算術轉化到二進制算術中,移位操作數不勝數,我們如何用最少的移位達到最高的效率?這其中就有深刻的數學原理。
還比如,二進制典型的邏輯運算發展成了布爾數學,因為它盡管只是零和壹,但當千千萬萬個零和壹組合起來,它就需要一種規整有效的形式歸納表達。
這樣的例子有很多,它們告誡我們,千萬不要用一種簡單的視角看待形式簡單的二進制計算機語言,而是將它當作一門數學加以研究。此外,我們需要注意到在計算機語言中某些反常的地方,它們會在各處出現,造成他們的原因是C語言中的符號表示。這個要點在C語言編程時一定要銘記在心。
處理器部分
作為計算機的“大腦”,處理器的復雜程度超出想象。我們不可能在有限的課程中深入了解處理器,只是借助概念性的學習,掌握它最基本的運行思路。在下面歸結為三點。
第一,計算機有它自己的脈搏——時鍾。盡管計算機在處理任務時工作極其復雜,貌似毫無條理,但它的每一次操作無一例外地遵守內在時鍾的“滴答聲”。一次“滴答”,一次操作。現代處理器已經有2~3GHz的頻率,我們人腦是不可能實現這樣的運算速度的。
第二,現代處理器應用流水線化處理,實現了表觀上“一次時鍾,多條指令”的效果,大大提升了計算機性能。但這個過程並沒有違背“一次‘滴答’,一次‘操作’”的基本原理,而是借助向量轉化和良好的分塊(也就是任務的提取分配),實現了“超標量處理”。
第三,處理器要對各種異常進行處理。如果不是這樣,一個小小的差錯就會導致處理器癱瘓。現代的處理器非常聰明,它自身還攜帶者數據分析提取的元件,加上其自身體系中具有的“流水線冒險”的預處理機制,這些措施共同保證它工作的穩定高效。
儲存器部分
在儲存器的學習中,我們不僅要分析儲存器的原理,更要從儲存器的硬件發展中去體會這一點。儲存器從誕生到現在已經幾百年了,人們一直想讓它更大、更快、更廉價。但人們漸漸發覺,實現這三者的代價是完全不一樣的,增加密度(從而降低成本)比降低訪問時間容易得多。對比1985年和2015年,在SRAM、DRAM、旋轉磁盤、CPU的數據密度和讀取速度調查中,我們發現數據密度的提升相當明顯,尤其是DRAM(44000倍)和旋轉磁盤(3000000倍),但它們的讀取速度並沒有顯著提高。
與此相對應的措施是進行儲存器層次結構的設計。高速儲存器容量小,靠近處理器;低速儲存器容量大,遠離處理器,並由上級更小更快的儲存器調用。
正是由於這個儲存器硬件發展背景,我們才有了種種應對復雜的“儲存器層次結構設計”的概念名詞,諸如“緩存命中”、“緩存不命中”、“沖突命中”、“沖突不命中”,等等。實踐經驗告訴我們,加強科學研究,提升儲存器的速度固然是很重要的一部分,但與此同時,良好的儲存器結構設計的作用不容小覷,它們兩者共同提升了我們計算機的性能。
程序與系統優化部分
程序與系統優化的原理完全來自於之前所學的內容。如果完全不知道計算機的內部構造,就不可能徹底理解程序優化,對優化程度的分析更是無從談起。舉幾個例子。在儲存器部分所學的“儲存器山”,告訴我們編寫“對高速緩存友好”的代碼,充分利用“時間局部性”和“空間局部性”,就能提升高達十倍以上性能。在處理器部分,我們了解到,采用流水線化架構的處理流程,我們能獲得遠多於每個時鍾周期一條指令的處理效率,這在超標量處理器問世之前是不可想象的。
第二部分 心得
寫在前面
在“心得”這一部分,我關注的重點將不再局限於本書涉及的知識點,而拓展至日常生活中與計算機有關的點點滴滴。接下來的部分也許比較零碎,沒有課程知識體系的完整性,但包含了對計算機世界的絕對好奇。下面的兩個例子並不是憑空舉出的,其中很大一部分是從本書的學習過程中產生好奇,自發探索。在每一個實例中,我會盡量聯系書中知識點,做到活學活用。
部分英特爾第七代處理器的部分參數
| CPU型號 |
I5-7200U |
I7-7500U |
I7-7700K |
E7-8870 V4 |
| 核心/線程 |
2/4 |
2/4 |
4/8 |
20/40 |
| 頻率 |
2.5~3.1 GHz |
2.7~3.5 GHz |
4.2~4.5 GHz |
2.1~3.0 GHz |
| 一級數據緩存 |
2×32 KB |
2×32 KB |
4×32 KB |
未知 |
| 一級指令緩存 |
2×32 KB |
2×32 KB |
4×32 KB |
未知 |
| 二級緩存 |
2×256 KB |
2×256 KB |
4×256 KB |
未知 |
| 三級緩存 |
3 MB |
4 MB |
8 MB |
50 MB |
| 制程 |
14 nm |
14 nm |
14 nm |
14 nm |
| 功耗 |
15 W |
15 W |
91 W |
140 W |
【注:以上數據來自於英特爾官網】
數據分析
1. 在儲存器部分我們接觸了“儲存器山”,了解到處理器中的三級緩存的大小差距,這個事實在以上四款英特爾第七代處理器中得到驗證。
2. 在處理器的發展過程當中,人們意識到增加核心數比提升處理器頻率更為廉價,且更容易控制功耗。我們從數據中看到,盡管至強處理器E7-8870 V4將核心數增加到了20個,它的功耗相比酷睿旗艦處理器i7-7700K 只是提高了49W。多核處理器更有利於發揮協作機制,提供低功耗下的高效率。
3. 對比以上三款酷睿處理器,我們應該意識到高速緩存在處理器性能中的重要作用。處理器的重要參數遠不僅僅是核心數的多少和頻率的高低。
傳統機械硬盤和固態硬盤的性能對比
| 硬盤型號 |
SUMSUNG 750 EVO SATAⅢ |
SUMSUNG NVMe M.2 |
SUMSUNG M8 |
| 讀取速度 |
540 MB/s |
3500 MB/s |
140 MB/s |
| 寫入速度 |
520 MB/s |
2100 MB/s |
145 MB/s |
| 平均無故障時間 |
1,500,000 h |
1,500,000 h |
未知 |
| 容量 |
250 GB |
2 TB |
1 TB |
| 價格 |
1099 RMB |
9399 RMB |
450 RMB |
【注:以上數據來自於中關村】
數據分析
1. 固態硬盤的生產廠家千千萬,我只選取了著名的三星企業,是為了加強對比性。
2. 在這個表格中的前兩款硬盤是固態硬盤,分別采用的是相對落后的SATA接口和新一代NVMe M.2接口。我們看到,在讀寫速度上,固態硬盤有着非常顯著的優勢。采用新一代接口的SUMSUNG NVMe M.2 的讀寫速度達到SUMSUNG M8的大約20倍。目前,限制固態硬盤更大范圍推廣的因素主要是價格,其次是壽命。高性能固態硬盤的價格高得離譜,這使得普通用戶沒有接近它們的機會。大部分固態硬盤的讀寫壽命對於普通用戶綽綽有余,但達不到企業的要求。然而,固態硬盤將成為外接儲存的未來,這一點是毋庸置疑的。
