天天看點

無論是要打牢計算機基礎還是準備校招面試,這本書你不可錯過!

無論是要打牢計算機基礎還是準備校招面試,這本書你不可錯過!
無論是要打牢計算機基礎還是準備校招面試,這本書你不可錯過!

導讀:是一本非常适合程式員初步了解 System 知識的好書!不管你是前端、後端還是算法,csapp上的内容都算是基本功。

無論是要打牢計算機基礎還是準備校招面試,這本書你不可錯過!

文章首發于程式設計指北

看标題,大家應該知道我今天的主題了。

是的,《深入了解計算機系統》

這本書我還算比較熟悉,算是完整的看過一遍,部分章節看過兩三遍,有些是校招準備面試的時候看看,真的挺合适的。

而這本書也被譽為計算機屆的神書,豆瓣評分也是接近10分,個人感覺是一本非常适合程式員初步了解 System 知識的好書。

現在基本搬家都帶着:

無論是要打牢計算機基礎還是準備校招面試,這本書你不可錯過!

CSAPP 全稱 Computer Systems A Programmer's perspective,中文書名是《深入了解計算機系統》。

這本書可能叫做“程式員需要了解的計算機知識”更為恰當一點。

先看下這本書我們能學到啥?

然後聊聊我看這本書的曆程

最後說說我推薦的閱讀方式~

首先是關于這本書

其實它的簡介和第一章《計算機系統漫遊》已經寫得非常清楚了:

從一個簡單的hello world程式在計算機上的執行過程:

預處理->編譯->彙編->連結->可執行檔案->裝載->資料流->螢幕輸出顯示

彙總成一句:資訊 = 位+上下文。

豆瓣上figure9的書評很到位:

  • 第二章是關于二進制的,這部分内容會在數字邏輯這類課裡學到,都比較熟悉,但是csapp裡确實我見過關于進制講得最透徹的書,不像其它書都是一句話讓你背取反+1。
  • 這章的裡有不少關于二進制的技巧,做一遍作業對于二進制的各種操作絕對會比較熟悉,最經典的就是不用臨時變量交換兩個數。話說回來,真要想在二進制上玩出花來,參考Hacker's delight會有更大的驚喜。
  • 程式的機器級表示這一章偶花了不少時間閱讀,畢竟偶沒學過彙編,基礎基本為0。不過這本書裡出現的彙編指令絕大多數都由運算、取數存數、跳轉這三種指令所組成,是以在閱讀上不會存在任何難度。
  • 這部分融合了程式員所需了解的編譯和彙編這兩樣課程中的基礎知識:想知道for、do..while、while三種循環的實質性差別?想知道多重if和 switch的本質差別?想知道數組的存儲方式?想知道數組下标讀取和指針讀取的差別?想知道遞歸過程調用的背後實作機理?看看這一章,相信你會對C語言乃至程式設計語言有更深的了解。
  • 指令集&體系結構這一章,兩位作者為了讓讀者更好的了解指令集(X86),别具一格的搞出了一個簡化版的Y86指令集,并用其表示基本的運算和控制,甚至連數字電路的HCL都來了一筆(暴汗)。資料流、組合邏輯和流水線,圖示+詳細的講解,一目了然。國内的計組教科書應該多借鑒一下。
  • 程式性能優化這一章對程式員尤其實用,畢竟,正如TDD和XP的開創者Kent Beck所說,make it run, make it right, make it fast。而第三步又是最麻煩的一步,确認和消除性能的瓶頸,有時比Debug還要恐怖,是以Knuth大神說:Premature optimization is the source of evil。
  • 存儲器體系結構的内容用五個字概括就是:利用局部性。隻有了解了計算機的梯形存儲器體系結構,才能體會到為什麼同樣邏輯的程式會産生如此之大的性能差距,雖然計算機設計者的初衷是把存儲器當成一個巨型數組。然而這個大号數組的不同體位的差距還是非常大地,搞不好就郁悶鳥。
  • 連結這部分内容篇幅不多,原理上講的很簡潔,檔案節和符号解析表隻是給出了幾個圖示,并沒有過多的關注其實作。CSAPP把重點放在了連結對源代碼産生的影響,同時也讓偶再次了解到了全局變量很邪惡。動态連結部分讓偶恍然大悟,.net裡面的反射和程式集,放到C裡面就是動态調用和共享庫,都是相通的,無非C的代碼更詭異一些。
  • 異常控制流這一章的名字比較囧,以至于我剛開始認為它會介紹點諸如try...catch的異常處理機制。然而看了才明白,它介紹的是更為廣義的exception,既包括硬體中斷,也包括故障中斷,比如說陷入(trap)和故障(fault)。這一章做的比較絕的是,通過講述異常流,引入了OS中最核心的概念:程序。然而它并不在程序的具體特性上下文章,而是通過講述unix下程序相關的api 及使用,從一種程式員的角度告訴你,程序是這麼用的,程序之間是這麼交換資訊的。到最後捎帶介紹了一下C裡面的非局部跳轉(更加強大的Goto,也就是 setjmp和longjmp),别以為隻有C++和Java才有異常處理機制,C一樣可以做到。
  • 程式的時間度量這一章感覺用處不大,掃過。
  • 虛拟記憶體這一章從原理和實作兩個不同的層面介紹了存儲器體系結構的核心部分:VM。說實話,之前學習VM頂多就是沖着局部性去的,但沒想到VM可以做的事有這麼多,無論是存儲器磁盤映射,還是malloc在磁盤上配置設定空間傳回位址至PTE,都讓偶對VM有了一個嶄新的認識,原來VM還可以這麼用。為了幫助讀者深入了解記憶體的配置設定機制,作者甚至搞出了一個malloc的實作,從源代碼來講解記憶體配置設定、碎片合并、垃圾回收這些概念,帥氣。
  • 系統級IO,網絡程式設計以及并發程式設計這些東西是我比較喜歡的内容,這部分包括了 malloc lab、proxy等

