深入理解計(jì)算機(jī)系統(tǒng)

出版時(shí)間:2006年07月  出版社:電子工業(yè)出版社  作者:(美)Randal E.Bryant, David R.O'Hallaron  頁數(shù):978  
Tag標(biāo)簽:無  

前言

This book; Computer Systems: A Programmer's Perspective (CS:APP), is for programmers who want to improve their skills by learning what is going on "under the hood" of a computer system. . Our aim is to explain the enduring concepts underlying all computer systems, and to show you the concrete ways that these ideas affect the correctness, performance, and utility of your application programs. Unlike other systems books, which are written primarily for system builders, this book is written for programmers, from a programmer's perspective. If..

內(nèi)容概要

本書主要介紹了計(jì)算機(jī)系統(tǒng)的基本概念,包括最底層的內(nèi)存中的數(shù)據(jù)表示、流水線指令的構(gòu)成、虛擬存儲(chǔ)器、編譯系統(tǒng)、動(dòng)態(tài)加載庫,以及用戶應(yīng)用等。書中提供了大量實(shí)際操作,可以幫助讀者更好地理解程序執(zhí)行的方式,改進(jìn)程序的執(zhí)行效率。此書以程序員的視角全面講解了計(jì)算機(jī)系統(tǒng),深入淺出地介紹了處理器、編譯器、操作系統(tǒng)和網(wǎng)絡(luò)環(huán)境,是這一領(lǐng)域的權(quán)威之作。    本書適合作為計(jì)算機(jī)及相關(guān)專業(yè)的本科生教材,同時(shí)也適用于編程人員參考閱讀。

作者簡介

Randal E.Brant:1981年在麻省理工學(xué)院獲計(jì)算機(jī)科學(xué)博士學(xué)位,現(xiàn)任美國卡內(nèi)基·梅隆大學(xué)計(jì)算機(jī)學(xué)院院長,是ACM和IEEE的雙會(huì)士,多次獲得這兩個(gè)協(xié)會(huì)頒發(fā)的大獎(jiǎng)。Bryant教授從事計(jì)算機(jī)系統(tǒng)方面的教學(xué)工作已超過20年,結(jié)合計(jì)算機(jī)體系結(jié)構(gòu)課程多年的教學(xué)經(jīng)驗(yàn),他開始把關(guān)注點(diǎn)

書籍目錄

1 A Tour of Computer Systems     1.1 Information is Bits + Context     1.2 Programs Are Translated by Other Programs into Different Forms     1.3 It Pays to Understand How Compilation Systems Work     1.4 Processors Read and Interpret Instructions Stored in Memory     1.5 Caches Matter     1.6 Storage Devices Form a Hierarchy     1.7 The Operating System Manages the Hardware     1.8 Systems CommunicateWith Other Systems Using Networks     1.9 The Next Step     1.10 Summary     Bibliographics Notes Part I Program Structure and Execution  2 Representing and Manipulating Information     2.1 Information Storage     2.2 Integer Representations     2.3 Integer Arithmetic     2.4 Floating Point     2.5 Summary     Bibliographic Notes     Homework Problems     Solution to Practice Problems  3 Machine-Level Representation of Programs    3.1 A Historical Perspective     3.2 Program Encodings     3.3 Data Formats     3.4 Accessing Information    3.5 Arithmetic and Logical Operations     3.6 Control     3.7 Procedures    3.8 Array Allocation and Access    3.9 Heterogeneous Data Structures     3.10 Alignment     3.11 Putting it Together: Understanding Pointers    3.12 Life in the RealWorld: Using the GDB Debugger    3.13 Out-of-Bounds Memory References and Buffer Over     3.14 *Floating-Point Code     3.15 *Embedding Assembly Code in C Programs     3.16 Summary     Bibliographic Notes     Homework Problems     Solutions to Practice Problems   4 Processor Architecture  5 Optimizing Program Performance   6 The Memory HierarchyPart Ⅱ Running Programs on a System  7 Linking   8 Exceptional Control Flow   9 Measuring Program Execution Time  10 Virtual MemoryPart Ⅲ Interaction and Communication Between Programs  11 System-Level I/O  12 Network Programming   13 Concurrent ProgrammingA HCL Descriptions of Processor Control LogicB Error HandlingBibliographyIndex

編輯推薦

《深入理解計(jì)算機(jī)系統(tǒng)》(英文版)適合作為計(jì)算機(jī)及相關(guān)專業(yè)的本科生教材,同時(shí)也適用于編程人員參考閱讀。

圖書封面

圖書標(biāo)簽Tags

評(píng)論、評(píng)分、閱讀與下載


    深入理解計(jì)算機(jī)系統(tǒng) PDF格式下載


