編輯推薦
英文原版,原汁原味。影印版采用雙色精裝印製工藝,提供更加良好的閱讀體驗
【注:根據原齣版社要求,影印版刪去瞭參考文獻部分。】
內容簡介
本書是一本將計算機軟件和硬件理論結閤講述的經典教材,內容涵蓋計算機導論、體係結構和處理器設計等多門課程。本書*大的特點是為程序員描述計算機係統的實現細節,通過描述程序是如何映射到係統上,以及程序是如何執行的,使讀者更好地理解程序的行為,找到程序效率低下的原因。
和第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)係統,即在真正的係統上解決具體的問題,或是編寫和運行程序。
這個主題觀念貫穿全書。當引入一個新概念時,將會有一個或多個練習題緊隨其後,你應該馬上做一做來檢驗你的理解。這些練習題的解答在每章的末尾。當你閱讀時,嘗試自己來解答每個問題,然後
深入理解計算機係統(英文版·第3版) 下載 mobi epub pdf txt 電子書