原文鏈接 :被 CSAPP 虐了
最近兩個周末去圖書館刷 CSAPP 完全停不下來啊,這種看不懂卻還是強忍著痛苦硬逼著自己去看的感覺,真讓我著迷,
這本書從真正意義上讓我體會到了什么叫做看書五分鐘,休息倆小時,
不過大家可千萬別學我,我相信在坐的各位絕對比我牛批,為什么?因為后面我給你推薦了一款神器,那么首先我們先來介紹一下這本書,
這本書總共分成十二個章節,我給你繪制了一個思維導圖,比較簡單明了,

第一章是提綱挈領性質的一章,從一個 hello world 程式來引出 C、引出 UNIX、Linux ,引出 C 語言程式的編譯程序,引出高速快取、系統的硬體組成、存盤結構、虛擬記憶體、網路編程、并發編程,非常 cool,第一章的內容雖然不難理解,卻是能讓人漲自信心的一章,這一章能讓你產生一種激動的心情,因為內容不難,但是卻能夠開拓你的思路,把你的知識體系串聯起來,
第一部分
第二章的內容比較枯燥,我個人認為需要一定的 C 語言基礎,雖然這本書的簡介中說如果你有 Java 基礎的話,,,,,,

還是有點難頂的,所以建議學一波 C ,
別擋我,C 語言我來了,這里推薦兩本 C 語言的書吧,第一本書 《C Primer Plus》 這本書是把 C 語言揉碎了手把手教你,另外《C 程式設計語言》也不錯,
第二章主要講的是計算機中資料的存盤方式,基本的資料型別和各種補碼、反碼的表示方式,總之看這一章如果不了解 C 的話,有點昏昏欲睡(原因是可能不太懂),但實際上第二章寫的很不錯,當你閱讀了本書的第二章之后,也許會發現,你所謂的(懂)只是你的一廂情愿而已,數值系統遠沒有你想象的那么簡單,
第三章是程式的機器級表示,如果你把 C 學的差不多了之后(其實如果單看第二章的話,把 C 語言資料型別惡、運算惡補一下即可),那么恭喜你,接下來你要學習一下匯編了,否則你根本看不懂第三章在說什么(別問我為什么知道的,因為我也看不懂),你可能想知道諸如 pushq、movq、call、popq、ret、%rbx、%rdx 等等都是干嘛的,還有匯編是如何撰寫的,而且你還要懂 C 語言,
這么看來這本書根本就不是一本為初學者準備的書,也可以說是初學者的勸退書,
第四章又是一個打開新世界大門的一章,這章會直接從各種電路開始搞起,這 TM 馬上就直接奔硬體了!主要講了 Y86-64 體系、各種門電路、引出計算機流水線的設計,畢竟現代微處理器可以稱得上是人類創造出的最復雜的系統之一,也會給你講解各種指令集的區別,
與這一章節相關的書籍,可以看看《計算機組成與設計:軟體/硬體介面》還有《編碼》這兩本書,都非常好,非常透徹,
這一章也會和你聊聊指令集架構,這些架構和宏觀意義上的應用層架構不一樣,非常復雜,比如下面這個 ARM 架構

這本書是一個值得熟讀 N 遍的一本書,
第五章:優化程式性能,現在普遍意義上提到的各種優化,不論是架構層優化、指令集優化等核心都離不開這一章所介紹的內容,優化的難點在于你需要對系統有充分理解,當然了在你做優化之前首先要保證原始程式功能正確(并且有回歸測驗),否則一切都是徒勞,比如你需要了解現在系統存在的性能瓶頸,才能系統性的進行優化,你才能夠撰寫高效的程式,
撰寫高效程式需要做到下面這幾點:
- 選擇適當的資料結構和演算法,
- 撰寫出編譯器能夠有效優化以轉換成可執行代碼的源代碼,
- 任務拆分,采用并行計算的方式,
第六章:存盤器層次結構,這一章會向你介紹存盤技術的發展,磁盤、主存、高速快取的性能差距到底有多大,然后介紹區域性原理,一項非常強大的快取技術,高速快取讀寫是如何映射的,高速快取不同引數的性能影響,如何撰寫高速快取又好的代碼,存盤器山是個什么概念,以及你會見到封面的插圖,
看這一章的時候強烈建議把 Ulrich Drepper 撰寫的長達 114 頁的經典論文 What Every Programmer Should Know About Memory 看了,
以上就是 CSAPP 的第一部分,第一部分主要介紹了程式和硬體之間的互動關系,
而第二部分則專注于程式和作業系統之間的互動關系,你會學到如何使用作業系統提供的服務來構建系統級程式,
第二部分
第七章:鏈接,我們使用 Linux 的時候,很多情況下會出現很多難以理解的錯誤,其中很多都是鏈接錯誤,鏈接分為靜態鏈接和動態鏈接,我們寫的 C 程式在執行的程序中都會經過鏈接階段,

