一
個程序員,究竟需要對計算機的硬件瞭解到什麼程度呢?🤔
如果你是系統級軟件開發工程師,想必這本書是你的案(墊)頭(顯)必(示)備(器);
如果你是應用軟件工程師,或許不需要太多底層知識也可以運用高級語言設計程序。不過,只要你和計算機打交道,這本書中的內容你早晚都會遇到……
《深入理解計算機系統》(簡稱 CSAPP)
,CMU 計算機導論教材,豆瓣評分 9.8,被譽爲計算機領域的
「神書」
。
這本書的誕生可以回溯到 1998 年秋季 CMU 開設的計算機系統導論(ICS)課程。課程教授 Randal 和 David 意識到,「學生中幾乎沒有人會親自構造一個計算機系統,但大多數學生都日常使用計算機編寫程序」。因此,他們篩選了主題,排除了手寫彙編語言、總線設計這樣的內容,重點關注:C 語言編譯器是如何將 C 語言翻譯成機器代碼的?編譯器是如何翻譯指針、循環、過程調用語句的?因此,這門課、這本書的宗旨是從程序員的角度來講解系統,把硬件、系統、軟件系統地結合起來,構成一整個框架,這對學生而言更實用也更具體。
不少國內學校都以這本書作爲參考教材,所有想通過學習計算機系統的內在運作、從而寫出更好程序的人,都應該認真閱讀此書並完成課後作業 📒。
這本書中的不少內容針對 C 語言特性(包括指針、顯式的動態內存分配、格式化的 I/O),對於 C 語言背景薄弱的讀者,這本書中有一些專門的註釋幫助突出 C 語言中重要的特性。
你將從這本書中獲得:
二進制炸彈 💣
CSAPP 這本書非常鼓勵你動手嘗試,每章都帶有練習題與參考答案,還有相應的實驗課(Lab)與實驗的自動評分系統。
你可以從官網上找到九個實驗(http://csapp.cs.cmu.edu/3e/labs.html)包括:數據實驗、二進制炸彈實驗、緩衝區溢出實驗、體系結構實驗、性能試驗、cache 實驗、shell 實驗、malloc 實驗、代理實驗。這些配套實驗不僅風趣幽默,而且能訓練你學到的內容,增強調試程序的能力,讓你終身受益。
邪惡博士在我們的班級機器上放置了大量的「二進制炸彈」。二進制炸彈是由六個環節組成的程序。每個環節,你都要輸入一個特定的字符串。只有輸入正確的字符串才能拆除炸彈,進入下個關卡。否則,炸彈會爆炸💥!在處理本程序時,不得穿戴防彈衣。
有太多炸彈要我們處理,所以我們給每個學生一個炸彈來拆除。這是你的任務,你別無選擇,只能接受,就是在截止時間前拆除你的炸彈。祝你好運,歡迎加入拆彈小組!
設置調用函數斷點
運行至斷點處並調試
進入函數內部進一步觀察
分析代碼得出答案
完整拆除六個炸彈,你就可以熟悉 GDB 調試工具、徹底理解函數調用的棧幀、熟悉常用寄存器的用途、熟悉 AT&T 彙編語法。
在小編看來,寫程序這件事情有一個極大的妙處:當你學到了什麼新東西,你可以馬上試驗並看到運行結果。你不需要看完整本書就能明白某件事情,我只需要學到可以自己能動手嘗試並糾錯就夠了。
在計算機底層,數組是如何存儲的?
讓我們來看下方兩個函數,這兩個函數都是對一個二維數組的各個元素求和,區別在於循環的優先順序不同:
int sumarrayrows(int a[M][N]) {
int i, j, sum = 0;
for (i = 0; i < M; i++) {
for(j = 0; j < N; j++) {
sum += a[i][j];
}
}
return sum;
}
// 先行後列
int sumarraycols(int a[M][N]) {
int i, j, sum = 0;
for (j = 0; j < N; j++) {
for(i = 0; i < M; i++) {
sum += a[i][j];
}
}
return sum;
}
// 先列後行
編譯運行,看看運行耗時差了多少?先行後列比先列後行快了 25 倍!
存儲器系統爲 CPU 存放指令和數據。實際上,存儲器系統並不是一個線性結構,而是具有不同容量、成本和訪問時間的層次結構。封面中的儲存器山,展示了讀吞吐量,是時間和空間局部性的函數。需要注意的是,L1 山脊的最高點(此處 CPU 讀取率爲 14GB/s)與主存山脊的最低點(此處 CPU 讀取率爲 900MB/s)之間的差別有整整一個數量級。
C 語言以行優先順序存儲數組,所以交換掃描順序看似無傷大雅,卻導致對高速緩存變得不友好。在列掃描中,如果整個數組都在高速緩存中,內存引用不命中率(miss rate)爲 1/4;而在大多數情況下,數組超出高速緩存,那麼每次對
a[i][j]
的訪問都會不命中,顯著影響了運行時間。
這本書的第六章詳細介紹了存儲器的層次結構。作爲一個程序員,如果你理解存儲器層次結構,注意程序中的局部性,將會大大提高程序性能。
如何閱讀這本書?
在知乎上,小編看到了不少提問:
「《深入理解計算機系統》這本書需要什麼水平能看懂?」
自底向上的內容着實有些枯燥,小編整理了一些官方資料與個人讀者的筆記,希望能助你一臂之力。
網課(中文字幕版):
https://www.bilibili.com/video/av31289365
課件地址:
http://www.cs.cmu.edu/afs/cs/academic/class/15213-f15/www/schedule.html
Lab 地址:
http://csapp.cs.cmu.edu/3e/labs.html
導讀網站:
https://fengmuzi2003.gitbook.io/csapp3e/
@fengmuzi2003 製作了一個 CSAPP 導讀網站,不僅對每一章都進行了介紹,而且推薦了一些不錯的資源、學習方式、視頻解讀。比如,ta 給出了學習路徑上的建議:
學完第 06 章之後直接學習第 09 章(本質上它們屬於同一主題),然後再學習第 05 章(因爲裏面的一部分優化內容與第 06 章介紹的 CPU 緩存有關聯),書中講解系統軟件的部分不太完整,比如 IPC等內容沒有涉及,建議大家自己參考《UNIX環境高級編程》,或者《LINUX編程接口》……
電子書資源:
https://hansimov.gitbook.io/csapp/
@hansimov 主導整理了 CSAPP 的電子書資源和實驗材料(包括 Hints),方便閱讀。
如果實在讀不下去,不妨休息一下,讀讀這些好玩的換換腦子:
——————————————————————————
Zilliz 以重新定義數據科學爲願景,致力於打造一家全球領先的開源技術創新公司,並通過開源和雲原生解決方案爲企業解鎖非結構化數據的隱藏價值。
Zilliz 構建了 Milvus 向量數據庫,以加快下一代數據平臺的發展。Milvus 數據庫是 LF AI & Data 基金會的畢業項目,能夠管理大量非結構化數據集,在新藥發現、推薦系統、聊天機器人等方面具有廣泛的應
用。