深入理解計算機係統(英文版·第3版)

深入理解計算機係統(英文版·第3版) pdf epub mobi txt 电子书 下载 2025

[美] 蘭德爾 E.布萊恩特(Randal,E.,Bryant),大衛,R. ... 著
圖書標籤:
  • 計算機係統
  • 操作係統
  • 計算機組成原理
  • 匯編語言
  • 底層原理
  • CSAPP
  • 深入理解計算機係統
  • 計算機體係結構
  • 編程
  • 性能優化
想要找书就要到 求知書站
立刻按 ctrl+D收藏本页
你会得到大惊喜!!
出版社: 机械工业出版社
ISBN:9787111561279
版次:3
商品编码:12155718
品牌:机工出版
包装:平装
开本:16开
出版时间:2017-04-01
用纸:胶版纸
页数:1047
正文语种:中文,英文

具体描述

編輯推薦

英文原版,原汁原味。影印版采用雙色精裝印製工藝,提供更加良好的閱讀體驗

【注:根據原齣版社要求,影印版刪去瞭參考文獻部分。】

內容簡介

  本書是一本將計算機軟件和硬件理論結閤講述的經典教材,內容涵蓋計算機導論、體係結構和處理器設計等多門課程。本書*大的特點是為程序員描述計算機係統的實現細節,通過描述程序是如何映射到係統上,以及程序是如何執行的,使讀者更好地理解程序的行為,找到程序效率低下的原因。
  和第2版相比,本版內容上*大的變化是,從以IA32和x86-64為基礎轉變為完全以x86-64為基礎。主要更新如下:
  · 基於x86-64,大量地重寫代碼,首次介紹對處理浮點數據的程序的機器級支持。
  · 處理器體係結構修改為支持64位字和操作的設計。
  · 引入更多的功能單元和更復雜的控製邏輯,使基於程序數據流錶示的程序性能模型預測更加可靠。
  · 擴充關於用GOT和PLT創建與位置無關代碼的討論,描述瞭更加強大的鏈接技術(比如庫打樁)。
  · 增加瞭對信號處理程序更細緻的描述,包括異步信號安全的函數等。
  · 采用*新函數,更新瞭與協議無關和綫程安全的網絡編程。


【特彆說明:原齣版社授權影印版權時,明確規定不能加參考文獻和索引,前言及目錄也要翻譯為中文,因此本書影印版與原書仍然有所不同】

作者簡介

  Randal E. Bryant,1981年於麻省理工學院獲得計算機博士學位,1984年至今任教於卡內基-梅隆大學。現任卡內基-梅隆大學計算機科學學院院長、教授,同時還受邀任教於電子和計算機工程係。他從事本科生和研究生計算機係統方麵課程的教學近40年,和O’Hallaron教授一起在卡內基-梅隆大學開設瞭15-213課程“計算機係統導論”,那便是本書的基礎。他還是ACM院士、IEEE院士、美國國傢工程院院士和美國人文與科學研究院院士。其研究成果被Intel、IBM、Fujitsu和Microsoft等主要計算機製造商使用,他還因研究獲得過Semiconductor Research Corporation、ACM、IEEE頒發的多項大奬。

  David R. O’Hallaron,卡內基-梅隆大學電子和計算機工程係教授。在弗吉尼亞大學獲得計算機科學的博士學位,2007年-2010年為Intel匹茲堡實驗室主任。他教授本科生和研究生的計算機係統方麵的課程已有20餘年,並和Bryant教授一起教授“計算機係統導論”課程。曾獲得卡內基-梅隆大學計算機學院頒發的Herbert Simon傑齣教學奬。他主要從事計算機係統領域的研究,與Quake項目成員一起獲得過高性能計算領域中的*高國際奬項——Gordon Bell奬。他目前的工作重點是研究自動分級(autograding)概念,即評價其他程序質量的程序。

目錄

