計算機科學叢書:深入理解計算機系統

計算機科學叢書:深入理解計算機系統

《深入理解計算機系統》從程式設計師的視角詳細闡述計算機系統的本質概念,並展示這些概念如何實實在在地影回響用程式的正確性、性能和實用性。全書共12章,主要內容包括信息的表示和處理、程式的機器級表示、處理器體系結構、最佳化程式性能、存儲器層次結構、連結、異常控制流、虛擬存儲器、系統級I/O、網路編程、並發編程等。書中提供子大量的例子和練習題,並給出部分答案,有助於讀者加深對正文所述概念和知識的理解。 《深入理解計算機系統》適合作為高等院校計算機及相關專業本科牛、研究生的教材,也可供想要寫出更快、更可靠程式的程式設計師及專業技術人員參考。 海報:

基本介紹

內容簡介

《深入理解計算機系統》:計算機科學叢書。

作者簡介

作者:(美國)布萊恩特(Randal E.Bryant) (美國)奧哈拉倫(David R.O'Hallaron) 譯者:龔奕利 雷迎春
Randal E. Bryant,1973年於密西根大學(University of Michigan)獲得學士學位,隨即就讀於麻省理工學院(Massachusetts Institute of Technology)的研究生院,並在1981年獲計算機博士學位。他在加州理工學院(California Institute of Technology)做了三年助教,從1984年至今一直是卡內基梅隆大學(Carnegie Mellon)的教師。他現在是計算機科學的大學教授(university professor)和計算機科學學院的院長。他同時還受邀於電子和計算機工程系。
David R.O'Hallaron,擁有維吉尼亞大學計算機科學博士學位,現為Intel茲堡實驗室主任,卡內基-梅隆大學計算機科學和電子與計算機工程副教授。他曾獲得卡內基-梅隆大學計算機科學學院頒發的Herbert Simon傑出教學獎,並同Quake項目中其他成員一起獲得了高性能計算領域中的最高國際獎項——Gordon Bell獎。

媒體推薦

“2005年,我開始採用Bryant和O’Hallaron的這本書作為本科生計算機系統課程的教材。現今,這本書仍然是我的計算機系統課程教科書的首選。”
——Mirela Damian,維拉諾瓦大學
“本書表述清晰、恰到好處——舉重若輕地呈現了那些非常複雜的內容。”
——Ibrahim Matta,波士頓大學
“這是一本學習計算機硬體和軟體如何‘真正’協同工作的好書,還教會你為什麼了解這些知識會使你成為一個更有價值的程式設計師。本書還幫你為學習像作業系統和編譯器這樣的高級課程做好準備。在本書中,我最喜歡的章節是關於快取的,當我第一次發現快取有多重要時,真是難以置信!”
——Vishal Shah,Ask.com總架構師

圖書目錄

出版者的話
譯者序
前言
第1章 計算機系統漫遊 1
1.1 信息就是位+上下文 1
1.2 程式被其他程式翻譯成不同的格式 3
1.3 了解編譯系統如何工作是大有益處的 4
1.4 處理器讀並解釋存儲在存儲器中的指令 5
1.4.1 系統的硬體組成 5
1.4.2 運行hello程式 7
1.5 高速快取至關重要 7
1.6 存儲設備形成層次結構 9
1.7 作業系統管理硬體 10
1.7.1 進程 11
1.7.2 執行緒 12
1.7.3 虛擬存儲器 12
1.7.4 檔案 13
1.8 系統之間利用網路通信 13
1.9 重要主題 15
1.9.1 並發和並行 15
1.9.2 計算機系統中抽象的重要性 17
1.10 小結 17
參考文獻說明 18
第一部分 程式結構和執行
第2章 信息的表示和處理 20
2.1 信息存儲 22
2.1.1 十六進制表示法 22
2.1.2 字 25
2.1.3 數據大小 25
2.1.4 定址和位元組順序 26
2.1.5 表示字元串 31
2.1.6 表示代碼 31
2.1.7 布爾代數簡介 32
2.1.8 C語言中的位級運算 34
2.1.9 C語言中的邏輯運算 36
2.1.10 V語言中的移位運算 36
2.2 整數表示 38
2.2.1 整型數據類型 38
2.2.2 無符號數的編碼 39
2.2.3 補碼編碼 40
2.2.4 有符號數和無符號數之間的轉換 44
2.2.5 C語言中的有符號數與無符號數 47
2.2.6 擴展一個數字的位表示 49
2.2.7 截斷數字 51
2.2.8 關於有符號數與無符號數的建議 52
2.3 整數運算 54
2.3.1 無符號加法 54
2.3.2 補碼加法 57
2.3.3 補碼的非 59
2.3.4 無符號乘法 60
2.3.5 補碼乘法 60
2.3.6 乘以常數 63
2.3.7 除以2的冪 64
2.3.8 關於整數運算的最後思考 67
2.4 浮點數 67
2.4.1 二進制小數 68
2.4.2 IEEE浮點表示 70
2.4.3 數字示例 71
2.4.4 捨入 74
2.4.5 浮點運算 76
2.4.6 C語言中的浮點數 77
2.5 小結 79
參考文獻說明 80
家庭作業 80
練習題答案 90
第3章 程式的機器級表示 102
3.1 歷史觀點 103
3.2 程式編碼 105
3.2.1 機器級代碼 106
3.2.2 代碼示例 107
3.2.3 關於格式的註解 109
3.3 數據格式 111
3.4 訪問信息 112
3.4.1 運算元指示符 112
3.4.2 數據傳送指令 114
3.4.3 數據傳送示例 116
3.5 算術和邏輯操作 118
3.5.1 載入有效地址 118
3.5.2 一元操作和二元操作 119
3.5.3 移位操作 120
3.5.4 討論 120
3.5.5 特殊的算術操作 122
3.6 控制 123
3.6.1 條件碼 124
3.6.2 訪問條件碼 125
3.6.3 跳轉指令及其編碼 127
3.6.4 翻譯條件分支 129
3.6.5 循環 132
3.6.6 條件傳送指令 139
3.6.7 switch語句 144
3.7 過程 149
3.7.1 棧幀結構 149
3.7.2 轉移控制 150
3.7.3 暫存器使用慣例 151
3.7.4 過程示例 152
3.7.5 遞歸過程 156
3.8 數組分配和訪問 158
3.8.1 基本原則 158
3.8.2 指針運算 159
3.8.3 嵌套的數組 159
3.8.4 定長數組 161
3.8.5 變長數組 163
3.9 異質的數據結構 164
3.9.1 結構 164
3.9.2 聯合 167
3.9.3 數據對齊 170
3.10 綜合:理解指針 172
3.11 套用:使用GDB調試器 174
3.12 存儲器的越界引用和緩衝區溢出 175
3.13 x86-64:將ia32擴展到64位 183
3.13.1 x86-64的歷史和動因 184
3.13.2 x86-64簡介 185
3.13.3 訪問信息 187
3.13.4 控制 192
3.13.5 數據結構 200
3.13.6 關於x86-64的總結性評論 200
3.14 浮點程式的機器級表示 201
3.15 小結 201
參考文獻說明 202
家庭作業 202
練習題答案 212
第4章 處理器體系結構2 30
4.1 Y86指令集體系結構 231
4.1.1 程式設計師可見的狀態 231
4.1.2 Y86指令 232
4.1.3 指令編碼 233
4.1.4 Y86異常 237
4.1.5 Y86程式 237
4.1.6 一些Y86指令的詳情 241
4.2 邏輯設計和硬體控制語言HCL 242
4.2.1 邏輯門 243
4.2.2 組合電路和HCL布爾表達式 243
4.2.3 字級的組合電路和HCL整數表達式 245
4.2.4 集合關係 248
4.2.5 存儲器和時鐘 248
4.3 y86的順序實現 250
4.3.1 將處理組織成階段 250
4.3.2 SEQ硬體結構 258
4.3.3 SEQ的時序 259
4.3.4 SEQ階段的實現 262
4.4 流水線的通用原理 267
4.4.1 計算流水線 268
4.4.2 流水線操作的詳細說明 269
4.4.3 流水線的局限性 271
4.4.4 帶反饋的流水線系統272
4.5 Y86的流水線實現273
4.5.1 SEQ+:重新安排計算階段 273
4.5.2 插入流水線暫存器 276
4.5.3 對信號進行重新排列和標號 277
4.5.4 預測下一個PC 279
4.5.5 流水線冒險 280
4.5.6 用暫停來避免數據冒險 283
4.5.7 用轉發來避免數據冒險 285
4.5.8 載入/使用數據冒險 288
4.5.9 異常處理 289
4.5.10 pipe各階段的實現 291
4.5.11 流水線控制邏輯 297
4.5.12 性能分析 305
4.5.13 未完成的工作 306
4.6 小結 308
參考文獻說明309
家庭作業309
練習題答案 314
第5章 最佳化程式性能 324
5.1 最佳化編譯器的能力和局限性 325
5.2 表示程式性能 328
5.3 程式示例 330
5.4 消除循環的低效率 332
5.5 減少過程調用 336
5.6 消除不必要的存儲器引用 336
5.7 理解現代處理器 340
5.7.1 整體操作 340
5.7.2 功能單元的性能 343
5.7.3 處理器操作的抽象模型 344
5.8 循環展開 348
5.9 提高並行性 351
5.9.1 多個累積變數 351
5.9.2 重新結合變換 354
5.10 最佳化合併代碼的結果小結 358
5.11 一些限制因素 359
5.11.1 暫存器溢出359
5.11.2 分支預測和預測錯誤處罰 360
5.12 理解存儲器性能 363
5.12.1 載入的性能 363
5.12.2 存儲的性能 364
5.13 套用:性能提高技術 369
5.14 確認和消除性能瓶頸 369
5.14.1 程式剖析 370
5.14.2 使用剖析程式來指導最佳化 371
5.14.3 Amdahl定律 374
5.15 小結 375
參考文獻說明 375
家庭作業 376
練習題答案 378
第6章 存儲器層次結構 382
6.1 存儲技術 382
6.1.1 隨機訪問存儲器 383
6.1.2 磁碟存儲 389
6.1.3 固態硬碟 398
6.1.4 存儲技術趨勢 399
6.2 局部性 401
6.2.1 對程式數據引用的局部性 402
6.2.2 取指令的局部性 403
6.2.3 局部性小結 403
6.3 存儲器層次結構 405
6.3.1 存儲器層次結構中的快取 406
6.3.2 存儲器層次結構概念小結 408
6.4 高速快取存儲器 408
6.4.1 通用的高速快取存儲器結構 409
6.4.2 直接映射高速快取 410
6.4.3 組相聯高速快取 416
6.4.4 全相聯高速快取 418
6.4.5 有關寫的問題 420
6.4.6 一個真實的高速快取層次結構的解剖 421
6.4.7 高速快取參數的性能影響 422
6.5 編寫高速快取友好的代碼 423
6.6 綜合:高速快取對程式性能的影響 426
6.6.1 存儲器山 426
6.6.2 重新排列循環以提高空間局部性 430
6.6.3 在程式中利用局部性 433
6.7 小結 433
參考文獻說明 434
家庭作業 434
練習題答案 442
第二部分 在系統上運行程式
第7章 連結 448
7.1 編譯器驅動程式 449
7.2 靜態連結 450
7.3 目標檔案 450
7.4 可重定位目標檔案 451
7.5 符號和符號表 452
7.6 符號解析 454
7.6.1 連結器如何解析多重定義的全局符號 455
7.6.2 與靜態庫連結 457
7.6.3 連結器如何使用靜態庫來解析引用 460
7.7 重定位 461
7.7.1 重定位條目 461
7.7.2 重定位符號引用 462
7.8 可執行目標檔案 465
7.9 載入可執行目標檔案 466
7.10 動態連結共享庫 467
7.11 從應用程式中載入和連結共享庫 468
7.12 與位置無關的代碼(PIC) 471
7.13 處理目標檔案的工具 473
7.14 小結 473
參考文獻說明 474
家庭作業 474
練習題答案 479
第8章 異常控制流 480
8.1 異常 481
8.1.1 異常處理 481
8.1.2 異常的類別 482
8.1.3 Linux/IA32系統中的異常 484
8.2 進程 487
8.2.1 邏輯控制流 487
8.2.2 並發流 487
8.2.3 私有地址空間488
8.2.4 用戶模式和核心模式 488
8.2.5 上下文切換 489
8.3 系統調用錯誤處理 491
8.4 進程控制 492
8.4.1 獲取進程ID 492
8.4.2 創建和終止進程 492
8.4.3 回收子進程 495
8.4.4 讓進程休眠 499
8.4.5 載入並運行程式500
8.4.6 利用fork和execve運行程式502
8.5 信號 504
8.5.1 信號術語 505
8.5.2 傳送信號 506
8.5.3 接收信號 509
8.5.4 信號處理問題 511
……
第9章 虛擬存儲器 534
第10章 系統級I/O 596
第11章 網路編程 614
第12章 並發編程 648
附錄A 錯誤處理 694

序言

本書通過程式設計師的視角來介紹計算機系統,首先把高級語言轉換成計算機所能理解的一種中間格式(如彙編語言),然後描述計算機如何解釋和執行這些中間格式的程式,系統的哪一部分影響程式的執行效率。在講述計算機系統知識的同時,也給出了關於C語言和彙編語言的編程、閱讀技巧以及基本的系統編程工具,還給出一些方法幫助程式設計師基於對計算機系統的理解來改善程式的性能等問題。本書強調對計算機系統概念的理解,但並不意味著不動手。如果按照本書的安排做每一章後面的習題,將有助於加深對正文所述概念和知識的理解,更可以從實際動手中學習到新的知識。
本書的主要內容是關於計算機體系結構與編譯器和作業系統的互動,包括:數據表示,彙編語言和彙編級計算機體系結構,處理器設計,程式的性能度量和最佳化,程式的載入器、連結器和編譯器,I/O和設備的存儲器層次結構,虛擬存儲器,外部存儲管理,中斷、信號和進程控制。
本書的最大優點是為程式設計師描述計算機系統的實現細節,幫助其在大腦中構造一個層次型的計算機系統,從最底層的數據在記憶體中的表示(如大多數程式設計師一直陌生或疑惑的浮點數表示),到流水線指令的構成,到虛擬存儲器,到編譯系統,到動態載入庫,到最後的用戶態套用。貫串本書的一條主線是使程式設計師在設計程式時,能充分意識到計算機系統的重要性,建立起所寫程式可能被執行的數據或指令流圖,明白執行程式時到底發生了什麼事,從而能設計出高效、可移植、健壯的程式,並能夠更快地對程式排錯、改進程式性能等。
原書是卡內基-梅隆大學(CMU)的教材,現在很多國內外著名的大學也選用其作為教材或輔助性資料,因此,本書的讀者不僅僅是那些因為工作和興趣而關注本書的人,還包括一些在校的大學生。我們認為,在校學生越早接觸本書的內容,將越有利於他們學習計算機的相關課程,培養對計算機系統的研究興趣。
總的來說,本書是一座橋樑,它幫助程式設計師銜接了計算機系統各個領域的知識,為程式設計師構造了一個概念性框架。要想獲取更多關於計算機系統結構、作業系統、編譯器、網路、並發編程方面的知識,還需要進一步閱讀相關書籍。

相關詞條

熱門詞條

聯絡我們