天天看點

老趙書托(3):深入了解計算機系統基本知識閱讀建議及相關資源擴充閱讀相關文章

<a href="http://images.cnblogs.com/cnblogs_com/JeffreyZhao/170283/o_csapp.jpg" target="_blank"></a>

這本書的中譯名為“深入了解計算機系統”,我非常,十分,以及百分之一百二十地不滿意。我這麼說的原因在于這個譯法完全扭曲了書的本意。如果直譯原書名,應該是類似于“以程式員的視角了解計算機系統”,何來“深入”二字。可能在國内編輯看來,這是講系統的,用C和彙編語言的,是以很“深入”,但我認為這隻能說明國内技術氛圍的淺薄。因為事實上,這是一本入門級别的書,這本書其實并不“深入”,它談論的内容還是相對比較淺的。但“淺”不代表“淺薄”,寫一本面向初學者的好書往往是非常困難的,是以無論是SICP還是CSAPP,它的作者都是頂尖學府的教授,結合多年教學經驗而寫出來的。

CMU把這本書作為“Introduction to Computer System”課程的教材,是面向計算機專業低年級學生的“計算機系統介紹(導論)”,可能這些學生隻是剛剛了解如何使用一門進階語言——如Java進行程式設計,對于計算機系統的工作方式等話題可謂一點都沒有接觸過,而CSAPP對讀者的背景也隻要求是“一些程式設計經驗”而已。這本書的話題覆寫面很廣,從計算機的基本組成,二進制資料表示方式,到機器級别的指令,CPU工作方式,存儲結構和優化,作業系統的虛拟記憶體管理,程式運作方式,I/O,網絡、到(較底層)程式性能優化和并行程式開發等等。是以,它其實覆寫了“計算機組成原理”,“作業系統”等許多課程的内容,其中的許多話題都能再次展開,繼續深入,都能再變成一本,甚至N本經典。事實上,在高年級的計算機專業課程設定中,都會有更加縱向的内容出現。

是以,如果有人說它“底層”,我同意。但如果說它“深入”,至少我不那麼贊同。

“覆寫面廣”,其實就是這本書的最大優點。它告訴我們計算機是如何設計和工作的,作業系統有哪些重點,它們的作用又是什麼。CSAPP的目标其實便是要講清楚原理,但并不會把某個話題挖掘地過于深入,過于細節。例如書中第4章使用了自己“設計”和“實作”的“Y86”處理器架構,便是為了簡化X86指令集,使課本内容在能夠說明問題的前提下也不至于太複雜。是以,讀完(其實也并不一定要讀完,說實話我也沒有讀完)這本書後,我們就可以對計算機系統各元件的工作方式有了理性的認識。

那麼,這本書适合什麼人閱讀呢?對于這個問題我也有過猶豫。在打算寫“老趙書托”系列的之後,前兩本列在書單的上便是SICP和CSAPP。我對CSAPP推崇備至,在以前的幾篇文章中也都有提及,但最後還是先推薦了SICP。怪怪同學當時在回複中說到“我還以為你會先推薦CSAPP”,其實這就是因為一個“适合面”的問題。在我看來,SICP所強調的程式設計和抽象能力是任何程式員都需要的,但是如果您問我“所有程式員都應該讀CSAPP嗎?”,或者再具體一些:“前端JavaScript程式員需要看CSAPP嗎?”,那麼我可能就無法給出100%令人滿意的答案了。我可能會這樣回答:其實這些内容很多時候并不一定可以“直接用于”某個工作,但是它其實和作業系統,編譯原理等話題一樣,包含的是一套“工作方式”,“算法集”,“實踐成果集”,其中很多理念,如Cache Hierarchy,Copy on Write等了解的适用範圍其實都是非常廣泛的。在一定程度上,其實它和SICP一樣也是在鍛煉思維方式,隻不過是已經經過具體化的實踐方式而已。

是以,即便你是一個前端JavaScript程式員,也可以從CSAPP這本書中獲益。如果您是.NET程式員,那麼您更加适合看這本書了。說一句“豪情萬丈”的話:如果不知道XX,YY或ZZ的話,這如何算是一個優秀的程式員?這本書和平時的工作可能的确不一樣,相比起來“底層”了一些,但是它還是會把“底層内容”控制在一定深度之内,而不會講某個具體話題挖掘到“事倍功半”的程度。而事實上,雖然在進行.NET開發的時候我們已經在一個較高的抽象上工作了,但是我們的程式還是運作在作業系統上,還是在遵循着某個規律在運作着,了解一些内部的工作機制也有助于我們寫出更好的應用程式。

CSAPP這本書覆寫面很廣,我認為并非要一字不漏地讀完才行。根據我的個人觀點,我們應該着重閱讀書的第1章“A Tour of Computer Systems”和第一部分“Program Structure and Execution”(從第2章開始,大約占據了書中一半篇幅),其中包含了資料的機器級别表示方法,彙編語言和執行方式以及CPU架構方面的内容,我們應該關鍵性地了解其原理。如第6章“Optimizing Program Performance”提出了許多種機器級别的優化方式,在現在看來,其中的某些方式過于細緻,乃至在實際工作過程中已經不再推薦了(如内聯一些方法以提高性能),我們要在把握住“為什麼”而并不是單純的吸收“怎麼做”。對于書中的第二部分“Running Programs on a System”主要講述的是作業系統方面的内容,可以讀得略為簡單一些,但其中的第10章“Virtual Memory”,它談論了作業系統中虛拟記憶體機制的各個方面,非常關鍵,需要細讀。至于書中的第三部分“Interaction and Communication Between Programs”便可以更加“選擇性”地閱讀,我隻閱讀了第13章“Concurrent Programming”,而其他兩章都隻是簡單地掃過而已。

<a href="http://images.cnblogs.com/cnblogs_com/JeffreyZhao/170283/o_prog-linker-loader-lib.jpg" target="_blank"></a>

說來有意思,我建議您在讀《鍊》這本書的時候,着重關注非“連結、裝載與庫”的部分,而是那些少量的,如作業系統的線程和記憶體管理方式,甚至于附錄中有關“位元組序(Byte Order)”的内容。因為它們往往是書中主要内容的基礎,擁有更廣的适用性。

<a href="http://images.cnblogs.com/cnblogs_com/JeffreyZhao/170283/o_windows-internals-5th.jpg" target="_blank"></a>

說到“好看”的技術書,那麼我還是以CSAPP這本書中“緻謝”部分的最後一句話來結尾吧:

Finally, we would like to acknowledge the great technical writers Brian Kenighan and the late W. Richard Stevens, for showing us that technical books can be beautiful。

如何把技術書寫的“好看”,真是門藝術。

<a href="http://www.cnblogs.com/JeffreyZhao/archive/2009/05/06/recommended-reading-1.html">老趙書托(1):寫在前面</a>

<a href="http://www.cnblogs.com/JeffreyZhao/archive/2009/07/15/recommended-reading-2-sicp.html">老趙書托(2):計算機程式的構造與解釋</a>

老趙書托(3):深入了解計算機系統

注1:“拆炸彈”是ICS課程的配套實驗之一,它的主要工作便是通過将一些小程式(即“炸彈”)反彙編後閱讀其彙編代碼,然後通過在程式運作時輸入特定的字元串來“拆除”炸彈。有些炸彈可能隻是輸入某個特定的字元,而有些炸彈可能需要輸入複雜的字元串,通過“記憶體溢出”來覆寫掉堆棧中的特定記憶體(如return address),以此改變程式運作的“軌迹”。整個過程非常有挑戰,但也很有趣味。能設計出這樣的實驗的确令人敬佩。

繼續閱讀