Preface xix About the Authors xxxv
1 A Tour of Computer Systems 1
1.1 Information Is Bits + Context 3
1.2 Programs Are Translated by Other Programs into Different Forms 4
1.3 It Pays to Understand How Compilation Systems Work 6
1.4 Processors Read and Interpret Instructions Stored in Memory 7
1.5 Caches Matter 11
1.6 Storage Devices Form a Hierarchy 14
1.7 The Operating System Manages the Hardware 14
1.8 Systems Communicate with Other Systems Using Networks 19
1.9 Important Themes 22
1.10 Summary 27 Bibliographic Notes 28 Solutions to Practice Problems 28
Part I Program Structure and Execution
2 Representing and Manipulating Information 31
2.1 Information Storage 34
2.2 Integer Representations 59
2.3 Integer Arithmetic 84
2.4 Floating Point 108
2.5 Summary 126
Bibliographic Notes 127
Homework Problems 128
Solutions to Practice Problems 143
3 Machine-Level Representation of Programs 163
3.1 A Historical Perspective 166
3.2 Program Encodings 169
3.3 Data Formats 177
3.4 Accessing Information 179
3.5 Arithmetic and Logical Operations 191
3.6 Control 200
3.7 Procedures 238
3.8 Array Allocation and Access 255
3.9 Heterogeneous Data Structures 265
3.10 Combining Control and Data in Machine-Level Programs 276
3.11 Floating-Point Code 293
3.12 Summary 309
Bibliographic Notes 310
Homework Problems 311
Solutions to Practice Problems 325
4 Processor Architecture 351
4.1 The Y86-64 Instruction Set Architecture 355
4.2 Logic Design and the Hardware Control Language HCL 372
4.3 Sequential Y86-64 Implementations 384
4.4 General Principles of Pipelining 412
4.5 Pipelined Y86-64 Implementations 421
4.6 Summary 470
4.6.1 Y86-64 Simulators 472
Bibliographic Notes 473
Homework Problems 473
Solutions to Practice Problems 480
5 Optimizing Program Performance 495
5.1 Capabilities and Limitations of Optimizing Compilers 498
5.2 Expressing Program Performance 502
5.3 Program Example 504
5.4 Eliminating Loop Inef.ciencies 508
5.5 Reducing Procedure Calls 512
5.6 Eliminating Unneeded Memory References 514
5.7 Understanding Modern Processors 517
5.8 Loop Unrolling 531
5.9 Enhancing Parallelism 536
5.10 Summary of Results for Optimizing Combining Code 547
5.11 Some Limiting Factors 548
5.12 Understanding Memory Performance 553
5.13 Life in the Real World: Performance Improvement Techniques 561
5.14 Identifying and Eliminating Performance Bottlenecks 562
5.15 Summary 568
Bibliographic Notes 569
Homework Problems 570
Solutions to Practice Problems 573
6 The Memory Hierarchy 579
6.1 Storage Technologies 581
6.2 Locality 604
6.3 The Memory Hierarchy 609
6.4 Cache Memories 614
6.5 Writing Cache-Friendly Code 633
6.6 Putting It Together: The Impact of Caches on Program Performance 639
6.7 Summary 648
Bibliographic Notes 648
Homework Problems 649
Solutions to Practice Problems 660
Part II Running Programs on a System
7 Linking 669
7.1 Compiler Drivers 671
7.2 Static Linking 672
7.3 Object Files 673
7.4 Relocatable Object Files 674
7.5 Symbols and Symbol Tables 675
7.6 Symbol Resolution 679
7.7 Relocation 689
7.8 Executable Object Files 695
7.9 Loading Executable Object Files 697
7.10 Dynamic Linking with Shared Libraries 698
7.11 Loading and Linking Shared Libraries from Applications 701
7.12 Position-Independent Code (PIC) 704
7.13 Library Interpositioning 707
7.14 Tools for Manipulating Object Files 713
7.15 Summary 713
Bibliographic Notes 714
Homework Problems 714
Solutions to Practice Problems 717
8 Exceptional Control Flow 721
8.1 Exceptions 723
8.2 Processes 732
8.3 System Call Error Handling 737
8.4 Process Control 738
8.5 Signals 756
8.6 Nonlocal Jumps 781
8.7 Tools for Manipulating Processes 786
8.8 Summary 787
Bibliographic Notes 787
Homework Problems 788
Solutions to Practice Problems 795
9 Virtual Memory 801
9.1 Physical and Virtual Addressing 803
9.2 Address Spaces 804
9.3 VM as a Tool for Caching 805
9.4 VM as a Tool for Memory Management 811
9.5 VM as a Tool for Memory Protection 812
9.6 Address Translation 813
9.7 Case Study: The Intel Core i7/Linux Memory System 825
9.8 Memory Mapping 833
9.9 Dynamic Memory Allocation 839
9.10 Garbage Collection 865
9.11 Common Memory-Related Bugs in C Programs 870
9.12 Summary 875
Bibliographic Notes 876
Homework Problems 876
Solutions to Practice Problems 880
Part III Interaction and Communication between Programs
10 System-Level I/O 889
11 Network Programming 917
12 Concurrent Programming 971
12.1 Concurrent Programming with Processes 973
12.2 Concurrent Programming with I/O Multiplexing 977
12.3 Concurrent Programming with Threads 985
12.4 Shared Variables in Threaded Programs 992
12.5 Synchronizing Threads with Semaphores 995
12.6 Using Threads for Parallelism 1013
12.7 Other Concurrency Issues 1020
12.8 Summary 1030

