《深入理解計算系統》這本書到底怎樣學?


原文鏈接 :被 CSAPP 虐了

最近兩個周末去圖書館刷 CSAPP 完全停不下來啊,這種看不懂卻還是強忍着痛苦硬逼着自己去看的感覺,真讓我着迷。

image-20211025202910686

這本書從真正意義上讓我體會到了什么叫做看書五分鍾,休息倆小時。

不過大家可千萬別學我,我相信在坐的各位絕對比我牛批,為什么?因為后面我給你推薦了一款神器,那么首先我們先來介紹一下這本書。

image-20211025203724031

這本書總共分成十二個章節,我給你繪制了一個思維導圖,比較簡單明了。

image-20211025225218317

第一章是提綱挈領性質的一章,從一個 hello world 程序來引出 C、引出 UNIX、Linux ,引出 C 語言程序的編譯過程,引出高速緩存、系統的硬件組成、存儲結構、虛擬內存、網絡編程、並發編程,非常 cool。第一章的內容雖然不難理解,卻是能讓人漲自信心的一章,這一章能讓你產生一種激動的心情,因為內容不難,但是卻能夠開拓你的思路,把你的知識體系串聯起來。

第一部分

第二章的內容比較枯燥,我個人認為需要一定的 C 語言基礎,雖然這本書的簡介中說如果你有 Java 基礎的話。。。。。。

image-20211025230317641

還是有點難頂的,所以建議學一波 C 。

別擋我,C 語言我來了,這里推薦兩本 C 語言的書吧,第一本書 《C Primer Plus》 這本書是把 C 語言揉碎了手把手教你,另外《C 程序設計語言》也不錯。

第二章主要講的是計算機中數據的存儲方式,基本的數據類型和各種補碼、反碼的表示方式。總之看這一章如果不了解 C 的話,有點昏昏欲睡(原因是可能不太懂),但實際上第二章寫的很不錯,當你閱讀了本書的第二章之后,也許會發現,你所謂的(懂)只是你的一廂情願而已,數值系統遠沒有你想象的那么簡單。

第三章是程序的機器級表示,如果你把 C 學的差不多了之后(其實如果單看第二章的話,把 C 語言數據類型惡、運算惡補一下即可),那么恭喜你,接下來你要學習一下匯編了,否則你根本看不懂第三章在說什么(別問我為什么知道的,因為我也看不懂)。你可能想知道諸如 pushq、movq、call、popq、ret%rbx、%rdx 等等都是干嘛的,還有匯編是如何編寫的。而且你還要懂 C 語言。

這么看來這本書根本就不是一本為初學者准備的書,也可以說是初學者的勸退書。

第四章又是一個打開新世界大門的一章,這章會直接從各種電路開始搞起,這 TM 馬上就直接奔硬件了!主要講了 Y86-64 體系、各種門電路、引出計算機流水線的設計。畢竟現代微處理器可以稱得上是人類創造出的最復雜的系統之一。也會給你講解各種指令集的區別。

與這一章節相關的書籍,可以看看《計算機組成與設計:軟件/硬件接口》還有《編碼》這兩本書,都非常好,非常透徹。

這一章也會和你聊聊指令集架構,這些架構和宏觀意義上的應用層架構不一樣,非常復雜,比如下面這個 ARM 架構

image-20211026083152130

這本書是一個值得熟讀 N 遍的一本書。

第五章:優化程序性能,現在普遍意義上提到的各種優化,不論是架構層優化、指令集優化等核心都離不開這一章所介紹的內容。優化的難點在於你需要對系統有充分理解,當然了在你做優化之前首先要保證原始程序功能正確(並且有回歸測試),否則一切都是徒勞。比如你需要了解現在系統存在的性能瓶頸,才能系統性的進行優化,你才能夠編寫高效的程序。

編寫高效程序需要做到下面這幾點:

  • 選擇適當的數據結構和算法。
  • 編寫出編譯器能夠有效優化以轉換成可執行代碼的源代碼。
  • 任務拆分,采用並行計算的方式。

第六章:存儲器層次結構,這一章會向你介紹存儲技術的發展,磁盤、主存、高速緩存的性能差距到底有多大,然后介紹局部性原理,一項非常強大的緩存技術。高速緩存讀寫是如何映射的,高速緩存不同參數的性能影響,如何編寫高速緩存又好的代碼,存儲器山是個什么概念,以及你會見到封面的插圖。

看這一章的時候強烈建議把 Ulrich Drepper 撰寫的長達 114 頁的經典論文 What Every Programmer Should Know About Memory 看了。

以上就是 CSAPP 的第一部分,第一部分主要介紹了程序和硬件之間的交互關系。

而第二部分則專注於程序和操作系統之間的交互關系,你會學到如何使用操作系統提供的服務來構建系統級程序。

第二部分

第七章:鏈接,我們使用 Linux 的時候,很多情況下會出現很多難以理解的錯誤,其中很多都是鏈接錯誤。鏈接分為靜態鏈接和動態鏈接,我們寫的 C 程序在執行的過程中都會經過鏈接階段。

image-20211026162805480

除了這一章內容之外,大家也可以看一下一本把鏈接講的非常透徹的一本書:《程序員的自我修養 -- 鏈接, 裝載與庫》,主要講授代碼指令是如何保存的,庫文件如何與應用程序代碼靜態鏈接,應用程序如何被裝載到內存中並開始運行,動態鏈接如何實現,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 站課程。

image-20211026170441694

看到這里有沒有心潮澎湃的要馬上學起來呢?

還有一些電子書的下載渠道:

image-20211026170730582

CSAPP 不管是中英版本都有一些勘誤,有一些已經改正了,有一些還沒改,大家可以在 http://www.yiligong.org/csapp3e/ 反饋你見到的勘誤,有一些是影響閱讀的,但是有一些是影響理解的。

這里給大家一個小提示,我粗略過了一遍,就拿中文版的《深入理解計算機系統》來說,大家可以看一下最開頭處的印刷時間,然后針對這些勘誤的提出時間進行比較,在印刷之前的很多勘誤已經得到修正了。

也就是說,對於這個網站的使用方法,大家可以從后往前看。

image-20211026171149888

總結

上面只是我對這本書一個粗俗的理解,書我還沒看完,不過我已經有相關 C 語言、匯編語言的學習計划了,另外,知乎上有一個對 《如何閱讀深入淺出計算機系統》 的一個總結性回答,https://www.zhihu.com/question/20402534/answer/1670374116 我認為還是非常好的。

這個回答里面有練習題的答案,還有學習這本書需要的前置知識,這個回答給我的感覺是答主已經刷過幾遍了,作為過來人的經驗還是值得學習的。

最最最重要的就是做實驗,你可以在 http://csapp.cs.cmu.edu/3e/labs.html 上找到 csapp 的所有實驗。

最后給大家推薦一下我自己的 Github https://github.com/crisxuan/bestJavaer ,里面有非常多的硬核文章,絕對會對你有幫助。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM