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

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

[美] 蘭德爾 E.布萊恩特(Randal,E.,Bryant),大衛,R. ... 著
想要找書就要到 靜流書站
立刻按 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
  於匹茲堡,賓夕法尼亞州


用戶評價

評分

具體內容等以後再評價

評分

經典,看過第二版買本第三版翻翻

評分

書質量好,印刷的不錯,價格用瞭券後也閤理,總之比較滿意。

評分

絕對正版,紙質沒有問題,慢慢品讀

評分

商品到手非常好,包裝特彆精美,京東物流很棒,上午買的,下午就到瞭!

評分

傾慕已久的書,拿來收藏!

評分

雖然不是很喜歡硬殼書 但是還算精美 開啃

評分

挺好的一本書,機械工業的書也就必須得是原版英文的纔好。

評分

貴,厚,重,精裝本。值得一看!

相關圖書

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

© 2025 windowsfront.com All Rights Reserved. 靜流書站 版權所有