
導讀:如果你也讀CS專業,如果你也不知道怎么回答“學計算機不就是學修電腦”這個CS系的宿命之問,推薦一定讀一讀《深入理解計算機系統》。

《深入理解計算機系統》是一本什么樣的書呢?兩個字,經典。原因有二,第一,這書無數業界大牛推薦,第二,這書和你印象中的經典一樣,給人的第一感覺就是厚實。不過,厚實也很容易再給人一種感覺,那就是望而卻步——你沒準會想,這么厚的書,又是經典,是不是很難讀?
大可放心,一點也不會。
經典也是有細分領域的,有很多書之所以經典,是因為對一些問題進行了很深入的探討,而《深入理解計算機系統》的經典,我認為是把計算機中被分割成很多塊的知識,用一本書一口氣完整地全部整理出來。
我們先回想一下,計算機專業都開設有哪些專業課。首先肯定有編程,這個專業很大一部分工作是要給碼農培養接班人。編程的一個重要環節是編譯,那設計編譯器要開一門課,叫編譯原理。編譯完了要運行,運行需要依賴硬件環境和軟件環境,于是就有了計算機組成原理和操作系統。如果早個二三十年,計算機的知識體系到這就差不多了,不過現在可是網絡時代,所以還得再加一門課,叫計算機網絡。這還是往大了分,細分就更多了,光編程語言就有好幾種,而且別忘了背后還有一堆的各種數學,就不細說了。
計算機技術蓬勃發展,學科體系自然枝繁葉茂,但學計算機很容易就像在追冰與火之歌一樣,世界觀太宏大支線劇情太多,眼前很難呈現出一幅完整的圖景。所以當時我們學各門學科的時候,大家問的最多的不是學科本身的某個知識點,而是“為什么要學這門課”。剛才我把各個主要科目串了一串,讀完應該會對各科之間的關系有一個更宏觀的了解。
可是,光有這么一句話肯定還有很多問題沒法解決。有沒有一本書專從這個角度講計算機科學呢?計算機科學有很多經典的書,但大多數都是專注各個領域的內部知識,不過好在還真有一本經典的書,是從計算機的角度來看待計算機,這就是《深入理解計算機系統》。
我當初讀《深入理解計算機系統》,讀完就是一個感覺,淋漓暢快。感覺腦子里很多零星的碎片,讀完以后都拼在了一起。《深入理解計算機系統》書很厚,講的也深入,但深入的是知識點與知識點之間的關聯,也許很多正好都是你深感困擾的問題,讀完很容易讓你有種“哦,原來是這樣”的感嘆,節省了很多去苦苦思索的時間。寫本文的時候我特意看了一下大家對《深入理解計算機系統》的書評,果然很多人感受和我一樣,相見恨晚。
《深入理解計算機系統》這本書起源于卡內基梅隆大學(CMU)的一門課,叫計算機系統導論(ICS)。這門課相信計算機系的學生都不會陌生,一般都是作為第一門專業課開設的,內容基本就是回答大家剛入坑時最想知道的那個問題:學計算機都學些什么。對于我來說,這是當時唯一一門從計算機整體視角來開展介紹的課程,在那以后,我們就被扔進各個子學科里面撲騰,再也難一窺全貌。
《深入理解計算機系統》的作者們很謙虛,說這本書起源于ICS,但經過3版的不斷擴充內容,涵蓋范圍已經很廣,現在也可以作為計算機組成原理(ORG)和系統編程(SP)的教材,但我覺得,這本書的用途遠不止于“教材”。
相信每個學完計算機的學生都會認同,學計算機,編程也好其它什么也好,最佳的方法就是動手,親自動手做一次,比看什么書都掌握得牢靠。但是,這就帶來一個悖論:學計算機,最好的方法就是去做一臺計算機,計算機專業教的內容一言蔽之,確實就是怎樣去制造計算機運行的各個所需部件,但限制條件非常多,真正動手擼一臺計算機不太現實。
那怎么辦呢?我經常在B站圍觀大牛完成各種精巧的小玩意,看了一遍,感覺自己也像是做了一遍,雖然肯定沒有自己動手來得實在,不過肯定比只看純描寫要好得多。那我們是不是能退而求其次,“看”別人一個部件一個部件地擼一臺計算機呢?《深入理解計算機系統》就是從這個理念出發寫成了本書。
《深入理解計算機系統》是一本經典書,現在已經出到了第3版,正好我手里第2版和第3版都有,順手先一個比較。
總的來說,第3版基本沿用了第2版的框架,但也有不少變化。首先第3版有兩個直觀變化,一個是更厚了一點,一個是印刷更好看了,第2版是最經典的黑白印刷,第3版加入了藍色,正好這本書里面很多代碼圖表,看起來更醒目了。
在內容上第3版也做了大量修改。第2版和第3版大概相差10年,在第2版上市的時候,IA32架構,也就是我們俗稱的32位指令集還是主流,但到了現在,已經是64位指令集,也就是x86-64的天下了。第3版也體現了技術的變化,指令集的表現形式均采用64位。指令集是非常底層的東西,所以這部分牽涉了很多內容,書里都做了全面調整。
另一個內容上的大改動是API的升級,譬如在第11章,第3版用新的getaddrinfo和getnameinfo函數取代了老版的gethostbyname和gethostbyaddr。
此外還有不少細節上的調整甚至重寫,也對一些容易讓人困擾的知識點進行了擴充說明,總的來說閱讀體驗比上一版更好。
《深入理解計算機系統》一共12章,分成程序結構和執行、在系統上運行程序和程序間的交互和通信三個部分,涉及了計算機技術的方方面面,橫跨多個科目。下面我就毛遂自薦充當各位的導游,和大家一起逐章看看都講了哪些內容。
第一章,章名就叫“計算機系統漫游”,可以認為是這本書的“計算機導論”課,以一個hello程序為主線,串起了從編代碼到程序執行整個過程都經歷了哪些環節。最后有一個知識點,叫“Amdahl定律”,研究各個部件的性能提升和整體性能提升的關系。
第二章,叫“信息的表示和處理”,介紹了一些數字邏輯的內容,也就是計算機的“計算”部分。計算可分為數值類型和運算類型兩個組成部分,在數學體系里,數的類型有很多,譬如自然數、整數、有理數、無理數、代數數、超越數、實數等等,光數系都是數學里的重點研究對象,不過別擔心,計算機里邊就簡單多了,目前只分為整數和浮點數兩類。
第二章也是“程序結構和執行”部分的第一章,往下都是從機器角度看程序構造。
第三章,叫“程序的機器級表示”,名字挺拗口,其實說的就是指令集的事。計算機專業一般不會為CPU指令集專門開一課,很多知識點和匯編語言說的內容重合,前面說的全面調整為x86-64體系,在這個部分體現得很充分。
第四章,叫“處理器體系結構”,講的是CPU的工作原理。不要和上一章搞混了,CPU的指令集,和CPU本身的結構原理有關系,但不完全是一回事,這一章更多的是邏輯電路相關的內容,介紹諸如時鐘周期、流水線等偏硬件內容。
第五章,叫“優化程序性能”,章名就已經很明確,劃分知識點的話大部分屬于編譯原理范疇。我們上編譯原理主要講的是各種文法和實現諸如詞法器這類的部件,不過這都屬于基本功,真正的重點和難點在于優化。當然程序性能優化不止編譯優化,這是一套體系,還有內存、存儲等多個地方都可以進行優化。要想看編譯原理的基本功部分,推薦看龍書。
第六章,叫“存儲器層次結構”,就是我們所說的內存外存了,涉及磁盤構造、緩存設計等等問題。
第七章,叫“鏈接”,這是源碼編譯的一個重要環節。回憶一下編譯原理對編譯過程的介紹,源碼編譯不是直接從源碼編譯成目標代碼,也就是不是直接生成機器碼,而生成一種叫“中間代碼”的產物。以中間代碼為界,前面叫“前端”,對應的還有一個“后端”,就是通過中間代碼最終生成目標代碼,鏈接就是這個過程的一個重要環節。第七章也是“在系統上運行程序”部分的第一章,往下主要是從操作系統的角度看程序運行性的各種情況。
第八章,叫“異常控制流”,“異常”這個概念大家肯定都聽過,不過這里主要指的是操作系統中的異常及中斷的工作流程,不過也簡要討論了高級編程語言中的異常。
第九章,叫“虛擬內存”,虛擬內存在現代操作系統中非常重要,這一章主要討論虛擬內存的各種管理機制,以及現在很熱門的垃圾收集(GC),還延伸了一點安全人員很感興趣的內存泄露方面的討論。
第十章,叫“系統級IO”,主要介紹文件系統的讀寫等操作接口。要是能對文件系統本身多展開一點內容就更好了。這一章也是“程序間的交互和通信”部分的第一章,往下說的就都是各種IO了。
第十一章和第十二章分別介紹了“網絡編程”和“并發編程”,至此主流的各種IO就全部介紹了一遍。
被譽為“價值超過等重量黃金的無價資源寶庫”,理解計算機系統首選書目,十余萬程序員的共同選擇。
卡內基-梅隆大學、北京大學、清華大學、上海交通大學等國內外眾多知名高校選用指定教材。
從程序員視角全面剖析的實現細節,使讀者深刻理解程序的行為,將所有計算機系統的相關知識融會貫通。
本書是一本將計算機軟件和硬件理論結合講述的經典教程,內容覆蓋計算機導論、體系結構和處理器設計等多門課程。本書的最大優點是從程序員的角度描述計算機系統的實現細節,通過描述程序是如何映射到系統上,以及程序是如何執行的,使讀者更好地理解程序的行為,以及程序效率低下的原因。
如何使用本書從程序員的角度來學習計算機系統是如何工作的會非常有趣。最理想的學習方法是在真正的系統上解決具體的問題,或是編寫和運行程序。這個主題觀念貫穿本書始終。因此我們建議你用如下方式學習這本書:
學習一個新概念時,你應該立刻做一做緊隨其后的一個或多個練習題來檢驗你的理解。這些練習題的解答在每章的末尾。要先嘗試自己來解答每個問題,然后再查閱答案。
每一章后都有一組難度不同的作業題,這些題目需要的時間從十幾分鐘到十幾個小時,但建議你嘗試完成這些作業題,完成之后你會發現對系統的理解更加深入。
本書中有豐富的代碼示例,鼓勵你在系統上運行這些示例的源代碼。
向老師或他人請教和交流是很好的學習方式。
在這篇文章下方留言 + 這篇文章的點贊在看,我會選取留言點贊量最高的 4 位同學,送出這本書,截止時間至 8 月 1 日晚 8 點。
當然,各位讀者朋友們你也可以在當當上購買到這本書。