當然,要想深入學習的話,好書有的是,OS 有Tanenbaum 老爺子的 Modern operating systems,計組有Stanford校長的量化研究和軟/硬接口,編譯自然就是Aho的龍書,連結可以參考Levine的 Linkers&Loaders,程式設計語言原理可以閱讀Scott的Programming language pragmatics。

其次是自己看這本書的曆程

這本書是在大一逛知乎聽大佬們說起的,大一暑假有大四學長學姐在學校廣場擺攤賣書,我也買了些,其中有一本就是被稱為計算機專業神書的 CSAPP。

大二時,在上一些無聊的課時,我總把這本書帶着,每節課可能會翻個幾頁,那時候看到裡面的彙編、記憶體管理、存儲器層次我是真的雲裡霧裡,因為還沒學作業系統,C 語言也學得很差。

是以斷斷續續的看了幾章,說不上學到了什麼,但讓我對這種枯燥的基礎知識第一次産生了興趣,有一種想徹底搞懂它們的想法。

後來在知乎大佬的指引下,為了看懂這本書,去看了王爽那本《彙編語言》。

重學了 C 語言(主要是指針和記憶體),由于已經學了彙編,指針對我再也不是問題了。

同時,在大二、大三上陸續學習了作業系統、計算機組成原理、數字邏輯等,其實熟悉的同學就知道,這已經涵蓋了csapp書裡的絕大部分内容。

值得一提的是,大三我們學院有門 System Programing 的課,教材就是使用的 CSAPP,是以我之前大二草草看完的書,得以再次翻開,這一次我把附帶的是個實驗也挨着挨着做了,收獲良多,有位運算各種奇技淫巧,有 Bomb lab 刺激的打怪通關、也知道了buffer overflow attack.... 還有實作基本的記憶體管理等等。

印象最深的便是做 bomb lab,一個個 phase 的通過真的很讓人興奮,我幾乎是熬夜連着把這幾個 phase 過掉的,當然頭發也沒少掉。

當時還在簡書寫了個萬字長文記錄:

無論是要打牢計算機基礎還是準備校招面試,這本書你不可錯過!

CSAPP--配套實驗(Bomblab)記錄

其它個人覺得比較有意思的lab有:

Malloc Lab:實作一個類似C語言的malloc函數,主要學習記憶體管理

Proxy Lab:http server,學習linux下網絡程式設計和多線程程式設計,鎖、條件變量等

Attack Lab:緩存區溢出攻擊,主要學習Linux下函數調用過程和堆棧等

最後就是如何去閱讀呢?

讀一本書,尤其是專業技術類,決定你能否看下去的一個重要因素就是你是否具備前置知識。

總不能高中數學都沒學就想去看高數吧。

那這本書的前置知識,我認為你需要具備一些 C 語言知識、以及系統知識,比如 Unix、Linux基本操作,有 C 語言背景最好,如果完全沒學過 C 的話,那麼前幾章看起來會比較吃力。

這本書有我個人認為有兩種打開方式:

  •  第一種是學習過作業系統、計算機組成等,是以看起來應該不存在很大的難度,從頭到尾一章章啃,看完一章一定要做一些課後的作業和配套的lab,lab可以算這本書的精華之一了。
  • 第二種是按需學習,之前說過,這本書涵蓋了計算機學科主要的知識,将整個線串起來了,是以在這裡面你能找到連結&加載,也能找到記憶體管理、還有語言的機器級表示彙編等,是以當你學習記憶體管理時你就去看看第九章虛拟内純,學到C&C++編譯連結時,可以去看看第七章連結,學習到存儲的時候,可以去看看第六章存儲器層次結構。

是的,每一章都是比較獨立的,是以你完全可以跳着挑自己感興趣的去學習

資源

配套的lab:http://csapp.cs.cmu.edu/3e/labs.html

無論是要打牢計算機基礎還是準備校招面試,這本書你不可錯過!

為什麼我推薦程式員都去看看?

這本書本身包含的内容其實都是在數字邏輯、作業系統、網絡、體系結構等課程中學過的。

但是這本書創造性的把OS,計算機組成結構,數字電路,以及編譯原理這些計算機基礎學科中的核心概念彙集在一起。

進而覆寫了指令集、彙編、代碼優化、存儲體系、連結、加載、程序以及虛拟記憶體這些程式員所必須了解的關鍵 CS 系統知識

如果想打下紮實的計算機基礎又不想把作業系統計算機結構編譯原理這些書統統讀一遍,閱讀 深入了解計算機系統是最有效率的方式。這就是推薦的原因。

這本書裡的内容其實就是大家經常說的底層知識/内功。

而我們國内大部分學校都是不注重系統知識的培養的,隻有少數 985 高校有開設系統程式設計課程。

這本書最精華的還有它的配套實驗,牆裂建議大家看書的時候一起幹掉,實作shell、緩存優化、緩沖區溢出攻擊...... 每一個實驗都有助于你了解系統原理。

前兩天,總理有個視訊傳播得挺火的,視訊的内容是:

“講到這裡,我想對青年學生們說幾句話,不管你們将來從事什麼職業、有什麼樣的志向,一定要注意加強基礎知識學習,打牢基本功和培育創新能力是并行不悖的,樹高千尺,營養還在根部。把基礎打牢了,将來就可以觸類旁通,行行都可以寫出精彩。”

我想這在 CS 領域也是适用的,不管你是前端、後端還是算法,csapp上的内容都算是基本功。

書籍購買

最後,如果你想購買這本書的話,歡迎點選下方連結,中英文版本都有,任你挑選:

無論是要打牢計算機基礎還是準備校招面試,這本書你不可錯過!
無論是要打牢計算機基礎還是準備校招面試,這本書你不可錯過!

掃碼關注【華章計算機】視訊号

每天來聽華章哥講書

無論是要打牢計算機基礎還是準備校招面試,這本書你不可錯過!

更多精彩回顧

書訊 | 4月書訊 | 好書和最美四月天一起來了...

資訊 | DB-Engines 4月資料庫排名:Redis有望甩掉“千年老七”?

書單 | 8本書助你零基礎轉行資料分析崗

幹貨 | 什麼是架構?網絡架構中都有什麼?終于有人講明白了

收藏 | 終于有人把Scrapy爬蟲架構講明白了

上新 | 河馬書來了!線上實驗領域的“聖經”火熱預售中

無論是要打牢計算機基礎還是準備校招面試,這本書你不可錯過!
無論是要打牢計算機基礎還是準備校招面試,這本書你不可錯過!

點選閱讀全文檢視更多好書

繼續閱讀