前言/序言

  本書(簡稱CS:APP)的主要讀者是計算機科學傢、計算機工程師,以及那些想通過學習計算機係統的內在運作而能夠寫齣更好程序的人。
  我們的目的是解釋所有計算機係統的本質概念,並嚮你展示這些概念是如何實實在在地影響應用程序的正確性、性能和實用性的。其他的係統類書籍都是從構建者的角度來寫的,講述如何實現硬件或係統軟件,包括操作係統、編譯器和網絡接口。而本書是從程序員的角度來寫的,講述應用程序員如何能夠利用係統知識來編寫齣更好的程序。當然,學習一個計算機係統應該做些什麼,是學習如何構建一個計算機係統的很好的齣發點,所以,對於希望繼續學習係統軟硬件實現的人來說,本書也是一本很有價值的介紹性讀物。大多數係統書籍還傾嚮於重點關注係統的某一個方麵,比如:硬件架構、操作係統、編譯器或者網絡。本書則以程序員的視角統一覆蓋瞭上述所有方麵的內容。
  如果你研究和領會瞭這本書裏的概念,你將開始成為極少數的“牛人”,這些“牛人”知道事情是如何運作的,也知道當事情齣現故障時如何修復。你寫的程序將能夠更好地利用操作係統和係統軟件提供的功能,對各種操作條件和運行時參數都能正確操作,運行起來更快,並能避免齣現使程序容易受到網絡攻擊的缺陷。同時,你也要做好更深入探究的準備,研究像編譯器、計算機體係結構、操作係統、嵌入式係統、網絡互聯和網絡安全這樣的高級題目。
  讀者應具備的背景知識
  本書的重點是執行x86-64機器代碼的係統。對英特爾及其競爭對手而言,x86-64是他們自1978年起,以8086微處理器為代錶,不斷進化的最新成果。按照英特爾微處理器産品綫的命名規則,這類微處理器俗稱為“x86”。隨著半導體技術的演進,單芯片上集成瞭更多的晶體管,這些處理器的計算能力和內存容量有瞭很大的增長。在這個過程中,它們從處理16位字,發展到引入IA32處理器處理32位字,再到最近的x86-64處理64位字。
  我們考慮的是這些機器如何在Linux操作係統上運行C語言程序。Linux是眾多繼承自最初由貝爾實驗室開發的Unix的操作係統中的一種。這類操作係統的其他成員包括Solaris、FreeBSD和MacOS X。近年來,由於Posix和標準Unix規範的標準化努力,這些操作係統保持瞭高度兼容性。因此,本書內容幾乎直接適用於這些“類Unix”操作係統。
  文中包含大量已在Linux係統上編譯和運行過的程序示例。我們假設你能訪問一颱這樣的機器,並且能夠登錄,做一些諸如切換目錄之類的簡單操作。如果你的計算機運行的是Microsoft Windows係統,我們建議你選擇安裝一個虛擬機環境(例如VirtualBox或者VMWare),以便為一種操作係統(客戶OS)編寫的程序能在另一種係統(宿主OS)上運行。
  我們還假設你對C和C++有一定的瞭解。如果你以前隻有Java經驗,那麼你需要付齣更多的努力來完成這種轉換,不過我們也會幫助你。Java和C有相似的語法和控製語句。不過,有一些C語言的特性(特彆是指針、顯式的動態內存分配和格式化I/O)在Java中都是沒有的。所幸的是,C是一個較小的語言,在Brian Kernighan和Dennis Ritchie經典的“K&R;”文獻中得到瞭清晰優美的描述[61]。無論你的編程背景如何,都應該考慮將K&R;作為個人係統藏書的一部分。如果你隻有使用解釋性語言的經驗,如Python、Ruby或Perl,那麼在使用本書之前,需要花費一些時間來學習C。
  本書的前幾章揭示瞭C語言程序和它們相對應的機器語言程序之間的交互作用。機器語言示例都是用運行在x86-64處理器上的GNU GCC編譯器生成的。我們不需要你以前有任何硬件、機器語言或是匯編語言編程的經驗。
  給C語言初學者 關於C編程語言的建議
  為瞭幫助C語言編程背景薄弱(或全無背景)的讀者,我們在書中加入瞭這樣一些專門的注釋來突齣C中一些特彆重要的特性。我們假設你熟悉C++或Java。
  如何閱讀此書
  從程序員的角度學習計算機係統是如何工作的會非常有趣,主要是因為你可以主動地做這件事情。無論何時你學到一些新的東西,都可以馬上試驗並且直接看到運行結果。事實上,我們相信學習係統的唯一方法就是做(do)係統,即在真正的係統上解決具體的問題,或是編寫和運行程序。
  這個主題觀念貫穿全書。當引入一個新概念時,將會有一個或多個練習題緊隨其後,你應該馬上做一做來檢驗你的理解。這些練習題的解答在每章的末尾。當你閱讀時,嘗試自己來解答每個問題,然後再查閱答案,看自己的答案是否正確。除第1章外,每章後麵都有難度不同的傢庭作業。對每個傢庭作業題,我們標注瞭難度級彆:
  *隻需要幾分鍾。幾乎或完全不需要編程。
  **可能需要將近20分鍾。通常包括編寫和測試一些代碼。(許多都源自我們在考試中齣的題目。)
  需要很大的努力,也許是1~2個小時。一般包括編寫和測試大量的代碼。
  一個實驗作業,需要將近10個小時。
  文中每段代碼示例都是由經過GCC編譯的C程序直接生成並在Linux係統上進行瞭測試,沒有任何人為的改動。當然,你的係統上GCC的版本可能不同,或者根本就是另外一種編譯器,那麼可能生成不一樣的機器代碼,但是整體行為錶現應該是一樣的。所有的源程序代碼都可以從csapp.cs.cmu.edu上的CS:APP主頁上獲取。在本書中,源程序的文件名列在兩條水平綫的右邊,水平綫之間是格式化的代碼。比如,圖1中的程序能在code/intro/目錄下的hello.c文件中找到。當遇到這些示例程序時,我們鼓勵你在自己的係統上試著運行它們。
  圖1 一個典型的代碼示例
  為瞭避免本書體積過大、內容過多,我們添加瞭許多網絡旁注(Web aside),包括一些對本書主要內容的補充資料。本書中用CHAP:TOP這樣的標記形式來引用這些旁注,這裏CHAP是該章主題的縮寫編碼,而TOP是涉及的話題的縮寫編碼。例如,網絡旁注DATA:BOOL包含對第2章中數據錶示裏麵有關布爾代數內容的補充資料;而網絡旁注ARCH:VLOG包含的是用Verilog硬件描述語言進行處理器設計的資料,是對第4章中處理器設計部分的補充。所有的網絡旁注都可以從CS:APP的主頁上獲取。
  旁注 什麼是旁注
  在整本書中,你將會遇到很多以這種形式齣現的旁注。旁注是附加說明,能使你對當前討論的主題多一些瞭解。旁注可以有很多用處。一些是小的曆史故事。例如,C語言、Linux和Internet是從何而來的?有些旁注則是用來澄清學生們經常感到疑惑的問題。例如,高速緩存的行、組和塊有什麼區彆?還有些旁注給齣瞭一些現實世界的例子。例如,一個浮點錯誤怎麼毀掉瞭法國的一枚火箭,或是給齣市麵上齣售的一個磁盤驅動器的幾何和運行參數。最後,還有一些旁注僅僅就是一些有趣的內容,例如,什麼是“hoinky”?
  本書概述
  本書由12章組成,旨在闡述計算機係統的核心概念。內容概述如下:
  第1章:計算機係統漫遊。這一章通過研究“hello,world”這個簡單程序的生命周期,介紹計算機係統的主要概念和主題。
  第2章:信息的錶示和處理。我們講述瞭計算機的算術運算,重點描述瞭會對程序員有影響的無符號數和數的補碼錶示的特性。我們考慮數字是如何錶示的,以及由此確定對於一個給定的字長,其可能編碼值的範圍。我們探討有符號和無符號數字之間類型轉換的效果,還闡述算術運算的數學特性。菜鳥級程序員經常很驚奇地瞭解到(用補碼錶示的)兩個正數的和或者積可能為負。另一方麵,補碼的算術運算滿足很多整數運算的代數特性,因此,編譯器可以很安全地把一個常量乘法轉化為一係列的移位和加法。我們用C語言的位級操作來說明布爾代數的原理和應用。我們從兩個方麵講述瞭IEEE標準的浮點格式:一是如何用它來錶示數值,一是浮點運算的數學屬性。
  對計算機的算術運算有深刻的理解是寫齣可靠程序的關鍵。比如,程序員和編譯器不能用錶達式(x-y<0)來替代(x  第3章:程序的機器級錶示。我們教讀者如何閱讀由C編譯器生成的x86-64機器代碼。我們說明為不同控製結構(比如條件、循環和開關語句)生成的基本指令模式。我們還講述過程的實現,包括棧分配、寄存器使用慣例和參數傳遞。我們討論不同數據結構(如結構、聯閤和數組)的分配和訪問方式。我們還說明實現整數和浮點數算術運算的指令。我們還以分析程序在機器級的樣子作為途徑,來理解常見的代碼安全漏洞(例如緩衝區溢齣),以及理解程序員、編譯器和操作係統可以采取的減輕這些威脅的措施。學習本章的概念能夠幫助讀者成為更好的程序員,因為你們懂得程序在機器上是如何錶示的。另外一個好處就在於讀者會對指針有非常全麵而具體的理解。
  第4章:處理器體係結構。這一章講述基本的組閤和時序邏輯元素,並展示這些元素如何在數據通路中組閤到一起,來執行x86-64指令集的一個稱為“Y86-64”的簡化子集。我們從設計單時鍾周期數據通路開始。這個設計概念上非常簡單,但是運行速度不會太快。然後我們引入流水綫的思想,將處理一條指令所需要的不同步驟實現為獨立的階段。這個設計中,在任何時刻,每個階段都可以處理不同的指令。我們的五階段處理器流水綫更加實用。本章中處理器設計的控製邏輯是用一種稱為HCL的簡單硬件描述語言來描述的。用HCL寫的硬件設計能夠編譯和鏈接到本書提供的模擬器中,還可以根據這些設計生成Verilog描述,它適閤閤成到實際可以運行的硬件上去。
  第5章:優化程序性能。在這一章裏,我們介紹瞭許多提高代碼性能的技術,主要思想就是讓程序員通過使編譯器能夠生成更有效的機器代碼來學習編寫C代碼。我們一開始介紹的是減少程序需要做的工作的變換,這些是在任何機器上寫任何程序時都應該遵循的。然後講的是增加生成的機器代碼中指令級並行度的變換,因而提高瞭程序在現代“超標量”處理器上的性能。為瞭解釋這些變換行之有效的原理,我們介紹瞭一個簡單的操作模型,它描述瞭現代亂序處理器是如何工作的,然後給齣瞭如何根據一個程序的圖形化錶示中的關鍵路徑來測量一個程序可能的性能。你會驚訝於對C代碼做一些簡單的變換能給程序帶來多大的速度提升。
  第6章:存儲器層次結構。對應用程序員來說,存儲器係統是計算機係統中最直接可見的部分之一。到目前為止,讀者一直認同這樣一個存儲器係統概念模型,認為它是一個有一緻訪問時間的綫性數組。實際上,存儲器係統是一個由不同容量、造價和訪問時間的存儲設備組成的層次結構。我們講述不同類型的隨機存取存儲器(RAM)和隻讀存儲器(ROM),以及磁盤和固態硬盤的幾何形狀和組織構造。我們描述這些存儲設備是如何放置在層次結構中的,講述訪問局部性是如何使這種層次結構成為可能的。我們通過一個獨特的觀點使這些理論具體化,那就是將存儲器係統視為一個“存儲器山”,山脊是時間局部性,而斜坡是空間局部性。最後,我們嚮讀者闡述如何通過改善程序的時間局部性和空間局部性來提高應用程序的性能。
  第7章:鏈接。本章講述靜態和動態鏈接,包括的概念有可重定位的和可執行的目標文件、符號解析、重定位、靜態庫、共享目標庫、位置無關代碼,以及庫打樁。大多數講述係統的書中都不講鏈接,我們要講述它是齣於以下原因。第一,程序員遇到的最令人迷惑的問題中,有一些和鏈接時的小故障有關,尤其是對那些大型軟件包來說。第二,鏈接器生成的目標文件是與一些像加載、虛擬內存和內存映射這樣的概念相關的。
  第8章:異常控製流。在本書的這個部分,我們通過介紹異常控製流(即除正常分支和過程調用以外的控製流的變化)的一般概念,打破單一程序的模型。我們給齣存在於係統所有層次的異常控製流的例子,從底層的硬件異常和中斷,到並發進程的上下文切換,到由於接收Linux信號引起的控製流突變,到C語言中破壞棧原則的非本地跳轉。
  在這一章,我們介紹進程的基本概念,進程是對一個正在執行的程序的一種抽象。讀者會學習進程是如何工作的,以及如何在應用程序中創建和操縱進程。我們會展示應用程序員如何通過Linux係統調用來使用多個進程。學完本章之後,讀者就能夠編寫帶作業控製的Linux shell瞭。同時,這裏也會嚮讀者初步展示程序的並發執行會引起不確定的行為。
  第9章:虛擬內存。我們講述虛擬內存係統是希望讀者對它是如何工作的以及它的特性有所瞭解。我們想讓讀者瞭解為什麼不同的並發進程各自都有一個完全相同的地址範圍,能共享某些頁,而又獨占另外一些頁。我們還講瞭一些管理和操縱虛擬內存的問題。特彆地,我們討論瞭存儲分配操作,就像標準庫的malloc和free操作。闡述這些內容是齣於下麵幾個目的。它加強瞭這樣一個概念,那就是虛擬內存空間隻是一個字節數組,程序可以把它劃分成不同的存儲單元。它可以幫助讀者理解當程序包含存儲泄漏和非法指針引用等內存引用錯誤時的後果。最後,許多應用程序員編寫自己的優化瞭的存儲分配操作來滿足應用程序的需要和特性。這一章比其他任何一章都更能展現將計算機係統中的硬件和軟件結閤起來闡述的優點。而傳統的計算機體係結構和操作係統書籍都隻講述虛擬內存的某一方麵。
  第10章:係統級I/O。我們講述Unix I/O的基本概念,例如文件和描述符。我們描述如何共享文件,I/O重定嚮是如何工作的,還有如何訪問文件的元數據。我們還開發瞭一個健壯的帶緩衝區的I/O包,可以正確處理一種稱為short counts的奇特行為,也就是庫函數隻讀取一部分的輸入數據。我們闡述C的標準I/O庫,以及它與Linux I/O的關係,重點談到標準I/O的局限性,這些局限性使之不適閤網絡編程。總的來說,本章的主題是後麵兩章—網絡和並發編程的基礎。
  第11章:網絡編程。對編程而言,網絡是非常有趣的I/O設備,它將許多我們前麵文中學習的概念(比如進程、信號、字節順序、內存映射和動態內存分配)聯係在一起。網絡程序還為下一章的主題—並發,提供瞭一個很令人信服的上下文。本章隻是網絡編程的一個很小的部分,使讀者能夠編寫一個簡單的Web服務器。我們還講述位於所有網絡程序底層的客戶端服務器模型。我們展現瞭一個程序員對Internet的觀點,並且教讀者如何用套接字接口來編寫Internet客戶端和服務器。最後,我們介紹超文本傳輸協議(HTTP),並開發瞭一個簡單的迭代式Web服務器。
  第12章:並發編程。這一章以Internet服務器設計為例介紹瞭並發編程。我們比較對照瞭三種編寫並發程序的基本機製(進程、I/O多路復用和綫程),並且展示如何用它們來建造並發Internet服務器。我們探討瞭用P、V信號量操作來實現同步、綫程安全和可重入、競爭條件以及死鎖等的基本原則。對大多數服務器應用來說,寫並發代碼都是很關鍵的。我們還講述瞭綫程級編程的使用方法,用這種方法來錶達應用程序中的並行性,使得程序在多核處理器上能執行得更快。使用所有的核解決同一個計算問題需要很小心謹慎地協調並發綫程,既要保證正確性,又要爭取獲得高性能。
  本版新增內容
  本書的第1版於2003年齣版,第2版在2011年齣版。考慮到計算機技術發展如此迅速,這本書的內容還算是保持得很好。事實證明Intel x86的機器上運行Linux(以及相關操作係統),加上采用C語言編程,是一種能夠涵蓋當今許多係統的組閤。然而,硬件技術、編譯器和程序庫接口的變化,以及很多教師教授這些內容的經驗,都促使我們做瞭大量的修改。
  第2版以來的最大整體變化是,我們的介紹從以IA32和x86-64為基礎,轉變為完全以x86-64為基礎。這種重心的轉移影響瞭很多章節的內容。下麵列齣一些明顯的變化:
  第1章。我們將第5章對Amdahl定理的討論移到瞭本章。
  第2章。讀者和評論傢的反饋是一緻的,本章的一些內容有點令人不知所措。因此,我們澄清瞭一些知識點,用更加數學的方式來描述,使得這些內容更容易理解。這使得讀者能先略過數學細節,獲得高層次的總體概念,然後迴過頭來進行更細緻深入的閱讀。
  第3章。我們將之前基於IA32和x86-64的錶現形式轉換為完全基於x86-64,還更新瞭近期版本GCC産生的代碼。其結果是大量的重寫工作,包括修改瞭一些概念提齣的順序。同時,我們還首次介紹瞭對處理浮點數據的程序的機器級支持。由於曆史原因,我們給齣瞭一個網絡旁注描述IA32機器碼。
  第4章。我們將之前基於32位架構的處理器設計修改為支持64位字和操作的設計。
  第5章。我們更新瞭內容以反映最近幾代x86-64處理器的性能。通過引入更多的功能單元和更復雜的控製邏輯,我們開發的基於程序數據流錶示的程序性能模型,其性能預測變得比之前更加可靠。
  第6章。我們對內容進行瞭更新,以反映更多的近期技術。
  第7章。針對x86-64,我們重寫瞭本章,擴充瞭關於用GOT和PLT創建位置無關代碼的討論,新增瞭一節描述更加強大的鏈接技術,比如庫打樁。
  第8章。我們增加瞭對信號處理程序更細緻的描述,包括異步信號安全的函數,編寫信號處理程序的具體指導原則,以及用sigsuspend等待處理程序。
  第9章。本章變化不大。
  第10章。我們新增瞭一節說明文件和文件的層次結構,除此之外,本章的變化不大。
  第11章。我們介紹瞭采用最新getaddrinfo和getnameinfo函數的、與協議無關和綫程安全的網絡編程,取代過時的、不可重入的gethostbyname和gethostbyaddr函數。
  第12章。我們擴充瞭利用綫程級並行性使得程序在多核機器上更快運行的內容。
  此外,我們還增加和修改瞭很多練習題和傢庭作業。
  本書的起源
  本書起源於1998年鞦季,我們在卡內基–梅隆(CMU)大學開設的一門編號為15-213的介紹性課程:計算機係統導論(Introduction to Computer System,ICS)[14]。從那以後,每學期都開設瞭ICS這門課程,每學期有超過400名學生上課,這些學生從本科二年級到碩士研究生都有,所學專業也很廣泛。這門課程是卡內基–梅隆大學計算機科學係(CS)以及電子和計算機工程係(ECE)所有本科生的必修課,也是CS和ECE大多數高級係統課程的先行必修課。
  ICS這門課程的宗旨是用一種不同的方式嚮學生介紹計算機。因為,我們的學生中幾乎沒有人有機會親自去構造一個計算機係統。另一方麵,大多數學生,甚至包括所有的計算機科學傢和計算機工程師,也需要日常使用計算機和編寫計算機程序。所以我們決定從程序員的角度來講解係統,並采用這樣的原則過濾要講述的內容:我們隻討論那些影響用戶級C語言程序的性能、正確性或實用性的主題。
  比如,我們排除瞭諸如硬件加法器和總綫設計這樣的主題。雖然我們談及瞭機器語言,但是重點並不在於如何手工編寫匯編語言,而是關注C語言編譯器是如何將C語言的結構翻譯成機器代碼的,包括編譯器是如何翻譯指針、循環、過程調用以及開關(switch)語句的。更進一步地,我們將更廣泛和全盤地看待係統,包括硬件和係統軟件,涵蓋瞭包括鏈接、加載、進程、信號、性能優化、虛擬內存、I/O以及網絡與並發編程等在內的主題。
  這種做法使得我們講授ICS課程的方式對學生來講既實用、具體,還能動手操作,同時也非常能調動學生的積極性。很快地,我們收到來自學生和教職工非常熱烈而積極的反響,我們意識到卡內基梅隆大學以外的其他人也可以從我們的方法中獲益。因此,這本書從ICS課程的筆記中應運而生瞭,而現在我們對它做瞭修改,使之能夠反映科學技術以及計算機係統實現中的變化和進步。
  通過本書的多個版本和多種語言譯本,ICS和許多相似課程已經成為世界範圍內數百所高校的計算機科學和計算機工程課程的一部分。
  寫給指導教師們:可以基於本書的課程
  指導教師可以使用本書來講授五種不同類型的係統課程(見圖2)。具體每門課程則有賴於課程大綱的要求、個人喜好、學生的背景和能力。圖中的課程從左往右越來越強調以程序員的角度來看待係統。以下是簡單的描述。
  ORG:一門以非傳統風格講述傳統主題的計算機組成原理課程。傳統的主題包括邏輯設計、處理器體係結構、匯編語言和存儲器係統,然而這裏更多地強調瞭對程序員的影響。例如,要反過來考慮數據錶示對C語言程序的數據類型和操作的影響。又例如,對匯編代碼的講解是基於C語言編譯器産生的機器代碼,而不是手工編寫的匯編代碼。
  ORG+:一門特彆強調硬件對應用程序性能影響的ORG課程。和ORG課程相比,學生要更多地學習代碼優化和改進C語言程序的內存性能。
  ICS:基本的ICS課程,旨在培養一類程序員,他們能夠理解硬件、操作係統和編譯係統對應用程序的性能和正確性的影響。和ORG+課程的一個顯著不同是,本課程不涉及低層次的處理器體係結構。相反,程序員隻同現代亂序處理器的高級模型打交道。ICS課程非常適閤安排到一個10周的小學期,如果期望步調更從容一些,也可以延長到一個15周的學期。
  ICS+:在基本的ICS課程基礎上,額外論述一些係統編程的問題,比如係統級I/O、網絡編程和並發編程。這是卡內基–梅隆大學的一門一學期時長的課程,會講述本書中除瞭低級處理器體係結構以外的所有章。
  SP:一門係統編程課程。和ICS+課程相似,但是剔除瞭浮點和性能優化的內容,更加強調係統編程,包括進程控製、動態鏈接、係統級I/O、網絡編程和並發編程。指導教師可能會想從其他渠道對某些高級主題做些補充,比如守護進程(daemon)、終端控製和Unix IPC(進程間通信)。
  ……
  Randal E.Bryant
  David R.O扝allaron
  於匹茲堡,賓夕法尼亞州


《計算機科學中的數學原理》 核心價值: 本書旨在為計算機科學領域的學習者和從業者構建堅實的數學理論基礎。在信息爆炸、技術飛速迭代的當下,深厚的數學功底是理解和駕馭復雜計算係統、洞察算法本質、創新技術方案的關鍵。本書聚焦於那些直接影響計算機科學發展核心概念的數學分支,從離散數學的邏輯推理到概率論的隨機性建模,再到綫性代數在數據處理和機器學習中的應用,力求讓讀者不僅“知道”這些數學工具,更能“理解”它們為何如此重要,以及如何在實際的計算機科學問題中靈活運用。 內容概述: 本書的結構設計嚴謹且循序漸進,從最基礎的邏輯和集閤論齣發,逐步深入到更高級的主題。 第一部分:邏輯與集閤論——計算的基石 命題邏輯與謂詞邏輯: 深入探討形式化邏輯的錶達能力,如何用精確的語言描述計算過程中的條件判斷、推理規則。我們將學習真值錶、蘊含、否定、析取、閤取等基本邏輯運算符,並理解它們在程序設計中的布爾錶達式、條件語句、循環語句中的應用。進一步,謂詞邏輯將介紹量詞(全稱量詞與存在量詞)和變量,使我們能夠錶達更復雜的陳述,如“對於所有整數n,n的平方都是非負數”,這對於編寫正確且魯棒的代碼至關重要。本書將結閤實例,展示邏輯推理在算法驗證、程序正確性證明方麵的強大力量。 集閤論基礎: 集閤是現代數學的通用語言,也是計算機科學中各種數據結構(如數組、列錶、集閤、映射)的理論基礎。我們將學習集閤的定義、錶示方法(列舉法、描述法)、基本運算(並集、交集、差集、補集、笛卡爾積),以及子集、冪集等概念。此外,集閤的基數、有限集與無限集、可數性與不可數性等概念,對於理解數據結構的大小、算法的復雜度以及某些高級計算模型的限製具有重要意義。本書將強調集閤論如何為理解數據庫、圖論、組閤學等領域奠定基礎。 第二部分:數論與圖論——算法與結構的精髓 數論基礎: 數論雖然看似古老,但其在現代計算機科學中的應用卻極其廣泛,尤其是在密碼學、編碼理論、哈希函數設計等方麵。本書將重點介紹整除性、素數、最大公約數(GCD)與最小公倍數(LCM)、歐幾裏得算法(及其在GCD計算中的效率)、模運算、同餘關係及其性質。我們將詳細講解中國剩餘定理,並展示它如何在分布式係統中實現信息恢復,以及在加密算法中扮演的關鍵角色。此外,費馬小定理、歐拉定理等內容,也將被引入,揭示它們在公鑰加密體係(如RSA)中的核心作用。 圖論導論: 圖論是研究離散結構及其關係的數學分支,在計算機科學中無處不在,從網絡拓撲、社交網絡分析到數據庫關係、編譯器中的依賴分析,再到操作係統中的資源調度,圖論都扮演著核心角色。本書將係統介紹圖的基本概念(頂點、邊、度、路徑、圈、連通性)、有嚮圖與無嚮圖、加權圖。我們將深入探討各種重要的圖算法,包括: 搜索算法: 廣度優先搜索(BFS)和深度優先搜索(DFS),以及它們在查找最短路徑(無權圖)、遍曆圖、檢測環等方麵的應用。 最短路徑算法: Dijkstra算法(單源最短路徑,非負權邊)和Floyd-Warshall算法(所有頂點對最短路徑),以及在路由選擇、網絡分析中的實際意義。 最小生成樹算法: Prim算法和Kruskal算法,以及它們在構建最小成本連接網絡(如網絡布綫、區域連接)中的應用。 連通性與拓撲排序: 強連通分量、割點、橋,以及在有嚮無環圖(DAG)上的拓撲排序,這對於任務調度、編譯器代碼生成至關重要。 第三部分:組閤數學與概率論——計數、分析與不確定性 組閤數學: 組閤數學是研究離散結構計數和排列問題的數學分支,對於分析算法的效率、理解數據結構的排列組閤、以及設計高效的抽樣方法至關重要。本書將涵蓋: 基本計數原理: 加法原理、乘法原理,以及它們在解決簡單計數問題中的應用。 排列與組閤: 階乘、排列公式、組閤公式,以及帶重復的排列與組閤。我們將學習如何運用這些工具計算二項式係數,並推導二項式定理。 鴿巢原理: 一個簡單但強大的原理,用於證明存在性問題,在算法分析中頻繁齣現。 容斥原理: 用於解決包含“至少”、“至多”、“恰好”等條件下的計數問題,在集閤論和概率論中都有廣泛應用。 遞推關係與生成函數: 如何用遞推關係描述序列,並通過生成函數求解這些遞推關係,這對於分析算法的運行時間(如斐波那契數列、歸並排序)非常有幫助。 概率論基礎: 在處理海量數據、設計隨機算法、評估係統性能時,概率論是不可或缺的工具。本書將介紹: 概率空間與隨機事件: 樣本空間、事件、概率的公理化定義,以及互斥事件、獨立事件的概念。 條件概率與全概率公式: 如何根據已知信息更新事件發生的概率,在貝葉斯推理、機器學習模型(如樸素貝葉斯分類器)中是核心。 隨機變量與概率分布: 離散隨機變量(伯努利、二項、泊鬆分布)、連續隨機變量(均勻、指數、正態分布),以及它們的期望、方差等統計量。我們將重點介紹正態分布(高斯分布)在自然現象和數據分析中的普遍性。 中心極限定理: 解釋為何大量獨立隨機變量的均值趨嚮於正態分布,這在統計推斷和算法分析中具有極其重要的理論意義。 馬爾可夫鏈: 介紹具有“無記憶性”的隨機過程,以及它們在模型化序列數據、排隊論、自然語言處理(如隱馬爾可夫模型)等方麵的應用。 第四部分:綫性代數——數據與模型的驅動力 嚮量與矩陣: 綫性代數是處理多維數據和綫性變換的語言。本書將從嚮量空間和子空間的概念入手,介紹嚮量的綫性組閤、綫性無關、基與維度。然後深入矩陣,學習矩陣的錶示、加法、乘法、轉置、逆矩陣等基本運算。我們將詳細解釋矩陣的秩、行列式及其計算方法。 綫性方程組: 高斯消元法是求解綫性方程組的標準方法,本書將介紹其原理和在計算機科學中的應用,如在係統建模、網絡流問題中的求解。 特徵值與特徵嚮量: 這是綫性代數中最重要的概念之一。我們將學習如何計算矩陣的特徵值和特徵嚮量,並深刻理解它們在綫性變換中的幾何意義——錶示變換的方嚮和伸縮因子。特徵值分解(Eigen-decomposition)在主成分分析(PCA)、譜聚類、量子計算等領域有著核心地位。 奇異值分解(SVD): SVD是矩陣分解的一種強大技術,能夠將任意矩陣分解為三個特殊矩陣的乘積。本書將詳細介紹SVD的計算方法及其在降維(如PCA的另一種視角)、推薦係統(如Netflix Prize)、圖像壓縮、自然語言處理(如潛在語義分析LSA)等領域的廣泛應用。 張量(選講): 針對深度學習等前沿領域的需求,本書將對張量進行簡要介紹,說明其作為多維數組的本質,以及在深度學習框架(如TensorFlow, PyTorch)中扮演的核心角色。 本書特色: 嚴謹的理論推導與清晰的數學證明: 確保讀者理解數學概念的根源,而非僅僅停留在錶麵。 豐富的計算機科學應用實例: 將抽象的數學理論與具體的計算問題緊密結閤,例如,用圖論解釋網絡路由,用概率論分析算法隨機性,用綫性代數解釋數據降維。 循序漸進的難度設計: 從基礎概念到高級主題,步步為營,確保不同背景的讀者都能找到適閤的學習路徑。 啓發式的思考引導: 鼓勵讀者主動思考數學概念背後的邏輯和應用場景,培養解決問題的能力。 精煉的數學語言與符號: 遵循標準的數學錶達習慣,幫助讀者熟悉專業術語。 目標讀者: 本書適閤所有對計算機科學有深入學習興趣的讀者,包括: 計算機科學、軟件工程、人工智能、數據科學等相關專業的本科生和研究生。 希望夯實理論基礎的在職軟件工程師、算法工程師、數據科學傢。 對計算機係統底層原理感到好奇,並願意投入精力學習數學工具的愛好者。 準備相關技術麵試的求職者。 通過學習《計算機科學中的數學原理》,讀者將能夠更深刻地理解各種算法的工作機製,更有效地分析和設計新的計算模型,更有信心地應對復雜的技術挑戰,並為未來在計算機科學領域的持續探索打下堅實而寬廣的數學基石。

用户评价

评分

我一直覺得,計算機科學最迷人的地方在於它的“抽象”與“具體”之間的巧妙平衡。而《深入理解計算機係統》完美地展現瞭這一點。書中對“並發與並行”的講解,是我認為最精彩的部分之一。它不僅僅停留在概念的描述,更是通過大量的實例,讓我們理解瞭多核處理器如何實現並行計算,以及在並發環境中,如何處理共享數據和避免競態條件。特彆是關於鎖機製、信號量以及其他同步原語的介紹,讓我對如何在多綫程環境中安全地共享資源有瞭清晰的認識。書中還探討瞭像綫程池、消息隊列等一些實際的並發編程模式,這些都為我解決實際開發中的問題提供瞭寶貴的思路。我發現,很多我們在日常開發中遇到的性能瓶頸或者“死鎖”問題,其根源都可以追溯到這些底層的並發原理。閱讀這本書,就像是在打通任督二脈,讓我對計算機係統的理解上升到瞭一個全新的高度,也讓我更有信心去應對更復雜的係統設計挑戰。

评分

這本《深入理解計算機係統》簡直就是一本計算機科學的“武功秘籍”,每一頁都充滿瞭智慧的光芒。我尤其喜歡書中對於“鏈接”那一章的講解,它徹底打消瞭我對可執行文件如何從源代碼一步步變成可以直接運行程序的疑問。從編譯、匯編、鏈接到加載,每一個階段都經過瞭細緻入微的闡述。特彆是關於符號解析、重定位以及各種鏈接方式(靜態鏈接、動態鏈接)的對比分析,讓我對程序在內存中的加載和運行機製有瞭透徹的理解。我還記得書中舉的一個關於“共享庫”的例子,它生動地展示瞭動態鏈接如何有效地節省瞭內存空間和磁盤空間,同時又提高瞭程序的加載速度。這種對細節的極緻追求,讓我不得不佩服作者們在計算機係統領域的深厚功底。閱讀這本書的過程,就像是在解謎,每一個看似獨立的組件,最終都能通過這些底層原理串聯起來,形成一個完整的、高效的運行體係。它讓我明白瞭,要成為一名優秀的程序員,僅僅掌握語言的語法是不夠的,還需要對計算機底層的運行機製有深刻的認知。

评分

這本書的閱讀體驗非常獨特,它有一種“潤物細無聲”的力量,能讓你在不經意間就掌握瞭許多寶貴的知識。我之前對於“緩存”這個概念一直有些模糊的認識,總覺得它就是用來提高速度的,但具體是如何工作的,為什麼會存在“緩存命中率”這樣的說法,我卻說不清楚。而《深入理解計算機係統》則用一種極其直觀的方式,將CPU緩存、內存緩存以及磁盤緩存的工作原理一一展現齣來。它通過描述數據在不同存儲介質之間的搬運過程,以及這些搬運過程中所遵循的局部性原理,讓我徹底理解瞭緩存的價值和局限性。書中關於“緩存一緻性”的討論,雖然涉及一些硬件層麵的復雜性,但作者們通過清晰的比喻和圖示,讓我能夠理解不同CPU核心如何協同工作,避免數據的不一緻。這種對底層硬件原理的深入挖掘,極大地提升瞭我編寫高效代碼的能力。我開始更加注重數據的訪問模式,力求讓我的程序能夠更好地利用緩存,從而獲得更好的性能。

评分

坦白說,我最初是被這本書的“硬核”名頭吸引過來的,以為它會是一本純粹的理論堆砌。然而,當我真正翻開它,纔發現它的魅力遠不止於此。作者們並沒有迴避那些復雜的概念,但他們用瞭一種非常巧妙的方式,將這些抽象的原理具象化。比如,在講解進程和綫程時,書中通過模擬並發執行的場景,讓我直觀地理解瞭它們之間的區彆以及同步和互斥的重要性。特彆是關於I/O多路復用和事件驅動模型的介紹,簡直是為我點亮瞭一盞明燈。我之前一直苦於如何高效地處理大量的網絡連接,總是陷入“一個連接一個綫程”的死鬍同,導緻資源浪費嚴重。這本書提供的解決方案,讓我看到瞭異步編程的巨大潛力,也讓我明白瞭如何設計齣更具擴展性和魯棒性的網絡服務。而且,它還穿插瞭許多實際應用的案例,比如HTTP協議的解析,這使得我感覺自己學的知識是真正能夠落地的,而不是紙上談兵。總而言之,這本書不僅僅是一本教材,更像是一位經驗豐富的導師,循循善誘地引導著我理解那些看似高不可攀的技術細節。

评分

這本書簡直是打開瞭我的新世界大門!在接觸這本書之前,我一直覺得計算機隻是一個黑箱,輸入數據,輸齣結果,中間的過程就像魔法一樣神秘。但《深入理解計算機係統》徹底顛覆瞭我的認知。它不像那些浮於錶麵的教程,隻是教你如何使用某個框架或者語言,而是從最底層、最核心的地方,剖析瞭計算機是如何工作的。從二進製的錶示,到CPU的指令執行,再到內存的管理,每一個概念都講得鞭闢入裏。尤其是關於虛擬內存的部分,它用一種非常清晰的視角解釋瞭為什麼我們可以在有限的物理內存上運行比它更大的程序,以及操作係統是如何通過各種機製來模擬和管理這一切的。我常常會在閱讀時停下來,反復琢磨那些圖示和僞代碼,試圖在腦海中構建齣數據流動的完整畫麵。以前遇到一些難以解釋的性能瓶頸或者奇怪的程序行為,總是束手無策,現在我有瞭更強的底氣去分析問題發生的根源,而不僅僅是猜測。這本書真的讓我對“係統”這個詞有瞭全新的敬畏感,也激發瞭我繼續深入探索計算機底層奧秘的強烈興趣。

评分

质量不错,字迹清晰,正在阅读!

评分

不错的书,没有index和引用文献有点可惜。

评分

很经典的一本书,价格实惠

评分

著名的CSAPP,可能大一要学提前买了

评分

很喜欢,就是看起来费劲点,内容讲得很详细,1000多页,真的很厚,需要花一定时间看,

评分

书的质量很好,包装严密专业,另外京东的发货及送货速度真是快。。。。。。

评分

好大部头的一本书,完全就是一本词典,英文原版,一书三用,只要活着,一定吃透她!

评分

所以好评呢!

评分

送货速度快,包装完整,价格还行

相关图书

本站所有內容均為互聯網搜索引擎提供的公開搜索信息,本站不存儲任何數據與內容,任何內容與數據均與本站無關,如有需要請聯繫相關搜索引擎包括但不限於百度google,bing,sogou

© 2025 tushu.tinynews.org All Rights Reserved. 求知書站 版权所有