用戶評(píng)論 (總計(jì)105條)

 
 

  •   如果說計(jì)算機(jī)類的書里有什么適合一個(gè)非相關(guān)專業(yè)的入門,我一般都會(huì)在推薦書目中加上這本書。原因就是這本書的內(nèi)容,從計(jì)算機(jī)的數(shù)字基礎(chǔ)講起,隨后是CPU,內(nèi)存,IO,網(wǎng)絡(luò)。然后是程序的編譯,連接,到程序的執(zhí)行。最后還可以讓讀者有一個(gè)性能評(píng)價(jià)及調(diào)優(yōu)的概念。如果讀者對(duì)這些內(nèi)容都有了一個(gè)比較深的認(rèn)識(shí),那么可以說計(jì)算機(jī)相關(guān)的知識(shí)都掌握。無論是將來做開發(fā),還是做其它的IT相關(guān)工作。都是相當(dāng)有幫助的??梢哉f是將計(jì)算機(jī)的分散概念全部提練后,給了讀者一個(gè)整體的認(rèn)識(shí)。
  •   這本書將以前在學(xué)校里學(xué)過的計(jì)算機(jī)原理,計(jì)算機(jī)體系結(jié)構(gòu),編譯原理,操作系統(tǒng),網(wǎng)絡(luò)等課程串在了一起。里面關(guān)于performancemeasurementandoptimization介紹也很不錯(cuò)。強(qiáng)烈推薦?。?!
  •   英文版更好,免得理解錯(cuò)誤。這書果然不錯(cuò),適合給程序員看,可以讓她們加深理解。學(xué)操作系統(tǒng)和計(jì)算機(jī)架構(gòu)的人也應(yīng)該看看,受益匪淺。
  •   該書詳細(xì)的介紹了計(jì)算機(jī)系統(tǒng)的知識(shí),對(duì)于想系統(tǒng)學(xué)習(xí)的人有很大的幫助??!
  •   很好的一本書,適合學(xué)計(jì)算機(jī)的人讀,書是全英文的,我的英文不是太好,讀起來有點(diǎn)費(fèi)力。但可以從里面學(xué)到很多東西。
  •   講的通俗易懂我建議每個(gè)學(xué)計(jì)算機(jī)大學(xué)生都來看看
  •   看英文版的感覺真實(shí)點(diǎn),看這本書感覺離機(jī)算機(jī)更近一點(diǎn)兒
  •   買了本英文版的,中文版的翻譯得還是不錯(cuò)的.電子專業(yè)的想搞底層開發(fā)的話,值得一看
  •   程序員練內(nèi)功的寶典
  •   好書一本,英文版的,對(duì)于有一定基礎(chǔ)的c學(xué)習(xí)者,好書,全世界強(qiáng)力推薦
  •   還是英文版看起來爽
  •   就是英文確實(shí)有點(diǎn)難度,不過書寫的真的很好,自學(xué)都很適合!
  •   非常好!非常好!非常好!非常好!書很新!
  •   這本書非常好,拿到后很喜歡。
  •   經(jīng)典教材,值得一買,慢慢看,收獲不好
  •   由于機(jī)工的第二版沒貨,只好買這第一版。其實(shí)相對(duì)于每一版之間的那些少數(shù)變化而言,認(rèn)真把書看完看透的意義更大。
  •   電子版看了幾章,決定買來看.這樣的書不是讀一遍就可以的.留在手邊有時(shí)間就翻翻.
  •   買到書了
  •   很經(jīng)典的書,幫同事買的,自己沒有時(shí)間讀哦
  •   傳說中的經(jīng)典 拜讀
  •   經(jīng)典書籍,底層的知識(shí),挺厚,先收著,有時(shí)間再看。
  •   讀過電子書,才買的,確實(shí)是經(jīng)典!
  •   由淺入深,由于本人英語水平有限,建議購買中文版。
  •   怎么回事,我都10多天了,還不到貨.
  •   英文不好,看著難啊難,當(dāng)學(xué)英語了
  •   不錯(cuò)的書,作為入門書,對(duì)于非計(jì)算機(jī)專業(yè)出身的可能更加有用。計(jì)算機(jī)專業(yè)的也可以做為參考書。不過原版的看起來比較慢,沒有效率。呵呵,英文太臭了
  •   書的質(zhì)量一般,不過想對(duì)計(jì)算機(jī)有深入了解的同學(xué)不要錯(cuò)過
  •   好書我收藏,看完中文版的再看英文版的。呵呵
  •   紙比較薄,不過也就沒那么重啊.看了前幾章了,視角獨(dú)特呀..書里有些錯(cuò)誤,不過官網(wǎng)都有校正.
  •   想買原裝正版的,去書店沒找到.就在當(dāng)當(dāng)上買了.下單到收貨,用了四天吧.還行.書是好書,就是紙張質(zhì)量不怎么樣.汗,跟地?cái)偵腺I的武俠小說似的,透過這一頁能看到下一頁...有收藏價(jià)值的書,總是希望質(zhì)量好一點(diǎn)的,十幾塊錢都是小事.希望當(dāng)當(dāng)?shù)耐緜兞私膺@一點(diǎn).
  •   送貨速度還行,紙張比較薄。
    本來這本書電子版的看了一半,但總沒有實(shí)體書的感覺。
    有條件的有毅力的還是買實(shí)體書把,雖然不知道自己能堅(jiān)持多久。。
    好好學(xué)習(xí)咯
  •   書紙張很不好,很薄, 有的地方甚至 印透了,大概是 頁數(shù)太多的原因, 總體上還滿意吧。
  •   書的印刷啊質(zhì)量什么的倒是都還不錯(cuò),內(nèi)容就還沒看了...
  •   不過比較滿意
  •   英文好多不懂
  •   紙的質(zhì)量真的很差
  •   都說這是經(jīng)典很厚,又是英文,啥時(shí)候看完阿
  •   althoughmanyenglishwordsidon'tregconize,iamsurethisbookissuitableforprogrammernomatterwhichlanguageyou'reusing
  •   英文版第2版已于2010年2月份出版,機(jī)械工業(yè)出版社華章公司已引進(jìn)翻譯版權(quán),仍舊邀請(qǐng)龔奕利、雷迎春兩位老師翻譯?!     ∶g,預(yù)計(jì)出版時(shí)間:2010 年9月份?!     ∥覀儠?huì)定期公布此書進(jìn)展,敬請(qǐng)關(guān)注。
  •   怎么會(huì)空洞無物呢?這書應(yīng)該是計(jì)算機(jī)界的經(jīng)典之作了
  •   也太薄了吧...
  •   1、本書為英文原版教材《Computer Systems - A Programmer's Perspective》的影印本,作者Randal E. Bryant為卡耐基梅隆大學(xué)計(jì)算機(jī)學(xué)院院長、IEEE和ACM雙院士,原書堪稱計(jì)算機(jī)科學(xué)領(lǐng)域的經(jīng)典教材之一,是計(jì)算機(jī)領(lǐng)域的入門之作、程序設(shè)計(jì)人員的必讀之作。2、本書體系結(jié)構(gòu)優(yōu)秀,覆蓋廣泛全面,講解細(xì)致,習(xí)題充實(shí),同時(shí)提供了在線教學(xué)網(wǎng)站([...])以供學(xué)習(xí)參考,是計(jì)算機(jī)領(lǐng)域程序研發(fā)人員的入門之作。3、本書體現(xiàn)了外文教材的一大特色,即善于舉例引導(dǎo)學(xué)生深入思考,同時(shí)援引富有應(yīng)用性的典型范例,促使學(xué)生進(jìn)行實(shí)踐性的考量。4、本書采用小16開本,封面為綠色調(diào),裝幀設(shè)計(jì)出色,字體排版適中。全書十分厚重,頁碼數(shù)甚至高達(dá)978,但是作為單頁紙張的質(zhì)量不佳,十分單薄且極易污損。購買價(jià)格:66.70(2009-02-23)
  •   這本深入理解計(jì)算機(jī)系統(tǒng)確實(shí)經(jīng)典,很喜歡
  •   很值得學(xué)計(jì)算機(jī)的人看,而且看懂了很有收獲
  •   很早同學(xué)就推薦這本書了這次終于買了一定好好看,對(duì)得起這66元錢正版的書,印刷也很不錯(cuò)
  •   這本書非常好,我個(gè)人非常推薦,學(xué)習(xí)計(jì)算機(jī)的必修課
  •   講解深刻,通俗易懂,好書.
  •   印刷質(zhì)量太差,遠(yuǎn)不如中文版的紙質(zhì)。書絕對(duì)是好書。
  •   從硬件體系結(jié)構(gòu),操作系統(tǒng),編譯,程序運(yùn)行的角度深入剖析了計(jì)算機(jī)系統(tǒng),真是好書。建議學(xué)了一點(diǎn)匯編和C之后,再看這個(gè)
  •   書不錯(cuò)就是有點(diǎn)舊,還有的破損
  •   書寫的是好,可是有3頁爛的厲害,外面看不出來,肯定是發(fā)貨時(shí)就那樣了.第一次收到爛書,有點(diǎn)不爽.換又太痲煩.
  •   名師寫出來的,絕對(duì)經(jīng)典!對(duì)于理解底層的程序的操作具有不可替代的作用!
  •   即便是初學(xué)者都可以很大程度地從這本書中獲益。翻譯版有很多地方會(huì)造成誤解,還是原版好
  •     讀完這本書后,敲代碼時(shí)就能想象出代碼變成bit流在機(jī)器的各個(gè)組件里流動(dòng)。寫代碼也更有把握了。
      作為一個(gè)系統(tǒng)程序員,這本書應(yīng)該是一本入門的書籍,然我們對(duì)計(jì)算機(jī)系統(tǒng)整體有一個(gè)全面的認(rèn)識(shí)。
      ====分割線
      讀完這本書后,敲代碼時(shí)就能想象出代碼變成bit流在機(jī)器的各個(gè)組件里流動(dòng)。寫代碼也更有把握了。
      作為一個(gè)系統(tǒng)程序員,這本書應(yīng)該是一本入門的書籍,然我們對(duì)計(jì)算機(jī)系統(tǒng)整體有一個(gè)全面的認(rèn)識(shí)。
  •     上學(xué)的時(shí)候硬著頭皮讀的這本書,每天抱著這個(gè)厚厚的書本,一天幾頁,十幾頁。最終讀完了這部長篇巨著。也許是上學(xué)期間做的最有成就的一件事情,在書中得到的知識(shí)為我后來的道路打下了堅(jiān)實(shí)的基礎(chǔ)。也將我關(guān)于編程的知識(shí)從頭到尾串了起來。最主要的是,從此以后再也不懼怕讀大部頭的書了。
      
      學(xué)計(jì)算機(jī)基礎(chǔ)很重要。這本書不但適合新手,也適合老手,深入淺出,涵蓋了計(jì)算機(jī)的三大課程。國內(nèi)的教材,只重片面,學(xué)完以后只見樹木,不見森林。這本書從程序的視角幫讀者去理解問題,推薦想走程序員這條道路的人從頭到尾讀完。讀完后將受益匪淺。
      
  •     這本書很有吸引力,深入淺出,適合初學(xué)者,也適合老手。我不是槍手。
      這本書很有吸引力,深入淺出,適合初學(xué)者,也適合老手。我不是槍手。
      這本書很有吸引力,深入淺出,適合初學(xué)者,也適合老手。我不是槍手。
      這本書很有吸引力,深入淺出,適合初學(xué)者,也適合老手。我不是槍手。
      這本書很有吸引力,深入淺出,適合初學(xué)者,也適合老手。我不是槍手。
      這本書很有吸引力,深入淺出,適合初學(xué)者,也適合老手。我不是槍手。
  •     找工作之前認(rèn)真把《深入理解計(jì)算機(jī)系統(tǒng)》看了一遍,看完最大的收獲是理解了一個(gè)程序如何從源代碼,經(jīng)過編譯鏈接,變成正在運(yùn)行的程序。每次面試的時(shí)候把程序地址空間一講,佯裝自己專業(yè)基礎(chǔ)扎實(shí),硬是把面試官騙過去了,哈哈~~
      書的后半部門講到了套接字,之前看《UNIX網(wǎng)絡(luò)編程》一直對(duì)套接字理解不深刻,看完《深入理解計(jì)算機(jī)系統(tǒng)》后半部分,頓時(shí)有種摸到門道的感覺。
      對(duì)于我這種平時(shí)幾乎不寫代碼的人,看來這本書,總算把上課學(xué)的編譯原理、操作系統(tǒng)等等基礎(chǔ)課程的知識(shí)串聯(lián)起來了。我想對(duì)于經(jīng)常寫代碼的人,看這本書理解更快了。這書真是的程序員必看的書。
      唯一覺得不足的地方時(shí),本書對(duì)內(nèi)存管理和虛擬內(nèi)存介紹的不多,當(dāng)然也有可能是書上寫了,但是我沒理解透徹。
  •     好幾個(gè)同事都給我推薦了這本,也有那些同事都在學(xué)習(xí)這本,我覺得我基礎(chǔ)不錯(cuò),感覺看其它牛B的書也一樣
      
      一周前,準(zhǔn)備再把編譯鏈接與加載再看一遍,《即程序員的修養(yǎng)》那本,之前關(guān)于動(dòng)態(tài)鏈接,重定位部分,看了幾遍都沒理解透。于是翻出了這本,第七章專門講編譯鏈接的,果然講的清楚明白,實(shí)現(xiàn)與原理講的都很清楚,很好理解。這本的第七章,雖然只有幾十頁,講的清晰明了^_^
      
      于是又把第二章與第三章看完。
      
      第2章的數(shù)據(jù)的存儲(chǔ)、數(shù)據(jù)的表示、及數(shù)據(jù)運(yùn)算,看完后,才真正的理解程序數(shù)據(jù)是怎么玩的。對(duì)于同一數(shù)據(jù)(比如int b),C語言、匯編語言及機(jī)器語言的view,是各不相同的。由于對(duì)機(jī)器的數(shù)據(jù)表示及運(yùn)算理解不透,因此對(duì)于匯編里關(guān)于進(jìn)位及溢出,也沒理解透。看完這章,再debug了,才覺得理解了程序數(shù)據(jù)的,才理解了數(shù)據(jù)是怎么存儲(chǔ)、表示、運(yùn)算的,CF與OF是怎么回事。
      
      
      第三章,匯編部分,講的蠻深入淺出的,且對(duì)于C代碼的基本程序結(jié)構(gòu)(for/while/if/switch等),及函數(shù)調(diào)用棧,作者從匯編語言及機(jī)器語言機(jī)級(jí)進(jìn)行了詳細(xì)講解??赐旰?,對(duì)于理解C與匯編代碼的相互轉(zhuǎn)換,為看C匯編后后成的匯編代碼,或反匯編代碼,很有幫助。
      
      
      再如,以前困繞我很久的“存儲(chǔ)器的字節(jié)對(duì)齊”,此書只用了兩頁,及兩個(gè)習(xí)題,就講清楚了。不僅講了怎么對(duì)齊,還講解了為什么要對(duì)齊。
      
      汗,書買了好久,搞活動(dòng)的時(shí)候湊單買的,一直放在那,一直沒翻過。CSAPP確實(shí)很好,好多知識(shí)點(diǎn)都講的非常清楚,而且很簡潔。
      
      神書!
  •     如果你覺得這本書過于厚重?fù)?dān)心看不下來的話,不妨跟著coursera的Hardware/Software Interface這門課程去聽一聽。這本書雖然是這門課的超集,但是其中的關(guān)鍵與精華都在課程中有講到。其實(shí)更關(guān)鍵的是,coursera的課將原書中最為精彩的lab移植了過來,在做這些作業(yè)時(shí)很難感到枯燥。下面把這門課的lab列出來,以及一些提示:
      
      Lab1:位運(yùn)算,我覺得這是最無聊也是最有趣的一個(gè)Lab,看你怎么看它。說其無聊主要是指沒有成就感(相對(duì)于其他的Lab來說),說其有趣是指也許這是你第一次用這么少的代碼實(shí)現(xiàn)這么多的功能。甚至可以只用與或非來實(shí)現(xiàn)三目運(yùn)算符
      
      Lab2:BinaryBomb,拆炸彈,非常經(jīng)典的Lab。一共有6個(gè)Phase,每個(gè)Phase都需要你打開GDB(懶人可以用DDD),打各種斷點(diǎn),查看各種寄存器內(nèi)存狀態(tài),分析匯編語句,整理出結(jié)構(gòu)。6個(gè)Phase從易到難,分別是簡單的比較(助教已經(jīng)演示)、循環(huán)(這個(gè)可以算是最耗時(shí)間的,一旦你通過了這個(gè)Phase,剩下的就好說了)、switch語句(注意計(jì)算offset)、遞歸(嗯,fib什么的)、指針數(shù)組(注意跟蹤過程,一定要有紙筆)、鏈表(排序算法什么的)。這個(gè)Lab是整門課最精彩的Lab,因?yàn)闀r(shí)刻伴隨著你在一步步地逼近真相的神秘感與快感。當(dāng)這個(gè)Lab做完后,你會(huì)發(fā)現(xiàn)GDB調(diào)試功力大漲,對(duì)于操作系統(tǒng)的調(diào)用過程也很熟悉了。
      
      Lab3:內(nèi)存攻擊,最邪惡的Lab沒有之一,這個(gè)Lab是要你去利用內(nèi)存溢出的漏洞去攻擊給你提供的可執(zhí)行程序。這個(gè)Lab也有好幾個(gè)Phase,最后一個(gè)Phase是直接注入自己的匯編代碼。sendmail真是被黑出翔
      
      Lab4:不透明的Cache,又是類似于Lab2的黑箱Lab,通過給幾個(gè)虛擬的Cache提供輸入,以及Cache給你返回的Hit/Miss信息判斷Cache的規(guī)格。對(duì)了解Cache的結(jié)構(gòu)很有幫助
      
      Lab5:手寫一個(gè)malloc,嗯,你沒看錯(cuò)。不過其中最痛苦的塊合并功能已經(jīng)給你寫好了,你只要知道m(xù)alloc、free的流程就可以了,侯捷老師課上學(xué)的東西終于能派上用場(chǎng)了
      
      這就是全部的5個(gè)lab,設(shè)計(jì)的精巧程度自然不用多說,關(guān)鍵是,之前有可能只是抽象的學(xué)過這些概念,比如Cache、比如內(nèi)存溢出攻擊,這次就可以實(shí)際觀察、演練。
      
      這門課的最后一章還講了一些JVM與Intel架構(gòu)的不同之處,對(duì)Java有些了解的同學(xué)可以聽一聽。
      
      最后還要說,盡管這本書和這門課很精彩,但畢竟是體系結(jié)構(gòu)入門的教材,在大多數(shù)方面還是和操作系統(tǒng)、組成原理的深度是比不了的。所以我覺得這本書大三之前還值得看(最好在操作系統(tǒng)前看),到大三之后,除非是為了面試臨時(shí)復(fù)習(xí)抱佛腳,否則這本書還是講的有些淺了。不過如果是作為匯編的入門,倒是很好的教材。
  •      有那么一陣子,別人要是說一本書翻譯的不好,就好像是在為自己看不懂而開脫一樣、或是僅僅為了顯擺一下自己的英文水準(zhǔn),可惜我不在此之列。
       我也不想把那些翻譯很爛的句子逐一挑出來,像是擺地?cái)們核频脑谙旅鏀[一溜,沒那個(gè)必要。而不好之處在于,有些句子讓人完全摸不到頭腦,稀里糊涂的。原本結(jié)構(gòu)非常緊湊的一本書讓譯者翻譯得支離破碎,又似如風(fēng)中殘燭,讀起來味同嚼蠟而且讀速極慢。我英文也不是非常好,但是讀翻譯版的速度和理解程度都要遠(yuǎn)遠(yuǎn)小于讀英文版的,所以我是非常反感譯者的翻譯。
       這本書好不好?我認(rèn)為原版是非常棒的。整體上更注重軟件一點(diǎn)(當(dāng)然,這從書名也能看出來),有多地方是沒有具體深入講解的,大體上算是導(dǎo)論性質(zhì),但又比一般的導(dǎo)論來的更具角度和深刻些。
       總的來說,這本書勉強(qiáng)算在我的閱讀之列,因?yàn)橛龅竭@本書時(shí),內(nèi)容對(duì)我而言早已明白的差不多了,不過極力推薦給大學(xué)一年級(jí)上學(xué)期的本科專業(yè)同學(xué)閱讀,但如果你到了大二還沒讀完,也就別讀了,大三了還提這本書,也就更丟人啊,不是嗎?。。~~
  •       兩個(gè)月來斷斷續(xù)續(xù)地把CSAPP中ICS課程的章節(jié)看完。講系統(tǒng)的書多少有些枯燥,但看下來的收獲與成就感是不可替代的。
      
        國內(nèi)的CS專業(yè)講計(jì)算機(jī)系統(tǒng)通常有兩門必修課程——機(jī)組和操作系統(tǒng),前者很偏硬,很多內(nèi)容對(duì)于程序員不實(shí)用,也就失去了學(xué)習(xí)的興趣。CSAPP則從程序員的視角窺視計(jì)算機(jī)系統(tǒng),并無討厭的數(shù)字電路內(nèi)容,深入淺出,讓人有看下來的興致。全書以C語言和Unix系統(tǒng)為例子。
      
        第1章,計(jì)算機(jī)系統(tǒng)漫游:導(dǎo)論的章節(jié)。
      
        第2章,信息的表示和處理:C變量的機(jī)器級(jí)表示,最基礎(chǔ)的內(nèi)容,講得很詳細(xì)。熟悉的可以略過這一章。
      
        第3章,程序的機(jī)器級(jí)表示:也就是介紹匯編語言。國內(nèi)一些匯編語言教材會(huì)從mov開始逐個(gè)介紹指令,教你手工編寫匯編代碼,讓人無所適從。CSAPP則是把一段C代碼與GCC編譯成的匯編代碼對(duì)照著講,意在讓你理解匯編代碼——畢竟這年頭很少會(huì)用到匯編語言開發(fā)什么東西,更多的是通過觀察匯編代碼,調(diào)試或調(diào)優(yōu)C,C++代碼。
      
        第4章,處理器體系結(jié)構(gòu):太偏硬,直接跳過。知道現(xiàn)代處理器的流水線技術(shù)就夠了。
      
        第5章,優(yōu)化程序性能:講指令級(jí)的優(yōu)化。實(shí)際編程中,通常做到算法級(jí)的優(yōu)化就夠了,讓編譯器去干優(yōu)化指令的苦差。這一章告訴我們,編譯器的優(yōu)化并不完美——尤其是涉及指針的操作,編譯器為了確保正確的運(yùn)行結(jié)果,會(huì)采取更保守的優(yōu)化策略。
      
        第6章,存儲(chǔ)器層次結(jié)構(gòu):比較枯燥的一章,局部性更好的程序跑得更快。
      
        第7章,鏈接:只看了靜態(tài)鏈接的部分?!爸囟ㄎ弧币还?jié)似乎有些晦澀,在那卡了很久才自以為看懂。
      
        第8章,異常控制流:通過異??刂屏饕鲞M(jìn)程的概念,并介紹了一些Unix的庫函數(shù)。很枯燥的一章……
      
        第9章,虛擬存儲(chǔ)器:這一章很精彩。虛擬地址的概念讓進(jìn)程覺得自己的內(nèi)存空間是連續(xù)線性的。而操作系統(tǒng)又能夠根據(jù)映射機(jī)制作出優(yōu)化——例如通過“寫時(shí)拷貝”技術(shù), fork函數(shù)比想像的廉價(jià)?!皠?dòng)態(tài)存儲(chǔ)器分配”一節(jié)介紹了各種分配器的實(shí)現(xiàn),以及malloc函數(shù)的實(shí)現(xiàn)——此前一直以為malloc只是簡單地向系統(tǒng)申請(qǐng)堆空間……“垃圾收集”一節(jié)并不深入,只是簡單地介紹了Mark&Sweep算法,以及為什么C語言難以有效地垃圾回收。
      
        以后再看最后3章吧……
  •     這本書看完了,,,
      雖然看的是英文版的,但是作者用了圖去解釋,所以,很容易理解,,,
      恩,前面bit級(jí)的效率,操作,,,以及內(nèi)存,cpu多處也是很受啟發(fā),,,
      cpu很慚愧啦,,沒看過去,,
      我還是打算有時(shí)間1周也行,把這本書整理一下,做一個(gè)讀書筆記,,,和同道交流一下,,,
      
  •     Chapter 1
      A Tour of Computer System
      一個(gè)對(duì)計(jì)算機(jī)系統(tǒng)總體的介紹,簡單明了。
      
      應(yīng)試 ★★★:可能在筆試中會(huì)有一些整體上的概念題。
      修煉 ★: 屬于計(jì)算機(jī)最基本的概念。
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      chapter 2
      Representing and Manipulating Information
      信息在計(jì)算機(jī)中的表示形式。分別包括整數(shù)和浮點(diǎn)數(shù)的表示形式。
      
      應(yīng)試 ★: 應(yīng)試中很少會(huì)考到。
      修煉 ★★★★:有很多人可能寫了多年的代碼都不知道浮點(diǎn)數(shù)是如何用那4(8)個(gè)字節(jié)存儲(chǔ)的。
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      chapter 3
      Machine-Level Representation of Program
      匯編語言的復(fù)習(xí)。
      
      修煉 ★★★★★:理解匯編語言和寄存器結(jié)構(gòu)是后面很多內(nèi)容的基礎(chǔ)。
      應(yīng)試:
      3.7 Procedures ★★★★★:過程調(diào)用,尤其是過程調(diào)用(包括遞歸調(diào)用)中堆棧的使用情況是經(jīng)常會(huì)考到的。
      3.10 Alignment ★★★★★:數(shù)據(jù)在內(nèi)存中的“對(duì)齊”方式,也是經(jīng)常出現(xiàn)在考題中的。比如定義一個(gè)結(jié)構(gòu)體數(shù)組,打印出其中一個(gè)元素的地址,問這個(gè)地址相對(duì)數(shù)組起始地址有多少個(gè)字節(jié)的距離。
      others ★★★: 匯編在應(yīng)試中考的還是比較少的(除專門的職位)。
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      chapter 4
      Processor Architecture
      計(jì)算機(jī)體系結(jié)構(gòu)的內(nèi)容。
      處理器結(jié)構(gòu),各種邏輯門、功能單元,指令集,指令的執(zhí)行,指令執(zhí)行的流水線等。
      
      應(yīng)試 ★: 對(duì)于軟件相關(guān)職位來說,很少會(huì)考到這么底層的東西的。
      修煉 ★★★: 對(duì)于從事軟件層面的技術(shù)人員來說,不用深入,但是也應(yīng)該理解,知道是怎么回事。
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      chapter 5
      Optimizing Program Performance
      如何優(yōu)化程序的執(zhí)行效率,包括代碼的優(yōu)化,編譯器的優(yōu)化,及CPU級(jí)別的優(yōu)化。
      
      5.1-5.6
      應(yīng)試 ★★★★: 經(jīng)常會(huì)有一些讓你尋找程序瑕疵的問題,你能看出代碼在哪些細(xì)節(jié)上可以優(yōu)化嗎?
      修煉 ★★★★★: 你當(dāng)然需要知道編譯器能在什么層面上自動(dòng)幫你優(yōu)化代碼,在編譯器無法優(yōu)化時(shí)你自己如何在小細(xì)節(jié)上優(yōu)化代碼。
      5.7以后
      CPU級(jí)別的優(yōu)化,微指令的概念,功能單元上微指令的并行,程序分支的預(yù)測(cè)等。
      應(yīng)試 ★: 對(duì)于軟件相關(guān)職位來說,不會(huì)考這些東西的。
      修煉 ★★★: 不用深入,但是應(yīng)該知道并能夠理解。
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      chapter6
      The Memory Hierarchy
      詳細(xì)介紹了計(jì)算機(jī)系統(tǒng)中的存儲(chǔ)結(jié)構(gòu)。
      
      6.1 介紹了不同種類的存儲(chǔ)設(shè)備以及對(duì)應(yīng)的存取數(shù)據(jù)的方式。
      應(yīng)試 ★: 很少會(huì)考到這么底層的東西
      修煉 ★★: 知道就好了。
      6.2-6.5 介紹了存儲(chǔ)設(shè)備的組織形式,著重介紹了Cache及其工作方式。
      應(yīng)試 ★★★★: 在面試中,經(jīng)常會(huì)考到跟cache相關(guān)的題目。
      修煉 ★★★★: 存儲(chǔ)結(jié)構(gòu)和cache是計(jì)算機(jī)中很基礎(chǔ)也很重要的概念。
      6.6-6.7 介紹了程序如何和cache打交道,不同的循環(huán)嵌套順序、遍歷方向等對(duì)cache命中的影響。
      應(yīng)試 ★★: 很少會(huì)考到這些東西。
      修煉 ★★★★: 你當(dāng)然希望在寫多重循環(huán)的時(shí)候知道什么樣的嵌套順序效率最高。
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      chapter 7
      Linking
      顧名思義,詳細(xì)講解了程序的鏈接過程,主要分為靜態(tài)鏈接和動(dòng)態(tài)鏈接,以及鏈接過程中使用到的技術(shù)。
      
      應(yīng)試 ★★★:需要知道鏈接的基本概念,尤其是動(dòng)態(tài)鏈接可能會(huì)考到。
      修煉 ★★★★★:有的時(shí)候,你很可能會(huì)被一個(gè)鏈接錯(cuò)誤折磨好幾天。另外,動(dòng)態(tài)鏈接庫的應(yīng)用現(xiàn)在也是很普遍的。
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      chapter 8
      Exceptional Control Flow
      顧名思義,本章主要講解異??刂疲贿^這里的“異?!辈⒉皇荍ava或者C++里的狹義的異常,而是一個(gè)廣義的“Exceptions”的概念,包括中斷(Interrupt,硬件層面,主要是I/O中斷),陷阱(Trap,主動(dòng)產(chǎn)生的異常,主要用于用戶程序和系統(tǒng)內(nèi)核間的交互,如系統(tǒng)調(diào)用),錯(cuò)誤(Falut,如除0錯(cuò)誤;頁錯(cuò)誤:在虛擬內(nèi)存中,所請(qǐng)求頁面并不在內(nèi)存中,需要從硬盤讀取等。錯(cuò)誤可能恢復(fù)),中止(Abort,致命錯(cuò)誤,無法恢復(fù),如硬件問題等)。
      在介紹異常處理的同時(shí),引入了進(jìn)程的概念,對(duì)進(jìn)程控制也進(jìn)行了詳細(xì)介紹,以及進(jìn)程級(jí)別的Exception:信號(hào)(signal),這個(gè)級(jí)別的異常處理由操作系統(tǒng)完成,通常叫做上下文切換(context switch)。
      
      應(yīng)試 ★★: 主要掌握進(jìn)程的概念即可。
      修煉 ★★★: 知道異??刂屏魇窃趺椿厥拢脩舫绦蚝拖到y(tǒng)交互(如系統(tǒng)調(diào)用)的原理和方式即可,不用太深入。
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      chapter 9
      Measuring Program Execution Time
      本章介紹了如何盡可能準(zhǔn)確的測(cè)量程序執(zhí)行的時(shí)間。在實(shí)際編程中,我們極少會(huì)需要進(jìn)行如此精確的測(cè)量,所以我跳過本章不讀。
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      chapter 10
      Virtual Memory
      非常重要的一章,虛擬存儲(chǔ)機(jī)制是計(jì)算機(jī)實(shí)現(xiàn)多任務(wù)的一項(xiàng)重要技術(shù)。計(jì)算機(jī)正是通過時(shí)間片技術(shù)使得每個(gè)進(jìn)程在執(zhí)行時(shí)仿佛獨(dú)占CPU,進(jìn)而又通過虛擬存儲(chǔ)機(jī)制使得每一個(gè)進(jìn)程在執(zhí)行時(shí),仿佛獨(dú)占內(nèi)存。
      10.1介紹了虛擬地址和物理地址,CPU進(jìn)行尋址操作產(chǎn)生的是虛擬地址,通過存儲(chǔ)管理單元(memory management unit)轉(zhuǎn)換為實(shí)際的物理內(nèi)存地址。
      10.3~10.5講述了虛擬存儲(chǔ)機(jī)制的優(yōu)點(diǎn):使得內(nèi)存可以作為硬盤的cache;能夠更方便的管理內(nèi)存;能更好的提供內(nèi)存保護(hù)機(jī)制。
      10.6 介紹了虛擬地址如何轉(zhuǎn)換為物理地址。
      10.7 很精彩的一節(jié),通過Intel Pentium和Linux的實(shí)例講述了整個(gè)存儲(chǔ)管理機(jī)制。記得以前上操作系統(tǒng)課的時(shí)候,各種理論、機(jī)制學(xué)了一大堆,但是就是不知道實(shí)際的操作系統(tǒng)到底用的哪套方法。而本節(jié)內(nèi)容正是通過實(shí)例讓你對(duì)剛學(xué)的理論機(jī)制有一個(gè)直觀的了解。
      10.8~10.10 講述了存儲(chǔ)映射(Memory Mapping)、動(dòng)態(tài)內(nèi)存分配和垃圾回收機(jī)制。
      10.11 很實(shí)用的一節(jié),列舉了一些C編程中容易犯的內(nèi)存引用錯(cuò)誤。
      
      應(yīng)試 ★★★★: 本章內(nèi)容是操作系統(tǒng)課程的重點(diǎn)內(nèi)容,如果考操作系統(tǒng),極有可能考到。10.11節(jié)的知識(shí)也能幫你應(yīng)對(duì)一些程序挑錯(cuò)題。
      修煉 ★★★★★: 操作系統(tǒng)中重要的基礎(chǔ)內(nèi)容,即使你只使用Java這樣的高級(jí)編程語言,至少也應(yīng)該弄懂垃圾回收機(jī)制吧。
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      chapter 11
      System-Level I/O
      介紹類Unix系統(tǒng)下的I/O讀寫,主要介紹系統(tǒng)層面的I/O接口。由于我們?nèi)粘>幊趟玫腎/O接口都是各種高級(jí)語言提供的經(jīng)過封裝的標(biāo)準(zhǔn)接口,故而如果不進(jìn)行嵌入式編程的話這部分知識(shí)不是必須的,我跳過沒讀。
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      chapter 12
      Network Progranmming
      簡單介紹了網(wǎng)絡(luò)模型,TCP/IP協(xié)議,類Unix系統(tǒng)的socket接口等。
      應(yīng)試和修煉 ★★: 因?yàn)槠拗疲菊轮蛔隽撕唵沃v解,要掌握網(wǎng)絡(luò)編程知識(shí)還需要參考專門的網(wǎng)絡(luò)技術(shù)書籍。
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      chapter 13
      Concurrent Programming
      本章簡單介紹了并發(fā)程序設(shè)計(jì)的內(nèi)容,主要包括:
      進(jìn)程級(jí)別的并發(fā),各子進(jìn)程擁有不同的虛擬地址空間,需要IPC(InterProcess Communication)機(jī)制共享數(shù)據(jù),進(jìn)程之間切換開銷大。
      I/O復(fù)用,事件驅(qū)動(dòng),單進(jìn)程運(yùn)行,共享虛擬地址空間,并發(fā)效果不理想。
      線程,介于上述兩種中間,各子線程共享進(jìn)程的虛擬地址空間,線程間切換開銷較小。
      
      另外介紹了并發(fā)編程中訪問共享變量的信號(hào)量機(jī)制。給出了4類容易引起線程不安全的函數(shù)。
      應(yīng)試 ★★: 除應(yīng)聘相關(guān)職位外,并發(fā)編程考的比較少,不過需要清楚鎖機(jī)制和信號(hào)量機(jī)制等。
      修煉 ★★★: 多線程程序在現(xiàn)今的開發(fā)中還是很常見的,但是本章介紹的比較簡單,需要參考另外專門的書籍。
  •     這本書的中譯名為“深入理解計(jì)算機(jī)系統(tǒng)”,有一定的問題。如果直譯原書名,應(yīng)該是類似于“以程序員的視角理解計(jì)算機(jī)系統(tǒng)”??赡茉趪鴥?nèi)看來,這是講系統(tǒng)的,用C和匯編語言的,因此很“深入”。事實(shí)上,這是一本入門級(jí)別的書,這本書其實(shí)并不“深入”,它談?wù)摰膬?nèi)容還是相對(duì)比較淺的。但“淺”不代表“淺薄”,寫一本面向初學(xué)者的好書往往是非常困難的,它的作者都是頂尖學(xué)府的教授,結(jié)合多年教學(xué)經(jīng)驗(yàn)而寫出來的。
      
      CMU把這本書作為“Introduction to Computer System”課程的教材,是面向計(jì)算機(jī)專業(yè)低年級(jí)學(xué)生的“計(jì)算機(jī)系統(tǒng)介紹(導(dǎo)論)”。這些學(xué)生只是剛剛了解如何使用一門高級(jí)語言,對(duì)于計(jì)算機(jī)系統(tǒng)的工作方式等話題可謂一點(diǎn)都沒有接觸過,而CSAPP對(duì)讀者的背景也只要求是“一些編程經(jīng)驗(yàn)”而已。這本書的話題覆蓋面很廣,從計(jì)算機(jī)的基本組成,二進(jìn)制數(shù)據(jù)表示方式,到機(jī)器級(jí)別的指令,CPU工作方式,存儲(chǔ)結(jié)構(gòu)和優(yōu)化,操作系統(tǒng)的虛擬內(nèi)存管理,程序運(yùn)行方式,I/O,網(wǎng)絡(luò)、到(較底層)程序性能優(yōu)化和并行程序開發(fā)等等。所以,它其實(shí)覆蓋了“計(jì)算機(jī)組成原理”,“操作系統(tǒng)”等許多課程的內(nèi)容,其中的許多話題都能再次展開,繼續(xù)深入,都能再變成一本,甚至N本經(jīng)典。在高年級(jí)的計(jì)算機(jī)專業(yè)課程設(shè)置中,都會(huì)有更加縱向的內(nèi)容出現(xiàn)。另外,《計(jì)算機(jī)科學(xué)前沿技術(shù)》一書對(duì)CMU中的課程體系進(jìn)行了介紹,有興趣的讀者可以去看看,該書還推薦了很多其他好書,當(dāng)然也包括這本書,準(zhǔn)備按照這本書的介紹全部拿來看看。
      
      “覆蓋面廣”,其實(shí)就是這本書的最大優(yōu)點(diǎn)。它告訴我們計(jì)算機(jī)是如何設(shè)計(jì)和工作的,操作系統(tǒng)有哪些重點(diǎn),它們的作用又是什么。CSAPP的目標(biāo)其實(shí)便是要講清楚原理,但并不會(huì)把某個(gè)話題挖掘地過于深入,過于細(xì)節(jié)??纯催@本書后,我們就可以對(duì)計(jì)算機(jī)系統(tǒng)各組件的工作方式有了理性的認(rèn)識(shí)。在一定程度上,其實(shí)它是在鍛煉思維方式 -- 計(jì)算思維。
  •      這本書是我見過的最好的計(jì)算機(jī)系統(tǒng)書籍。首先要明白一點(diǎn),這里所說的系統(tǒng)不是指計(jì)算機(jī)操作系統(tǒng),而是計(jì)算機(jī)整體,包括軟件和硬件。其實(shí)真正學(xué)計(jì)算機(jī),是無所謂軟硬兼之分的。不懂硬件造不出好的軟件;不懂軟件硬件也不會(huì)出色。該書處處都很精彩,能將軟件與硬件及所有計(jì)算機(jī)的內(nèi)容融匯在一本書里,用極淺顯的語言講出來,非常棒。
       書里有些內(nèi)容我只有在這本書里見到過,比如程序代碼優(yōu)化,是和計(jì)算機(jī)硬件相結(jié)合講的,讀完之后非常受用。
       該書簡潔而不簡單,我是去年1月份買的,到今年4月份才勉強(qiáng)看的有了一點(diǎn)收獲,我現(xiàn)在讀大學(xué)本科計(jì)算機(jī)專業(yè)二年級(jí),這本書給我的感覺是非常專業(yè),非常出色。
  •     在剛上大學(xué)一年級(jí)的時(shí)候,學(xué)校的哥哥姐姐們都力薦了這本書,一直奉行“好書就該收藏”,所以二話不說就買下了這本所謂的“神作”,剛買來讀了百來頁,但是略覺枯燥,因?yàn)榕c硬件相比,我更喜歡的是軟件,其實(shí)我是沒有認(rèn)識(shí)到,讀這本書要一定的“計(jì)算機(jī)組成原理”的基礎(chǔ)。
      于是束之高閣......
      待二年級(jí)下半年,我重新拿起了這本書,剛讀了一章,才知道我已經(jīng)冷落了這本書整整一年的時(shí)間,慚愧啊。
      這本書絕對(duì)是本好書,古人所謂茅塞頓開,醍醐灌頂,只要你拿起這本書,并且用心讀下去,絕對(duì)是這種感覺,我這才體會(huì)到“愛不釋手”的愛書的感覺,總想一下子把它讀完,但又不舍得,所以還是一字一句的啃。
      無論是軟件還是硬件,這本書都涉及了。
      雖為好書,但也并非零基礎(chǔ),大家最好在學(xué)習(xí)計(jì)算機(jī)組成原理的時(shí)候一起看,一個(gè)字爽。
      我特別喜歡虛擬存儲(chǔ)器,Cache這些部分,特別賞心悅目。
  •      寒假花了3個(gè)多星期,把這本書的第一、第二部分讀完。這本書講述的計(jì)算機(jī)如何工作的,較偏向底層,穩(wěn)重思路非常清晰的,特別是前面的部分很詳細(xì),到后面可能由于篇幅的關(guān)系后面顯得有些簡略。
       書中配套是實(shí)驗(yàn)還是非常值得一做的,并且非常有趣,我做了前3個(gè)lab,從中學(xué)到的還是很多的。
       平時(shí)寫程序都是在高級(jí)的層面上,我們都不需要知道計(jì)算機(jī)內(nèi)部是如何工作的,正如書中提到計(jì)算機(jī)中的分層和抽象思想一樣,分層和抽象的思想是偉大的,我們可以專注于自己領(lǐng)域而不用關(guān)注其它方面,但是導(dǎo)致我們編程那么久,對(duì)于計(jì)算機(jī)還是一無所知。
       而這本書恰恰就是講述計(jì)算機(jī)是如何工作的,雖然不懂得底層不妨害寫程序,但我始終認(rèn)為不知道計(jì)算機(jī)內(nèi)部是如何工作的很難稱得上是好的程序員。
       推薦!
  •     適合計(jì)算機(jī)專業(yè)的本科生入門,以及希望了解計(jì)算機(jī)的人士閱讀。全書大只講解了關(guān)于編程的基礎(chǔ)知識(shí),設(shè)計(jì)體系結(jié)構(gòu),操作系統(tǒng)。雖然從題目的意思來說,本意是通過本書讓程序員編出性能良好的程序。但實(shí)際上正如前面提到的,講了很多計(jì)算機(jī)專業(yè)的入門知識(shí)。讓人對(duì)計(jì)算機(jī)軟硬件各個(gè)方面有了大體了解。很不幸,我到大三才讀了這本書。
  •     對(duì)于想修煉計(jì)算機(jī)內(nèi)功的程序員來說是一個(gè)很好的選擇,我覺得計(jì)算機(jī)程序員先讀讀這樣的書再去學(xué)習(xí)那些語言之類的,語言只是外功,內(nèi)功不行外功練得再多也無法融匯貫通,雖然我只讀了一部分,但是我已經(jīng)深深喜歡上這本書了,有些習(xí)題也不是很明白,有希望一起交流學(xué)習(xí)的歡迎加入群:177094968
  •     英文名:Computer Systems : A Programmer's Perspective 作者:【美】Randal E.Bryant、David O'Hallaron
      
      序言
      
      第1章 計(jì)算機(jī)系統(tǒng)漫游
        計(jì)算機(jī)系統(tǒng)是由硬件和系統(tǒng)軟件組成的,它們共同協(xié)作以運(yùn)行應(yīng)用程序。計(jì)算機(jī)內(nèi)部的信息被表示為一組組的位,它們依據(jù)不同的上下文又有不同的解釋方式。程序被其他程序翻譯成不同的形式,開始時(shí)是ASCII文本,然后被編譯器和連接器翻譯成二進(jìn)制可執(zhí)行文件。
        處理器讀取并解釋存放在主存里的二進(jìn)制指令。因?yàn)橛?jì)算機(jī)花費(fèi)了大量的時(shí)間自啊存儲(chǔ)器、I/O設(shè)備和CPU寄存器之間拷貝數(shù)據(jù),所以系統(tǒng)的存儲(chǔ)設(shè)備就按層次排列,CPU寄存器在頂部,接著是多層的硬件高速緩存設(shè)備、DRAM主存儲(chǔ)器和磁盤存儲(chǔ)器。在層次模型中位于更高層的存儲(chǔ)設(shè)備比低層的存儲(chǔ)設(shè)備要快,單位比特造價(jià)也高。程序員通過理解和運(yùn)用這種存儲(chǔ)層次結(jié)構(gòu)的知識(shí),可以優(yōu)化C程序的性能。
        操作系統(tǒng)內(nèi)核是應(yīng)用程序和硬件之間的媒介。它提供3個(gè)基本的抽象概念:文件是對(duì)I/O設(shè)備的抽象概念;虛擬存儲(chǔ)器是對(duì)主存和磁盤的抽象概念;進(jìn)程是處理器、主存和I/O設(shè)備的抽象概念。網(wǎng)絡(luò)提供了計(jì)算機(jī)系統(tǒng)之間通信的手段。從某個(gè)系統(tǒng)的角度來看,網(wǎng)絡(luò)就是一種I/O設(shè)備。
      
        程序編譯過程:預(yù)處理->編譯->匯編->鏈接
      
        理解編譯系統(tǒng)如何工作的好處:
        1)優(yōu)化程序性能
        2)理解鏈接時(shí)出現(xiàn)的錯(cuò)誤
        3)避免安全漏洞
      
        系統(tǒng)的硬件組成:總線、I/O設(shè)備、主存、處理器
        存儲(chǔ)設(shè)備的層次結(jié)構(gòu):寄存器、芯片上的L1,芯片外的L2、主存儲(chǔ)器、本地二級(jí)存儲(chǔ)、遠(yuǎn)程二級(jí)存儲(chǔ)
        操作系統(tǒng)的兩個(gè)用途:防止硬件被失控的應(yīng)用程序?yàn)E用;在控制復(fù)雜而又通常廣泛不同的低級(jí)硬件設(shè)備方面,為程序提供簡單一致的方法
        文件只不過就是字節(jié)序列。每個(gè)I/O設(shè)備,包括磁盤、鍵盤、顯示器、甚至于網(wǎng)絡(luò),都可以被看成是文件。系統(tǒng)中所有的輸入輸出都是通過使用稱為Unix I/O的一小組系統(tǒng)函數(shù)調(diào)用讀寫文件來實(shí)現(xiàn)的。
      
        系統(tǒng)不僅僅只是硬件。系統(tǒng)是互相交織的硬件和系統(tǒng)軟件的集合體,它們必須共同協(xié)作以達(dá)到運(yùn)行應(yīng)用程序的最終目的。
      
      
      第1部分 程序結(jié)構(gòu)和執(zhí)行
      
      第2章 信息的表示和處理
        通過研究實(shí)際數(shù)字的表示,我們能夠了解可以表示的值和范圍和不同算術(shù)運(yùn)算的屬性。對(duì)于編寫在全部數(shù)值范圍內(nèi)都能工作,而且可以跨越不同機(jī)器、操作系統(tǒng)和編譯器組合的可移植程序來說,這種了解是非常重要的。
      
        大多數(shù)計(jì)算機(jī)使用8位的塊,或叫做字節(jié)(byte),來作為最小的可尋址的存儲(chǔ)器單位,而不是訪問存儲(chǔ)器中單獨(dú)的位。機(jī)器級(jí)程序?qū)⒋鎯?chǔ)器視為一個(gè)非常大的字節(jié)數(shù)組,稱為虛擬存儲(chǔ)器(virtual memory)。存儲(chǔ)器的每個(gè)字節(jié)都由一個(gè)唯一的數(shù)字來表示,稱為它的地址(address),所有可能地址的集合就稱為虛擬地址空間(virtual address space)。虛擬地址空間只是一個(gè)展現(xiàn)給機(jī)器級(jí)程序的概念性映像(image)。實(shí)際的實(shí)現(xiàn)使用的是隨機(jī)訪問存儲(chǔ)器RAM、磁盤存儲(chǔ)、特殊硬件和操作系統(tǒng)軟件的結(jié)合,來給程序提供一個(gè)看上去統(tǒng)一的字節(jié)數(shù)組。
        編譯器和運(yùn)行時(shí)系統(tǒng)的一個(gè)任務(wù)就是將這個(gè)存儲(chǔ)器空間劃分成更可管理的單元,來存放不同的程序?qū)ο螅╬rogram object),也就是,程序數(shù)據(jù)、指令和控制信息。有各種機(jī)制可以用來分配和管理程序不同部分的存儲(chǔ)。這種管理完全是在虛擬空間里完成的。
      
        由于編碼的長度有限,計(jì)算機(jī)運(yùn)算與傳統(tǒng)整數(shù)和實(shí)數(shù)運(yùn)算相比,具有非常不同的屬性。當(dāng)超出表示范圍時(shí),有限長度能夠引起數(shù)值溢出。當(dāng)浮點(diǎn)數(shù)非常接近于0.0,從而轉(zhuǎn)換成0時(shí),浮點(diǎn)數(shù)也會(huì)下溢。
        必須非常小心地使用浮點(diǎn)運(yùn)算,因?yàn)楦↑c(diǎn)運(yùn)算的范圍和精度有限,而且浮點(diǎn)運(yùn)算并不遵守普遍的算術(shù)屬性,比如結(jié)合性。
      
      第3章 程序的機(jī)器級(jí)表示
        通過讓編譯器產(chǎn)生機(jī)器級(jí)程序的匯編表示,我們了解編譯器和它的優(yōu)化能力,以及機(jī)器代碼、它的數(shù)據(jù)類型和它的指令集。當(dāng)編寫能有效映射到機(jī)器上的程序時(shí),了解編譯器的特性會(huì)有所幫助,一些高級(jí)語言會(huì)抽象隱藏有關(guān)程序的重要細(xì)節(jié)。理解程序是如何映射到機(jī)器上的,會(huì)讓理解這些存儲(chǔ)之間的區(qū)別容易一些。
        匯編語言與C代碼差別很大,在匯編語言程序中,各種數(shù)據(jù)類型之間的差別很小。程序是以指令序列來表示的,每條指令都完成一個(gè)單獨(dú)的操作。部分程序狀態(tài),如寄存器和運(yùn)行時(shí)棧,對(duì)程序員來說是直接可見的。僅提供了低級(jí)操作來支持?jǐn)?shù)據(jù)處理和程序控制。編譯器必須用多條指令來產(chǎn)生和操作各種數(shù)據(jù)結(jié)構(gòu),來實(shí)現(xiàn)像條件、循環(huán)和過程這樣的控制結(jié)構(gòu)。
      
      第4章 處理器體系結(jié)構(gòu)
        通常,處理一條指令包括很多操作。但是一般情況下我們將它們組織成某個(gè)特殊的階段序列,使得即使指令的動(dòng)作差異很大,但所有的指令都遵循統(tǒng)一的序列。每一步的具體處理取決于正在執(zhí)行的指令。每一條指令都可以分解為6個(gè)步驟:取指(fetch)、譯碼(decode)、執(zhí)行(execute)、訪存(memory)、寫回(write back)、更新PC(程序計(jì)數(shù)器,PC update)
        將流水線技術(shù)引入一個(gè)帶反饋的系統(tǒng)會(huì)導(dǎo)致相鄰指令間在發(fā)生相關(guān)時(shí)出現(xiàn)問題,這些相關(guān)可能會(huì)導(dǎo)致流水線產(chǎn)生計(jì)算錯(cuò)誤,成為冒險(xiǎn)。冒險(xiǎn)可分為數(shù)據(jù)冒險(xiǎn)(data hazard)和控制冒險(xiǎn)(control hazard)。常用的用來避免冒險(xiǎn)的技術(shù)為暫停(stalling)和前遞(forwarding)
        流水線控制邏輯必須滿足下面3種控制情況:
        1)處理RET:流水線必須暫停直到RET指令到達(dá)寫回階段
        2)加載/使用冒險(xiǎn):在一條從存儲(chǔ)器中讀出一個(gè)值的指令和一條使用該值的指令之間,流水線必須暫停一個(gè)周期
        3)預(yù)測(cè)錯(cuò)誤的轉(zhuǎn)移:在轉(zhuǎn)移邏輯發(fā)現(xiàn)不應(yīng)該選擇轉(zhuǎn)移之前,轉(zhuǎn)移目標(biāo)處的幾條指令已經(jīng)進(jìn)入流水線了。必須從流水線中去掉這些指令。
      
        我們已經(jīng)看到,指令集體體系結(jié)構(gòu)(即ISA)在處理器行為(就指令集合及其 編碼而言)和如何實(shí)現(xiàn)處理器之間提供了一層抽象。ISA提供了程序執(zhí)行的一種順序說明,也就是一條指令執(zhí)行完了,下一條指令才會(huì)開始。
        流水線化處理讓不同的階段并行操作,改進(jìn)了系統(tǒng)的吞吐量性能。在任意一個(gè)給定的時(shí)刻,多條指令被處理。在引入這個(gè)并行性的過程中,我們必須非常小心,以提供與程序的順序執(zhí)行相同的用戶可見的、程序級(jí)行為。
        有關(guān)處理器設(shè)計(jì)的幾個(gè)重要經(jīng)驗(yàn):
        1)管理復(fù)雜性是首要問題
        2)我們不需要直接實(shí)現(xiàn)ISA
        3)硬件設(shè)計(jì)人員必須非常謹(jǐn)慎小心
      
      第5章 優(yōu)化程序性能
        優(yōu)化程序性能,主要通過:消除循環(huán)的低效率、減少過程調(diào)用、消除不必要的存儲(chǔ)器引用、針對(duì)現(xiàn)代處理器進(jìn)行代碼調(diào)整(使用浮點(diǎn)、變換平臺(tái))、降低循環(huán)開銷、轉(zhuǎn)換到指針代碼(可能會(huì)降低程序的可讀性)、提高并行性(比如循環(huán)分割,但是可能會(huì)導(dǎo)致寄存器溢出,所以要同時(shí)對(duì)并行做限制)
        存儲(chǔ)器的性能包括:加載的執(zhí)行時(shí)間和存儲(chǔ)的執(zhí)行時(shí)間
      
        優(yōu)化程序性能的基本策略:
        1)高級(jí)設(shè)計(jì):為手邊的問題選擇適當(dāng)?shù)乃惴ê蛿?shù)據(jù)結(jié)構(gòu)。要特別警覺避免使用會(huì)漸進(jìn)地產(chǎn)生糟糕性能的算法或編碼技術(shù)。
        2)基本編碼規(guī)則:避免限制優(yōu)化的因素,這樣編譯器就能產(chǎn)生高效的代碼。
         消除連續(xù)的函數(shù)調(diào)用。在可能時(shí),將計(jì)算移到循環(huán)外??紤]有選擇的妥協(xié)程序的模塊性以獲得更大的效率。
         消除不必要的存儲(chǔ)器引用。引入臨時(shí)變量來保存中間結(jié)果。只有在最后的值計(jì)算出來時(shí),才將結(jié)果存放到數(shù)組或全局變量中。
        3)低級(jí)優(yōu)化
         嘗試各種與數(shù)組代碼相對(duì)的指針形式
         通過展開循環(huán)降低循環(huán)開銷
         通過諸如迭代分割之類的技術(shù),找到使用流水線化的功能單元的方法
        注意在優(yōu)化代碼時(shí)要使用檢查代碼(checking code)來測(cè)試代碼的每個(gè)版本,以確保在這一過程中沒有引入錯(cuò)誤。
      
        雖然關(guān)于代碼優(yōu)化大多數(shù)論述都描述了編譯器是如何能生成高效代碼的,但是應(yīng)用程序員有很多方法來協(xié)助編譯器完成這項(xiàng)任務(wù)。沒有任何編譯器能用一個(gè)好的算法或數(shù)據(jù)結(jié)構(gòu)代替低效率的算法或數(shù)據(jù)結(jié)構(gòu),因此程序設(shè)計(jì)的這些方面依然是程序員主要關(guān)心的。我們還看到妨礙優(yōu)化的因素,比如存儲(chǔ)器別名和過程調(diào)用,嚴(yán)重限制了編譯器執(zhí)行大量優(yōu)化的能力。同樣,程序員必須對(duì)消除這些妨礙優(yōu)化的因素負(fù)主要的責(zé)任。
        隨著我們對(duì)優(yōu)化的深入,研究匯編代碼以及試著理解機(jī)器是如何執(zhí)行計(jì)算的變得重要起來。對(duì)于現(xiàn)代、亂序處理器上的執(zhí)行,分析程序是如何在無限處理資源但是功能單元的執(zhí)行時(shí)間和發(fā)射時(shí)間與目標(biāo)處理器相符的機(jī)器上執(zhí)行的,收獲良多。為了精煉這個(gè)分析,我們還應(yīng)考慮諸如功能單元數(shù)量和類型這樣的資源約束。
        包含條件轉(zhuǎn)移或與存儲(chǔ)器系統(tǒng)復(fù)雜交互的程序,比我們首先考慮的簡單循環(huán)程序,更加難以分析和優(yōu)化?;静呗允鞘寡h(huán)更容易預(yù)測(cè),并試著減少存儲(chǔ)和加載操作之間的相互影響。
        當(dāng)處理大型程序時(shí),將我們的注意力集中在最耗時(shí)的部分變得很重要。代碼剖析程序和相關(guān)的工具能幫助我們系統(tǒng)地評(píng)價(jià)和改進(jìn)程序性能。
        Amdahl定律:其主要思想是當(dāng)我們加快系統(tǒng)一個(gè)部分的速度時(shí),對(duì)系統(tǒng)整體性能的影響依賴于這個(gè)部分有多重要和速度提高了多少。因此要想大幅度提高整個(gè)系統(tǒng)的速度,我們必須提高整個(gè)系統(tǒng)很大一部分的速度。Amdahl定律提供了對(duì)通過只改進(jìn)系統(tǒng)一部分所獲得的性能收益的一個(gè)簡單但是很有力的看法。收益既依賴于我們對(duì)這個(gè)部分的提高程度,也依賴于這個(gè)部分原來在整個(gè)事件中所占的比例。
      
      第6章 存儲(chǔ)器層次結(jié)構(gòu)
        存儲(chǔ)器系統(tǒng)是一個(gè)具有不同容量、成本和訪問時(shí)間的存儲(chǔ)設(shè)備的層次結(jié)構(gòu)??拷麮PU的小的、快速的高速緩存存儲(chǔ)器作為存儲(chǔ)在相對(duì)慢速的主存儲(chǔ)器中數(shù)據(jù)和指令子集的緩沖區(qū)域。主存暫時(shí)存放在較大的慢速磁盤上的數(shù)據(jù),而這些磁盤又常常作為存儲(chǔ)在通過網(wǎng)絡(luò)連接的其他機(jī)器和磁盤或磁帶上的數(shù)據(jù)和緩沖區(qū)域。
        計(jì)算機(jī)系統(tǒng)中的一個(gè)基本而持久的思想:如果你理解了系統(tǒng)是如何將數(shù)據(jù)在存儲(chǔ)器層次結(jié)構(gòu)中上上下下移動(dòng)的,那么你可以編寫你的應(yīng)用程序,使得它們的數(shù)據(jù)項(xiàng)存儲(chǔ)在層次結(jié)構(gòu)中較高的地方,在那里CPU能更快地訪問到它們。這個(gè)思想圍繞著計(jì)算機(jī)程序的一個(gè)成為局部性(locality)的基本屬性。具有良好局部性的程序傾向于一次又一次地訪問相同的數(shù)據(jù)項(xiàng)集合,或是傾向于訪問臨近的數(shù)據(jù)項(xiàng)集合。具有良好局部性的程序比局部性差的程序更多地傾向于從存儲(chǔ)器層次結(jié)構(gòu)中較高層次處訪問數(shù)據(jù)項(xiàng)。因此運(yùn)行得更快。
        局部性通常有兩種形式:時(shí)間局部性(temporal locality)和空間局部性(spatial locality)。在一個(gè)具有良好時(shí)間局部性的程序中,被引用過一次的存儲(chǔ)器位置很可能在不遠(yuǎn)的將來再被多次引用。在一個(gè)具有良好空間局部性的程序中,如果一個(gè)存儲(chǔ)器位置被引用了一次,那么程序很可能在不遠(yuǎn)的將來引用附近的一個(gè)存儲(chǔ)器位置。
        
        理解存儲(chǔ)器層次結(jié)構(gòu)的本質(zhì)的程序員能夠利用這些知識(shí),編寫出更有效的程序,無論具體的存儲(chǔ)系統(tǒng)結(jié)構(gòu)是怎樣的,應(yīng)使用以下技術(shù):
        1)將你的注意力一種在內(nèi)部循環(huán)上,大部分計(jì)算機(jī)和存儲(chǔ)器訪問都發(fā)生在這里
        2)通過按照數(shù)據(jù)對(duì)象存儲(chǔ)在存儲(chǔ)器中的順序來讀數(shù)據(jù),從而使得你程序中的空間局部性最大
        3)一旦從存儲(chǔ)器中讀入了一個(gè)數(shù)據(jù)對(duì)象,就盡可能多地使用它,從而使得你程序中的時(shí)間局部性最大
        4)記住,不命中率只是確定你代碼性能的一個(gè)因素(雖然是重要的)。存儲(chǔ)器訪問數(shù)量也扮演著重要角色,有時(shí)需要在兩者之間做一下折中。
      
      
      第2部分 在系統(tǒng)上運(yùn)行程序
      
      第7章 鏈接
        鏈接(linking)就是將不同部分的代碼和數(shù)據(jù)收集和組合成為一個(gè)單一文件的過程,鏈接可以在編譯時(shí)由編譯器來完成,也可以在加載時(shí)和運(yùn)行時(shí)由動(dòng)態(tài)鏈接器來完成。鏈接器處理成為目標(biāo)文件的哦二進(jìn)制文件 ,它有3種不同的形式:可重定位的、可執(zhí)行的和共享的??芍囟ㄎ坏哪繕?biāo)文件由靜態(tài)鏈接器組合成一個(gè)可執(zhí)行的目標(biāo)文件,它可以加載到存儲(chǔ)器中并執(zhí)行。共享目標(biāo)文件(共享庫)是運(yùn)行時(shí)由動(dòng)態(tài)鏈接器鏈接和家在的,或者隱含地在調(diào)用程序被家在和開始執(zhí)行時(shí),或者根據(jù)需要在程序調(diào)用dlopen庫函數(shù)時(shí)。
        理解鏈接器對(duì)我們的作用:
        1)理解鏈接器將幫助你構(gòu)造大型程序
        2)理解鏈接器將幫助你避免一些危險(xiǎn)的錯(cuò)誤
        3)理解鏈接將幫助你理解語言的作用域規(guī)則是如何實(shí)現(xiàn)的
        4)理解鏈接將幫助你理解其他重要的系統(tǒng)概念
        5)理解鏈接將使你能夠開發(fā)共享庫
      
        鏈接器的兩個(gè)主要任務(wù)是符號(hào)解析和重定位。符號(hào)解析將目標(biāo)文件中的每個(gè)全局符號(hào)都綁定到一個(gè)唯一的定義,而重定位確定每個(gè)符號(hào)的最終存儲(chǔ)器地址,并修改對(duì)那個(gè)目標(biāo)的引用。
        靜態(tài)鏈接器是由像GCC這樣的編譯器調(diào)用的。它們將多個(gè)可重定位目標(biāo)文件組合成一個(gè)單獨(dú)的可執(zhí)行目標(biāo)文件。多個(gè)目標(biāo)文件可以定義相同的哦符號(hào),而鏈接器用來悄悄地解析這些多處定義的規(guī)則可能在用戶程序中的微妙錯(cuò)誤。
        多個(gè)目標(biāo)文件可以被鏈接到一個(gè)單獨(dú)的靜態(tài)庫中。鏈接器用庫來解析其他目標(biāo)模塊中的符號(hào)引用。許多鏈接器通過從左到右的順序掃描來解析符號(hào)引用,這是另一個(gè)引起迷惑的鏈接時(shí)錯(cuò)誤的來源。
        加載器將可執(zhí)行文件的內(nèi)容映射到存儲(chǔ)器,并運(yùn)行這個(gè)程序。鏈接器還可能生成部分鏈接的可執(zhí)行目標(biāo)文件,這樣的文件中有未解析的到定義在共享庫中的程序和數(shù)據(jù)引用。在加載時(shí),加載器將部分鏈接的可執(zhí)行文件映射到存儲(chǔ)器,然后調(diào)用動(dòng)態(tài)鏈接器,它通過加載共享庫和重定位程序中的引用來完成鏈接任務(wù)。
        被編譯為位置無關(guān)代碼的共享庫可以加載到任何地方,也可能在運(yùn)行時(shí)被多個(gè)進(jìn)程共享。為了加載、鏈接和訪問共享庫的函數(shù)和數(shù)據(jù),應(yīng)用程序還可以在運(yùn)行時(shí)使用動(dòng)態(tài)鏈接器。
      
      第8章 異??刂屏?br />     現(xiàn)代系統(tǒng)通過使控制流發(fā)生突變來對(duì)系統(tǒng)狀態(tài)的變化做出反應(yīng)(這些系統(tǒng)狀態(tài)不是被內(nèi)部程序變量捕獲的,而且也不一定要和程序執(zhí)行相關(guān)),這些突變稱之為ECF(Exceptional Control Flow,異??刂屏鳎CF發(fā)生在計(jì)算機(jī)系統(tǒng)的各個(gè)層次:硬件層、操作系統(tǒng)層、應(yīng)用層。理解ECF很重要,主要有以下4個(gè)原因:
        1)理解ECF將幫助你理解重要的系統(tǒng)概念
        2)理解ECF將幫助你理解應(yīng)用程序是如何與操作系統(tǒng)交互的
        3)理解ECF將幫助你編寫有趣的新應(yīng)用程序
        4)理解ECF將幫助你理解軟件異常如何工作
      
        在硬件層,異常是一種形式的異??刂屏?,他就是控制流中的突變,用來響應(yīng)處理器狀態(tài)中的某些變化,一部分是由硬件實(shí)現(xiàn)的,一部分是由操作系統(tǒng)實(shí)現(xiàn)的。在任何情況中,當(dāng)處理器檢測(cè)到有事件發(fā)生時(shí),它就會(huì)通過一張叫做異常表的跳轉(zhuǎn)表,進(jìn)行一個(gè)簡潔過程調(diào)用(異常0,到一個(gè)專門設(shè)計(jì)用來處理這類事件的操作系統(tǒng)子程序——異常處理程序。當(dāng)已成處理程序完成處理后,根據(jù)異常事件的類型,會(huì)發(fā)生以下3種情況中的1種:
        1)處理程序?qū)⒖刂品祷亟o當(dāng)前指令I(lǐng)curr(當(dāng)事件發(fā)生時(shí)正在執(zhí)行的指令,fault)
        2)處理程序?qū)⒎祷亟oInext(如果沒有發(fā)生異常將會(huì)執(zhí)行的下一條指令,interrupt、trap)
        3)處理程序終止被中斷的程序(abort)
      
        有四種不同類型的異常:中斷、故障、終止和陷阱。當(dāng)一個(gè)外部的I/O設(shè)備(定時(shí)器芯片或磁盤控制器),設(shè)置了處理器芯片上的中斷管腳時(shí),(對(duì)于任意指令)中斷會(huì)異步發(fā)生??刂品祷氐街袛嘀噶畹南乱粭l指令。執(zhí)行一條指令可能導(dǎo)致故障和終止的發(fā)生。故障處理程序會(huì)重新開始故障指令,而終止處理程序從不將控制返回給被中斷的流。最后,陷阱就像是用來實(shí)現(xiàn)系統(tǒng)調(diào)用的函數(shù)調(diào)用,系統(tǒng)調(diào)用提供給應(yīng)用到操作系統(tǒng)代碼的受控入口點(diǎn)。
      
        在操作系統(tǒng)層,內(nèi)核提供關(guān)于一個(gè)進(jìn)程的基礎(chǔ)性概念。一個(gè)進(jìn)程提供給應(yīng)用的2個(gè)重要的抽象:
        1)邏輯控制流(它提供給每個(gè)程序一個(gè)假象,好像它是在獨(dú)占地使用處理器)
        2)私有地址空間(它提供給每個(gè)程序一個(gè)假象,好像它是在獨(dú)占地使用主存)
        在操作系統(tǒng)和應(yīng)用之間的接口處,應(yīng)用可以創(chuàng)建子進(jìn)程,等待它們的字進(jìn)程暫?;蛘呓K止,運(yùn)行新的程序,并捕獲來自其他進(jìn)程的信號(hào)。信號(hào)處理的語義是微妙的,并且隨系統(tǒng)不同而不同。
      
        一個(gè)信號(hào)(signal)就是一條消息,它通知進(jìn)程一個(gè)某種類型的事件已經(jīng)在系統(tǒng)中發(fā)生了。每種信號(hào)類型都對(duì)應(yīng)于某個(gè)類型的系統(tǒng)事件。低層的硬件異常是由內(nèi)核異常處理程序處理的,對(duì)用戶進(jìn)程而言通常是不可見的。信號(hào)提供了一種機(jī)制向用戶進(jìn)程通知這些異常發(fā)生。傳送一個(gè)信號(hào)到目的進(jìn)程是通過發(fā)送信號(hào)和接收信號(hào)兩個(gè)不同步驟組成的,而一個(gè)待處理信號(hào)(只發(fā)出而沒有被接收,pending signal)最多只能被接受一次。
        當(dāng)一個(gè)程序要捕獲多個(gè)信號(hào)時(shí),會(huì)發(fā)生待處理信號(hào)被阻塞;待處理信號(hào)不會(huì)排隊(duì)等待和系統(tǒng)調(diào)用可以被中斷等問題。
        
        而在應(yīng)用層,C程序可以使用非本地跳轉(zhuǎn)來規(guī)避正常的調(diào)用/返回棧規(guī)則,并且直接從一個(gè)函數(shù)轉(zhuǎn)移到另一個(gè)函數(shù)。
      
      第9章 測(cè)量程序執(zhí)行時(shí)間
        計(jì)算機(jī)用來記錄時(shí)間流逝主要有2種基本機(jī)制:
        1)基于低頻率計(jì)時(shí)器(timer),它會(huì)周期性中斷處理器。它發(fā)生的頻率似乎很快,但是從微觀的角度來看卻很慢。
        2)基于計(jì)數(shù)器(counter),每個(gè)時(shí)鐘周期計(jì)數(shù)器會(huì)加1。在負(fù)載很重的系統(tǒng)上誤差會(huì)非常大。
        由于上下文切換引起的計(jì)時(shí)變化會(huì)非常大,因此必須消除。而兩種方法都各有缺陷,所以理解在一個(gè)特殊的的系統(tǒng)上能夠獲得的準(zhǔn)確度是很重要的。
      
        計(jì)算機(jī)是在兩個(gè)完全不同的時(shí)間尺度(time scale)上工作的。在微觀級(jí)別,它們以每個(gè)時(shí)鐘周期(1ns~10ns)一條或多條指令的速度執(zhí)行指令。在宏觀級(jí)別上,處理器必須響應(yīng)外部事件(1ms)
        從一個(gè)進(jìn)程切換到另一個(gè)進(jìn)程需要幾千個(gè)時(shí)鐘周期(若干ms)來保存當(dāng)前進(jìn)程的狀態(tài),并且為下一個(gè)進(jìn)程準(zhǔn)備好狀態(tài)。
      
        高速緩存和轉(zhuǎn)移預(yù)測(cè)的哦影響可以導(dǎo)致執(zhí)行代碼的某個(gè)片段所需要的時(shí)間每次都不同。通過事先運(yùn)行某些將高速緩存設(shè)置為可預(yù)測(cè)狀態(tài)的代碼,我們可以部分地控制引起這種變化的因素,但是在有上下文切換發(fā)生時(shí),這些常識(shí)就沒有用了。因此,我們必須進(jìn)行多次測(cè)量,分析結(jié)果,以確定真實(shí)的執(zhí)行時(shí)間。幸運(yùn)的是,所有引起變化的因素的效果都是增加執(zhí)行時(shí)間,因此秩序分析確定測(cè)出的時(shí)間的最小值是否是一個(gè)準(zhǔn)確的測(cè)量值。
      
        設(shè)計(jì)一種準(zhǔn)確計(jì)時(shí)方法(K次最優(yōu)計(jì)時(shí)方法),需要注意到的一些重要經(jīng)驗(yàn):
        1)每個(gè)系統(tǒng)不都是不同的,不同的實(shí)現(xiàn)細(xì)節(jié)以及精確度可以達(dá)到多少都有很大的影響
        2)試驗(yàn)可以是非常有啟迪性的
        3)在負(fù)載很重的系統(tǒng)上獲得準(zhǔn)確的計(jì)時(shí)特別困難
        4)誓言建立必須控制一些造成性能變換的因素
      
      第10章 虛擬存儲(chǔ)器
        虛擬存儲(chǔ)器(VM)是硬件異常、硬件地址翻譯、主存、磁盤文件和內(nèi)核軟件的完美交互。它為每個(gè)進(jìn)程提供了一個(gè)大的、一致的、私有地址空間。鑒于虛擬存儲(chǔ)器是重要的、強(qiáng)大的和危險(xiǎn)的,作為程序要需要很好的理解它。
        虛擬存儲(chǔ)器是對(duì)主存的一個(gè)抽象。支持虛擬存儲(chǔ)器的處理器通過使用一種叫做虛擬村支的漸漸形式來引用主存。處理器產(chǎn)生一個(gè)虛擬地址,在被發(fā)送到主存之前,這個(gè)地址被翻譯成一個(gè)物理地址。從虛擬地址空間到物理地址空間的地址翻譯要求硬件和軟件的緊密合作。專門的硬件通過使用頁表來翻譯虛擬地址,而頁表的內(nèi)容是由操作系統(tǒng)提供的。
        虛擬存儲(chǔ)器提供3個(gè)重要的功能:
        1)它在主存中自動(dòng)緩存最近使用的存放磁盤上的虛擬地址空間的內(nèi)容。虛擬存儲(chǔ)器緩存中的塊叫做頁。對(duì)磁盤上的頁引用會(huì)觸發(fā)卻也,卻也將控制轉(zhuǎn)移到操作系統(tǒng)中的一個(gè)缺頁處理程序。卻也處理程序?qū)㈨撁鎻拇疟P拷貝到主存緩存,如果必要,將寫回被驅(qū)逐的頁。
        2)虛擬存儲(chǔ)器簡化了存儲(chǔ)器管理,進(jìn)而又簡化了鏈接、在進(jìn)程間共享數(shù)據(jù)、進(jìn)程的存儲(chǔ)器分配,以及程序加載。
        3)虛擬存儲(chǔ)器通過在每條頁表?xiàng)l目中加入保護(hù)位,從而簡化了存儲(chǔ)器保護(hù)。
      
        地址翻譯的過程必須和系統(tǒng)中任意硬件緩存的操作集成在一起。大多數(shù)頁表天目位于L1高速緩存中,但是一個(gè)稱為TLB的頁表?xiàng)l目在芯片上的高速緩存,通常會(huì)消除訪問在L1上的頁表?xiàng)l目的開銷。
        現(xiàn)代系統(tǒng)通過將虛擬存儲(chǔ)器組塊(chunk)和磁盤上的文件組塊關(guān)聯(lián)起來,來初始化虛擬存儲(chǔ)器組塊,這個(gè)過程稱為存儲(chǔ)器映射。存儲(chǔ)器映射為共享數(shù)據(jù)、創(chuàng)建新的額進(jìn)程以及加載程序,提供了一種高效的機(jī)制。應(yīng)用可以使用mmap函數(shù)來手工地創(chuàng)建和刪除虛擬地址空間的區(qū)域。然而,大多數(shù)程序依賴于動(dòng)態(tài)存儲(chǔ)器,例如malloc,它管理虛擬地址空間區(qū)域內(nèi)稱為堆的區(qū)域。動(dòng)態(tài)存儲(chǔ)器分配器是一個(gè)有系統(tǒng)級(jí)感覺的應(yīng)用級(jí)程序,它直接操作存儲(chǔ)器,而無需類型系統(tǒng)的很多幫助。分配器有兩種類型:顯式分配器要求應(yīng)用顯式地釋放它們的存儲(chǔ)器塊;隱式分配器(垃圾收集器)自動(dòng)釋放任何無用的和不可達(dá)的塊。
      
        動(dòng)態(tài)存儲(chǔ)器分配器的實(shí)現(xiàn)要求:處理任意請(qǐng)求序列、立即響應(yīng)請(qǐng)求、只是用堆、對(duì)齊塊、不修改已分配的塊。實(shí)現(xiàn)目標(biāo)為:最大化吞吐量、最大化存儲(chǔ)器利用率。
        有關(guān)虛擬存儲(chǔ)器有2個(gè)關(guān)鍵的經(jīng)驗(yàn)教訓(xùn):
        1)即使VM是由系統(tǒng)自動(dòng)提供的,它也是一種有限的存儲(chǔ)器資源,應(yīng)用程序必須精明地管理它
        2)與存儲(chǔ)器有關(guān)的錯(cuò)誤很討厭,在C程序中很容易犯與存儲(chǔ)器有關(guān)的錯(cuò)誤(所以有Java和C#等類似語言的出現(xiàn))
      
        對(duì)于C程序員來說,管理和使用虛擬存儲(chǔ)器是一件困難和容易出錯(cuò)的任務(wù)。常見的錯(cuò)誤事例包括:間接引用壞指針,讀取未初始化的存儲(chǔ)器,允許棧緩沖區(qū)溢出,假設(shè)指針和它們指向的對(duì)象大小相同,引用指針而不是它所指向的對(duì)象,誤解指針運(yùn)算,引用不存在的變量,以及引起存儲(chǔ)器泄漏等。
      
      
      第3部分 程序間的交互和通信
      
      第11章 系統(tǒng)級(jí)I/O
        輸入/輸出(I/O)是在主存(main memory)和外部設(shè)備(磁盤驅(qū)動(dòng)器、中斷和網(wǎng)絡(luò))之間拷貝數(shù)據(jù)的過程,輸入操作是從I/O設(shè)備拷貝數(shù)據(jù)到主存,而輸出操作是從主存拷貝數(shù)據(jù)到I/O設(shè)備。由于了解I/O能幫助你理解其他的系統(tǒng)概念;以及很多時(shí)候你不能使用高級(jí)I/O函數(shù),除了Unix I/O別無選擇,所以學(xué)習(xí)I/O非常重要。
      
       一個(gè)Unix文件就是一個(gè)m字節(jié)的序列(b(0)b(1),...,b(k),...,b(m-1))。所有的I/O設(shè)備都被模型化為文件,而所有的輸入和數(shù)據(jù)除都被當(dāng)作對(duì)相應(yīng)文件的讀和寫來執(zhí)行。這種將設(shè)備優(yōu)雅地映射為文件的方式,允許Unix內(nèi)核引出一個(gè)簡單的、低級(jí)的應(yīng)用接口,成為Unix I/O,這使得所有的輸入輸出都能以一種統(tǒng)一且一致的方式來執(zhí)行。也就是說,打開文件、改變文件位置、讀寫文件、關(guān)閉文件等實(shí)際上是通過對(duì)特定文件的讀和寫的執(zhí)行來實(shí)現(xiàn)的。
      
       Unix提供了少量系統(tǒng)級(jí)函數(shù),他們?cè)试S應(yīng)用程序打開、關(guān)閉、讀和寫文件,提取文件的元數(shù)據(jù),以及執(zhí)行I/O重定向。Unix的讀和寫操作會(huì)出現(xiàn)不足值(short counts),應(yīng)用程序必須能正確地預(yù)計(jì)和處理這種情況。應(yīng)用程序不直接調(diào)用Unix I/O函數(shù),而應(yīng)該使用Rio(Robust I/O)包,Rio包通過反復(fù)執(zhí)行讀寫操作,知道傳送完所有的請(qǐng)求數(shù)據(jù),自動(dòng)處理不足值。
      
       Unix內(nèi)核使用三種相關(guān)的數(shù)據(jù)結(jié)構(gòu)來表示打開的文件。描述符表中的表項(xiàng)指向打開文件表中的表項(xiàng),而打開文件表中的表項(xiàng)又指向v-node表中的表項(xiàng)。每個(gè)進(jìn)程都有它自己單獨(dú)的描述符表,而所有的進(jìn)程共享同一打開文件表和v-node表。理解這些結(jié)構(gòu)的一般構(gòu)成就能使我們清楚地理解文件共享和I/O重定向。
      
       標(biāo)準(zhǔn)I/O庫是基于Unix I/O實(shí)現(xiàn)的,并提供了一組強(qiáng)大的高級(jí)I/O例程。對(duì)于大多數(shù)應(yīng)用程序而言,標(biāo)準(zhǔn)I/O更簡單,是優(yōu)于Unix I/O的選擇。然而,因?yàn)閷?duì)標(biāo)準(zhǔn)I/O和網(wǎng)絡(luò)文件的一些星湖不兼容的限制,Unix I/O比之標(biāo)準(zhǔn)I/O更該適用于網(wǎng)絡(luò)應(yīng)用程序。
      第12章 網(wǎng)絡(luò)編程
       所有的網(wǎng)絡(luò)應(yīng)用都是有著相似的整體邏輯結(jié)構(gòu),并且依賴相同的編程接口,基于相同的編程模型——客戶端-服務(wù)器模型。服務(wù)器管理資源,以某種方式操作資源,為它的客戶端提供服務(wù)??蛻舳撕头?wù)器通過計(jì)算機(jī)網(wǎng)絡(luò)來通信,而對(duì)于主機(jī)而言,網(wǎng)絡(luò)就是一種I/O設(shè)備。不同的主機(jī)通過協(xié)議( 目前使用TCP/IP協(xié)議族)來完成網(wǎng)絡(luò)數(shù)據(jù)的傳遞,從而達(dá)到兼容不同的物理網(wǎng)絡(luò)和物理主機(jī)。這種協(xié)議必須提供以下兩種基本能力:
       1)命名方法。不同局域網(wǎng)技術(shù)有不同和不兼容的方式來為主機(jī)分配地址,協(xié)議通過定義一種一致的主機(jī)地址格式,消除了這些差異。每天主機(jī)會(huì)被分配至少一個(gè)這種internet地址,這個(gè)地址唯一地標(biāo)識(shí)了它。
       2)傳送機(jī)制。在電纜上編碼位和將這些位封裝成幀方面,不同的網(wǎng)絡(luò)互聯(lián)技術(shù)有不同的和不兼容的方式。協(xié)議通過定義一種把數(shù)據(jù)位捆扎成不連續(xù)的組塊(chunk)——也就是包(packet)——的統(tǒng)一方式,從而消除了這些差異。一個(gè)包是由包頭(header)和有效載荷(payload)組成的,其中包頭包括包的大小以及源主機(jī)和目的主機(jī)的地址,有效載荷包括從源主機(jī)發(fā)出的數(shù)據(jù)位。
       因特網(wǎng)客戶端和服務(wù)器通過在連接(connection)上發(fā)送和接受字節(jié)流來通信。從連接一對(duì)進(jìn)程的意義上而言,連接是點(diǎn)對(duì)點(diǎn)(point-to-point)的;從數(shù)據(jù)可以同時(shí)雙向流動(dòng)的角度來說,它是全雙工(full-duplex)的。并且從由源進(jìn)程發(fā)出的字節(jié)流最終被目的進(jìn)程以及它發(fā)出的順序收到它的角度來說,它也是可靠(reliable)的。
       套接字(socket)是連接的端點(diǎn)(end-point)。對(duì)于應(yīng)用程序來說,連接是以文件描述符的形式出現(xiàn)的。每個(gè)套接字都有相應(yīng)的套接字地址(socket address),是由一個(gè)因特網(wǎng)地址和一個(gè)16位的整數(shù)端口組成的,用“地址:端口”來表示。當(dāng)客戶端發(fā)起一個(gè)連接請(qǐng)求事,客戶端套接字地址中的端口是由內(nèi)核自動(dòng)分配的,成為臨時(shí)端口(ephemeral port)。這里要注意的是父親武器套接字地址中的端口通常是某個(gè)知名的端口(well-known port),是和服務(wù)對(duì)應(yīng)的(如web-80、mail-25,、ftp-21)。套接字接口(socket interface)是一組用來結(jié)合Unix I/O函數(shù)創(chuàng)建網(wǎng)絡(luò)應(yīng)用的函數(shù)。包括Unix變種、Win和Mac等現(xiàn)代系統(tǒng)都實(shí)現(xiàn)了它。客戶端和服務(wù)端使用套接字借口提供的打開可關(guān)閉套接字描述符的函數(shù),通過讀寫這些描述符來實(shí)現(xiàn)彼此間的通信。
      
       Web服務(wù)器使用HTTP協(xié)議和它們的客戶端(或者Browser)彼此通信。瀏覽器向服務(wù)器請(qǐng)求靜態(tài)或者動(dòng)態(tài)的呃內(nèi)容。對(duì)靜態(tài)的內(nèi)容請(qǐng)求是通過服務(wù)器磁盤取得文件并把它返回給客戶端來服務(wù)的。對(duì)動(dòng)態(tài)內(nèi)容的請(qǐng)求是通過在服務(wù)器上的一個(gè)子進(jìn)程的上下文運(yùn)行一個(gè)程序并將它的輸出返回給客戶媏來服務(wù)的。
       CGI(Common Gateway Interface)標(biāo)準(zhǔn)提供了一組規(guī)則,主要實(shí)現(xiàn)以下3個(gè)功能:
       1)管理客戶端將程序參數(shù)傳遞給服務(wù)器
       2)服務(wù)器將這些參數(shù)以及其他信息傳遞給子進(jìn)程
       3)子進(jìn)程將它的輸出發(fā)送回客戶端。
      
       HTTP格式:
       1)請(qǐng)求(request):<method><uri><version>
       2)響應(yīng)(response):<version><status code><status message>
      第13章 并發(fā)編程
        如果邏輯控制流在時(shí)間上重疊,那么它們就是并發(fā)的(concurrent),這種現(xiàn)象一般稱作并發(fā)性(concurrency),出現(xiàn)在計(jì)算機(jī)系統(tǒng)的許多不同層面中,在內(nèi)核里并發(fā)層是必須的,而在應(yīng)用層,并發(fā)可以作為程序設(shè)計(jì)上的一個(gè)有效提高性能的方法,主要體現(xiàn)在以下5個(gè)方面:
       1)在多處理器上進(jìn)行并行計(jì)算
       2)訪問慢速I/O設(shè)備
       3)與人交互
       4)通過推遲工作以減少執(zhí)行時(shí)間
       5)服務(wù)多個(gè)網(wǎng)絡(luò)客戶端
      
       使用應(yīng)用級(jí)并發(fā)的應(yīng)用程序成為并發(fā)程序(concurrent program)。現(xiàn)代操作系統(tǒng)提供了3種基本的構(gòu)造并發(fā)程序的方法:進(jìn)程、I/O多路復(fù)用和線程。進(jìn)程是由內(nèi)核自動(dòng)調(diào)度的,而且因?yàn)樗鼈冇懈髯元?dú)立的虛擬地址空間,所以要實(shí)現(xiàn)共享數(shù)據(jù),它們需要顯式的IPC機(jī)制(進(jìn)程間通信interprocess communication)。事件驅(qū)動(dòng)程序創(chuàng)建它們自己的并發(fā)邏輯流,這些邏輯流被模型化為狀態(tài)機(jī),用I/O多路復(fù)用來顯式地調(diào)度這些流。因?yàn)槌绦蜻\(yùn)行在一個(gè)單一進(jìn)程中,所以在流之間共享數(shù)據(jù)速度很快而且很容易。線程是這些方法的綜合?;谶M(jìn)程的流一樣,線程是由內(nèi)核自動(dòng)調(diào)度的。同基于I/O的多路復(fù)用的留一樣,線程是運(yùn)行在一個(gè)單一進(jìn)程的上下文中的,因此可以快速而方便地共享數(shù)據(jù)。
       無論哪種并發(fā)機(jī)制,同步對(duì)共享數(shù)據(jù)的并發(fā)訪問都是一個(gè)困難的問題。提出對(duì)信號(hào)量P和V操作就是為了幫助解決這個(gè)問題。信號(hào)量操作可以用來提供對(duì)共享數(shù)據(jù)的互斥訪問,也對(duì)諸如生產(chǎn)者-消費(fèi)者程序中共享緩沖區(qū)這樣的資源訪問進(jìn)行調(diào)度。
      
       并發(fā)性也引入了其他一些困難的問題。被線程調(diào)用的函數(shù)必須具有一種稱為線程安全的屬性。我們定義了4類線程不安全函數(shù),以及一些將它們變?yōu)榫€程安全的建議。可重入函數(shù)(reentrant function)是線程安全函數(shù)的一個(gè)真子集 ,它不訪問任何共享數(shù)據(jù)??芍厝牒瘮?shù)通常比不可重入函數(shù)更為有效,因?yàn)樗鼈儾恍枰魏瓮皆Z。競爭和死鎖是并發(fā)程序中出現(xiàn)的另一些困難的問題。當(dāng)程序員錯(cuò)誤地假設(shè)邏輯流該如何調(diào)度時(shí),就會(huì)發(fā)生競爭。當(dāng)一個(gè)流等待一個(gè)永遠(yuǎn)不會(huì)發(fā)生的事件時(shí),就會(huì)產(chǎn)生死鎖。
      
       4類線程不安全的函數(shù):
       1)不保護(hù)共享變量的函數(shù)
       2)保持跨越多個(gè)調(diào)用的狀態(tài)函數(shù)
       3)返回指向靜態(tài)變量的指針的函數(shù)
       4)調(diào)用線程不安全函數(shù)的函數(shù)
      
      
  •      回顧一下這本書,總體感覺是匯編/計(jì)算機(jī)系統(tǒng)結(jié)構(gòu)/虛擬內(nèi)存/鏈接/unix高級(jí)編程/unix進(jìn)程間通信這些范圍的知識(shí)。unix高級(jí)編程/unix進(jìn)程間通信可以參看W. Richard Stevens的,鏈接可以參看《linkers and loaders》的。但是匯編/計(jì)算機(jī)系統(tǒng)結(jié)構(gòu)/虛擬內(nèi)存,但卻一時(shí)找不到比這本書寫得更好的書了,這些概念在作者的循序漸進(jìn)、恰當(dāng)?shù)膱D例下,好像一切都別有洞天。也許是站的高度不同,視角不同吧。
      
      1. 匯編,寫幾句C語句,再反匯編看一下,從C的角度學(xué)會(huì)看匯編,匯編的角度看C,從而逐步學(xué)會(huì)適當(dāng)時(shí)候調(diào)整C代碼,是優(yōu)化代碼的基礎(chǔ)。并用緩沖區(qū)溢出的案例讓你進(jìn)一步理解堆棧和匯編。
      2. 高速緩存:直接映射、組相聯(lián)、全相聯(lián),介紹得簡明扼要,通過memory mountain,讓你了解L1/L2緩存在不同時(shí)候的工作機(jī)制和由此產(chǎn)生的性能問題。
      3. 優(yōu)化程序性能,涉及了方方面面,淺顯易懂,每次都有簡單的例子供你參考。
      4. 虛擬存儲(chǔ)器,循序漸進(jìn)的方法介紹PA、VA、PTE、尋址的概念,并簡化模型,手工計(jì)算VA、TLB、L1緩存,PA的相互轉(zhuǎn)化,通過實(shí)踐計(jì)算加深了對(duì)虛擬存儲(chǔ)器的理解。沒有幾頁,就把相互關(guān)系說得一清二楚了。
      5. 對(duì)malloc函數(shù),也是通過簡單例子展現(xiàn),卻讓你理解了實(shí)質(zhì)。
      
       總結(jié)來說,對(duì)很多人來說,可能沒有什么新的知識(shí),或者懵懵懂懂也知道部分,但知識(shí)點(diǎn)相互孤立,形成信息的孤島,但這一本書,卻把知識(shí)點(diǎn)高度統(tǒng)一、融合了。僅僅是一本,以系統(tǒng)的、全新的認(rèn)知角度,理解匯編、TBL、緩存、虛擬存儲(chǔ)器的緊密關(guān)系,并能讓你應(yīng)用到實(shí)際程序中,買這本書,賺了!但等等,其實(shí)如果你不是做服務(wù)器端程序,沒有大量數(shù)據(jù)處理,不做系統(tǒng)編程...這些其實(shí)也沒有啥大的作用,無非是讓你更崇拜洋人而已...神馬都是浮云...
      
  •   贊毅力!
  •   我也會(huì)讀完的。
  •   加油!相信你不會(huì)后悔的。
  •   開始讀第二章了 :)
  •   我覺得這個(gè)書給非計(jì)算機(jī)專業(yè)的看看還行,計(jì)算機(jī)專業(yè)科班出身的就不用看了吧。這里面哪個(gè)東西沒學(xué)過呢?而且課堂上講的也比這深
  •   忽略了書里的 lab,真是罪過。其實(shí)這本書不算太厚(很多章節(jié)的內(nèi)容都是獨(dú)立成篇的,其中最厚的是第四章講 CPU 設(shè)計(jì)的部分),如果要深入學(xué)習(xí)的話,千萬別錯(cuò)過每章最后提及的參考文獻(xiàn)
  •   給跪了。。。
  •   五個(gè)Lab全部做完,感覺自己老了幾歲。我最喜歡的是malloc,free那個(gè)實(shí)驗(yàn),因?yàn)榛ㄈズ芏鄷r(shí)間理解框架代碼,完成以后相當(dāng)有成就感...這門課確實(shí)非常贊!順便說一下,最后一節(jié)好像預(yù)示著他們還要開一門操作系統(tǒng)的課,感興趣的可以關(guān)注一下。有種華盛頓大學(xué)打算把他們整個(gè)CS本科搬到Coursera的感覺...
  •   再多說一句,http://www.cs.washington.edu/education/courses/cse351/ 這是他們學(xué)校這門課的主頁??梢钥吹紺oursera版和他們學(xué)校線下版的內(nèi)容基本一致(主要是五個(gè)Lab),并沒有因?yàn)槭蔷W(wǎng)絡(luò)公開課而在難度和內(nèi)容上縮水
  •   贊樓上
  •   UW是良心啊,他們的Programming Language被很多人稱為Coursera最好的課程
  •   是的,我發(fā)郵件問過Dan Grossman,他說預(yù)計(jì)9月底可能會(huì)再開一輪,絕對(duì)跟。他算是一個(gè)在網(wǎng)絡(luò)上受到英雄般待遇的講師,基本上沒看到過差評(píng)
  •   coursera一直都在看,從來沒系統(tǒng)的學(xué)完過Orz
  •   這課什么時(shí)候再開一輪啊 現(xiàn)在看不了lecture video
  •   現(xiàn)在有地方可以看到這門課嗎
  •   我把這門課的課程視頻上傳了,拜托課程圖譜幫我整理了一下,地址:http://blog.coursegraph.com/%E5%85%AC%E5%BC%80%E8%AF%BE%E5%8F%AF%E4%B8%8B%E8%BD%BD%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB
  •   留個(gè)爪印~~
  •   有點(diǎn)巧,我正在搜這門課有人下好的視頻,就看到夸贊它的言語.更關(guān)鍵的是回復(fù)中還夾了一個(gè)下載資源! 太開心了!
  •   原來有對(duì)應(yīng)的 Mooc 啊,太好了!
  •   mark一下。看看。
  •   最近想買這本書的。。
  •   @theonejhdx 買這本書要節(jié)衣縮食半個(gè)月才行.
  •   為了應(yīng)試讀這本書真是悲哀
  •   有完美電子版,為什么還要買這本書?
  •   @timewei 各取所需, 其實(shí)很多中小的招聘單位也不知道自己技術(shù)部門需要什么技術(shù),會(huì)從一些經(jīng)典的參考書上找題目.
    @qysh123 作為手冊(cè)一樣的書還是放在手邊翻翻比較好.
  •   那更是中小企業(yè)的悲哀。不懂還要硬上。只能耽誤別人,耽誤自己。
  •   多謝總結(jié)。
  •   mark...
    CSAPP對(duì)于非科班出身的程序員,是一本非常不錯(cuò)的計(jì)算機(jī)專業(yè)的導(dǎo)航書籍.
  •   同意!我也是時(shí)候重讀一遍了。
 

250萬本中文圖書簡介、評(píng)論、評(píng)分,PDF格式免費(fèi)下載。 第一圖書網(wǎng) 手機(jī)版

京ICP備13047387號(hào)-7