讀完了csapp(中文名:深刻理解計算機系統)

上個星期最終把csapp看完了。
我買的是中文版的,因爲除了貌似評價不錯之外,因爲涉及到些本身不瞭解的底層東西,怕是看英文會雲裏霧裏。現在看來,大概不能算是個長處,但是的確能夠加快個人看書速度,不然一星期還真不大可能把這書搞定。編程

對csapp慕名已久,主要在於聽說這本書儘可能的作到相對實用,不去講那些和實際編程沒多大關係的計算機原理(畢竟是著名計算機院校裏面最偏軟件的cmu的做品),重點很得當,像我這樣的沒有本科科班出生又不想去死讀些不知道之後有沒實用的東西的人來講,最是適合了。感興趣的東西就行再加深,不感興趣的就算了,正好。
在csapp的序言裏有個課程列表,當中推薦了幾種教學課程,相應使用不一樣的章節。我參考選用的是ICS+的規劃。ICS+的cmu課號爲15-213,聽說正好和cmu的郵編一樣,而後就有了這句「15-213: The Class That Gives CMU Its Zip!」。以這句爲關鍵詞,能夠找到ICS+的slide。
ICS+的課程基本上涵蓋了全書,除了第4章「處理器體系結構」之外。我本身除了跳過這個的確不太感興趣的章節(太偏硬件)之外,還有第9章「測量程序運行時間」是略略翻過,其它的都是認真讀完寫完習題的。 緩存

書的確是可貴的書。我第一次試圖讀這本書是幾個月曾經,當時第2章「信息的表示和處理」沒看完就放下了,認爲講了一大堆數字表達方式很是沒意思……此次略微堅持了一下,沒想到就一口氣讀下來了……
重點推薦第3章「程序的機器級表示」第5章「優化程序性能」第6章「存儲器層次結構」第10章「虛擬存儲器」。認爲這四章乃是全書之精華,看得人慾罷不能。網絡

「程序的機器級表示」一章差點兒是一種教授逆向project的方法在講授,剖析編譯器產生的彙編代碼,以此來加深對詳細代碼實現的理解。大量的習題都是依據彙編來猜源程序是什麼,有趣極了。這一章還覆蓋了緩衝區攻擊——但是這點講得太少了,不解渴,有時間本身弄弄……
講底層離不了彙編這個有點棘手的東西,我還一度操心本身彙編學得不太過關,會碰到障礙。但這裏做者提出一個很是實際的要求:曾經要求程序猿都會寫彙編,現在要求程序猿都會讀彙編。這裏以一種「讀」的方式教人用匯編,不侷限於很是多細小的語法,讓只懂得C的程序猿也毫無障礙。只100多頁,不只初步講了彙編的語法和使用,還配合大量的樣例分析來解讀產生的彙編代碼,讓人理解深入,實在是技高一籌。併發

「優化程序性能」是全書最閃光的章節。做者對一個樣例不斷優化,講循環效率和過程調用,到講存儲器引用,一直講到現代處理器的結構,講到IA32處理器的侷限,一路下來,暢快淋漓。還將IA32處理器的優化結果和Compaq Alpha 21164作對照,一目瞭然的看出哪些優化是處理器相關的,最後講到profiling(程序剖析)指導優化,能夠說平時能夠用到的最高技巧(畢竟我還不是編譯器開發者……)和流程走了一邊,現實意義至關之高。
這章把能夠用到的全部技巧的原理全部解說得清清楚楚,不作沒必要要的挖深,結合代碼,讓人絲絕不覺枯燥,真是佩服得五體投地。儘管章節後對編譯器優化還提供了參考文獻以及加深的內容,只是我認爲這章的內容已經足夠我受用很是久了。 app

「存儲器層次結構」實際上能夠看做是「優化程序性能」一章的延伸,以及爲以後的「虛擬存儲器」作鋪墊。這章主要詳解了快速緩存(cache)的工做方式,以及利用局部性使得cache達到最好效果的方法。
「虛擬存儲器」(Virtual Memory)則上升到了操做系統層面,詳細解析了VM的實現以及Linux系統上VM組織方式。本身認爲最受用的是malloc/free實現的動態存儲器分配的詳細方法以及對進程中詳細存儲結構的瞭解,還有GC的策略。這些讓我感受本身能夠作到的事情彷佛又多了一點,一直沒法理解的valgrind之類軟件的原理彷佛也有了點眉目。
這兩章講得比較仔細,以致於略微顯得有點枯燥。事實上我本身喜歡這兩章的主要緣由是解了我多年來關於存儲器的困惑。只是存儲器方面的內容實在博大精深,本身這全然是得了點皮毛就沾沾自喜。 ide

事實上在學計算機方面我仍是挺有用主義的,一直抱着碰到了再去細緻研究好了的態度,因此看書廣泛不認真,僅僅是求到時候能夠找獲得參考。只是這本書我認爲格外有趣,因此也看得格外認真,把每節後的習題都作了,家庭做業則等着過兩天覆習(計劃是這種……)的時候加深印象。
只是一直沒找到csapp的實習手冊。當中有個「二進制炸彈」實驗很吸引人,典型的反彙編做業,有點點實現我小時候破解願望的感受——但願找到之後不要讓我太失望,呵呵。 函數

只是這本書仍是有些不足之處。讓人感到最大的遺憾是最後三章「系統級I/O」「網絡編程」「併發編程」講得比較簡略——本身正好是在這方面略微熟悉點,認爲少了很是多東西,有點遺憾。只是「併發編程」教給我了一個曾經我根本不知道的東西——進度圖,用來解釋爲何會出現死鎖以及怎樣解決實在是好極了(本身也是太孤陋寡聞……)。
另外還有個細緻讀了apue2之後還讓我很是困惑以致於還得上網查才弄明確的一件事,csapp當頭一句話就攻克了,那就是csapp寫到pthread_detach函數時,說「爲了不存儲器泄露,每個可結合的線程都應該要麼被其它線程顯式地回收,要麼經過調用pthread_detach函數被分離」。而apue2關於detach的那段話硬是讓我雲裏霧裏,只解釋了thread的行爲和怎麼用,不講爲何,害得我還得去查……只是apue2的thread部分不是W.Richard Stevens寫的,是Rago後加的,的確有質量區別……性能

想來書也是有輕重之分,csapp的重點仍是再講硬件和軟件的結合部,後面系統偏應用級的東西僅僅是作拋磚引玉之用,也是難怪。雖然是這樣,csapp有時仍是會讓人眼前一亮。
這本書另外的問題就是雖然中文翻譯還算不錯——也是過了個修訂版的緣故,但是排版經常出錯,尤爲是排彙編代碼和凝視的時候。而且這個書名翻譯得特別沒勁,愣像是混雜在一堆國產計算機結構書裏的東西……
只是仍是那句,瑕不掩瑜,csapp的確是我看過的最好的計算機書之中的一個了(原本想不加之中的一個的,只是不加至少有點對不起apue^_^)。優化

說回來,csapp的致謝裏面有這樣一句話:操作系統

最後,咱們衷心感謝偉大的技術做家Brian Kernigam以及後來的W.Richard Stevens,他們向咱們證實了技術書籍也能寫得如此優美。

相關文章
相關標籤/搜索