除了這一章內容之外,大家也可以看一下一本把鏈接講的非常透徹的一本書:《程式員的自我修養 – 鏈接, 裝載與庫》,主要講授代碼指令是如何保存的,庫檔案如何與應用程式代碼靜態鏈接,應用程式如何被裝載到記憶體中并開始運行,動態鏈接如何實作,C/C++運行庫的作業原理,以及作業系統提供的系統服務是如何被呼叫的,非常好的一本國產書,
第八章:例外控制流,世界上不會存在完美運行的程式,任何程式都會出錯,這些錯誤可能是執行緒執行程序中出錯、可能是系統呼叫例外、頁面映射錯誤等等,這一章會向你介紹各種例外出現之后,作業系統是如何處理的,
第九章:虛擬記憶體,虛擬記憶體其實是存盤器層次結構的衍生,至于為什么單獨拿一章來說,因為虛擬記憶體太重要了,這一章會向你介紹為什么我們的計算機記憶體只有 8G(或其他)卻能夠運行自身數倍以上的程式,虛擬記憶體有的時候也是面試官比較愛問的一個點:虛擬記憶體是如何映射的,什么是頁框、頁表諸如此類,
第三部分
第三部分主要介紹程式間的相互通信,主要包括 IO、網路編程和并發編程,
IO 這部分介紹類 Unix 系統下的 I/O 讀寫,主要介紹系統層面的 I/O 介面,
今天互聯網中的大千世界都立足于 TCP/IP 協議之上,Socket 甚至已經成為了網路編程的同義詞,這部分主要向你介紹了網路的變遷,什么客戶端-服務器編程模型、Web 服務器,最后再帶你寫一個 Web 服務器,
網路這部分內容遠比這一章節介紹的復雜,網路這部分內容給大家推薦幾本書:《計算機網路:自頂向下方法》、《TCP/IP 詳解》,《UNIX 網路編程》,
你一定要知道的是 W. Richard Stevens,他的個人網站 http://www.kohala.com/start/
并發這一章節主要介紹了 C 中如何撰寫并發程式,如何榨干 CPU ,讓其發揮峰值性能,
推薦一個網站
讀 csapp 這本書還是需要一定基礎的,而且讀起來不是那么容易(起碼對于我來說是這樣的),
不過,業界還是有一些好資源,能讓你更快的深入這本書,
給大家推薦一個網站,https://fengmuzi2003.gitbook.io/csapp3e/
這個網站可以理解為是 CSAPP 的導讀網站,對每一章都進行了介紹,而且推薦了一些不錯的資源,
比如他分享的深入理解計算機系統的 B 站課程,

看到這里有沒有心潮澎湃的要馬上學起來呢?
還有一些電子書的下載渠道:

CSAPP 不管是中英版本都有一些勘誤,有一些已經改正了,有一些還沒改,大家可以在 http://www.yiligong.org/csapp3e/ 反饋你見到的勘誤,有一些是影響閱讀的,但是有一些是影響理解的,
這里給大家一個小提示,我粗略過了一遍,就拿中文版的《深入理解計算機系統》來說,大家可以看一下最開頭處的印刷時間,然后針對這些勘誤的提出時間進行比較,在印刷之前的很多勘誤已經得到修正了,
也就是說,對于這個網站的使用方法,大家可以從后往前看,

總結
上面只是我對這本書一個粗俗的理解,書我還沒看完,不過我已經有相關 C 語言、匯編語言的學習計劃了,另外,知乎上有一個對 《如何閱讀深入淺出計算機系統》 的一個總結性回答,https://www.zhihu.com/question/20402534/answer/1670374116 我認為還是非常好的,
這個回答里面有練習題的答案,還有學習這本書需要的前置知識,這個回答給我的感覺是答主已經刷過幾遍了,作為過來人的經驗還是值得學習的,
最最最重要的就是做實驗,你可以在 http://csapp.cs.cmu.edu/3e/labs.html 上找到 csapp 的所有實驗,
最后給大家推薦一下我自己的 Github https://github.com/crisxuan/bestJavaer ,里面有非常多的硬核文章,絕對會對你有幫助,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/339219.html
標籤:其他
上一篇:2021-10-25計科ACM新生培訓第六次培訓題解
下一篇:shell腳本經典題之函式應用
