(文末福利)你該不會拿 CSAPP 墊顯示器吧

個程序員,究竟需要對計算機的硬件瞭解到什麼程度呢?🤔
如果你是系統級軟件開發工程師,想必這本書是你的案(墊)頭(顯)必(示)備(器);
如果你是應用軟件工程師,或許不需要太多底層知識也可以運用高級語言設計程序。不過,只要你和計算機打交道,這本書中的內容你早晚都會遇到……
《深入理解計算機系統》(簡稱 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),方便閱讀。
如果實在讀不下去,不妨休息一下,讀讀這些好玩的換換腦子:

AI 收藏夾 Vol.001:當你的語音助手不再溫順

AI 收藏夾 Vol.002:被 AI 阻止的又一次自殺

AI 收藏夾 Vol.003:AI 能聽懂陰陽怪氣嗎?





福利時間

理解計算機底層邏輯,
對程序員有多重要?
對技術感興趣的你,有哪些心頭好書?

歡迎在評論區留言你的想法,
我們將選取一位小夥伴,
贈送紙質版《深入理解計算機系統》一本!

積累代碼量很重要,
讀書、讀好書也很重要。
「Zilliz 好書推薦」欄目,
旨在與你分享技術成長相關的書籍,
與你一起先把書讀厚,再把書讀薄。
——————————————————————————

Zilliz 以重新定義數據科學爲願景,致力於打造一家全球領先的開源技術創新公司,並通過開源和雲原生解決方案爲企業解鎖非結構化數據的隱藏價值。
Zilliz 構建了 Milvus 向量數據庫,以加快下一代數據平臺的發展。Milvus 數據庫是 LF AI & Data 基金會的畢業項目,能夠管理大量非結構化數據集,在新藥發現、推薦系統、聊天機器人等方面具有廣泛的應 用。
解鎖更多應用場景

本文分享自微信公衆號 - ZILLIZ(Zilliztech)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章