深入理解計算機系統

深入理解計算機系統

計算機專業書籍
《深入理解計算機系統》一書有兩個版本,分别由布賴恩特和Randal E.Bryant/David R.O’Hallaron編着。書中主要介紹了要介紹了計算機系統的基本概念,包括最底層的内存中的數據表示、流水線指令的構成、虛拟存儲器、編譯系統、動态加載庫,以及用戶應用等。
  • 書名:深入理解計算機系統
  • 别名:
  • 作者:(美)布賴恩特(Bryant,R.E.)等
  • 類别:
  • 原作品:
  • 譯者:龔奕利/雷迎春
  • 出版社:電子工業出版社
  • 頁數:736
  • 定價:¥89.00 元
  • 開本:16
  • 裝幀:平裝
  • ISBN:10位[7121025809] 13位[9787121025808]
  • 外文名:Computer Systems: A Programmer's Perspective

版本

中文版——

作者:(美)Randal E.Bryant / David R.O’Hallaron譯者:龔奕利/雷迎春

出版社:機械工業出版社

出版日期:2011年2月第1版ISBN:978-7-111-32133-0

開本:16開

定價:99.00元

頁數:726

英文版——

作者:(美)Randal E. Bryant; David R. O'Hallaron着

出版社:機械工業出版社

出版日期:2010年12月27日

ISBN:978-7-111-32631-1

開本:16開

定價:128.00

頁數:1080

内容提要

本書主要介紹了計算機系統的基本概念,包括最底層的内存中的數據表示、流水線指令的構成、虛拟存儲器、編譯系統、動态加載庫,以及用戶應用等。書中提供了大量實際操作,可以幫助讀者更好地理解程序執行的方式,改進程序的執行效率。此書以程序員的視角全面講解了計算機系統,深入淺出地介紹了處理器、編譯器、操作系統和網絡環境,是這一領域的權威之作。n本書适合作為計算機及相關專業的本科生教材,同時也适用于編程人員參考閱讀。

編輯推薦

本書主要介紹了計算機系統的基本概念,包括最底層的内存中的數據表示、流水線指令的構成、虛拟存儲器、編譯系統、動态加載庫,以及用戶應用等。書中提供了大量實際操作,可以幫助讀者更好地理解程序執行的方式,改進程序的執行效率。此書以程序員的視角全面講解了計算機系統,深入淺出地介紹了處理器、編譯器、操作系統和網絡環境,是這一領域的權威之作。

本書适合作為計算機及相關專業的本科生教材,同時也适用于編程人員參考閱讀。

作者簡介

Randal E.Brant:1981年在麻省理工學院獲計算機科學博士學位,現任美國卡内基·梅隆大學計算機學院院長,是ACM和IEEE的雙會士,多次獲得這兩個協會頒發的大獎。Bryant教授從事計算機系統方面的教學工作已超過20年,結合計算機體系結構課程多年的教學經驗,他開始把關注點從如何設計計算機轉移到如何使用程序員在更好地了解系統的情況下編寫出更有效、更可靠的程序上來。

目錄

第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.8c語言中的位級運算34

2.1.9c語言中的邏輯運算36

2.1.10c語言中的移位運算36

2.2整數表示38

2.2.1整型數據類型38

2.2.2無符号數的編碼39

2.2.3補碼編碼40

2.2.4有符号數和無符号數之間的轉換44

2.2.5c語言中的有符号數與無符号數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.2ieee浮點表示70

2.4.3數字示例71

2.4.4舍入74

2.4.5浮點運算76

2.4.6c語言中的浮點數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.7switch語句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.13x86-64:将ia32擴展到64位183

3.13.186-64的曆史和動因184

3.13.2x86-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章處理器體系結構230

4.1y86指令集體系結構231

4.1.1程序員可見的狀态231

4.1.2y86指令232

4.1.3指令編碼233

4.1.4y86異常237

4.1.5y86程序237

4.1.6一些y86指令的詳情241

4.2邏輯設計和硬件控制語言hcl242

4.2.1邏輯門243

4.2.2組合電路和hcl布爾表達式243

4.2.3字級的組合電路和hcl整數表達式245

4.2.4集合關系248

4.2.5存儲器和時鐘248

4.3y86的順序實現250

4.3.1将處理組織成階段250

4.3.2eq硬件結構258

4.3.3seq的時序259

4.3.4seq階段的實現262

4.4流水線的通用原理267

4.4.1計算流水線268

4.4.2流水線操作的詳細說明269

4.4.3流水線的局限性271

4.4.4帶反饋的流水線系統272

4.5y86的流水線實現273

4.5.1seq+:重新安排計算階段273

4.5.2插入流水線寄存器276

4.5.3對信号進行重新排列和标号277

4.5.4預測下一個pc279

4.5.5流水線冒險280

4.5.6用暫停來避免數據冒險283

4.5.7用轉發來避免數據冒險285

4.5.8加載/使用數據冒險288

4.5.9異常處理289

4.5.10pipe各階段的實現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.3amdahl定律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.3linux/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獲取進程id492

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

8.5.5可移植的信号處理516

8.5.6顯式地阻塞和取消阻塞信号517

8.5.7同步流以避免讨厭的并發錯誤517

8.6非本地跳轉521

8.7操作進程的工具524

8.8小結524

參考文獻說明525

家庭作業525

練習題答案530

第9章虛拟存儲器534

9.1物理和虛拟尋址535

9.2地址空間535

9.3虛拟存儲器作為緩存的工具536

9.3.1dram緩存的組織結構537

9.3.2頁表537

9.3.3頁命中538

9.3.4缺頁538

9.3.5分配頁面539

9.3.6又是局部性救了我們539

9.4虛拟存儲器作為存儲器管理的工具540

9.5虛拟存儲器作為存儲器保護的工具541

9.6地址翻譯542

9.6.1結合高速緩存和虛拟存儲器544

9.6.2利用tlb加速地址翻譯545

9.6.3多級頁表546

9.6.4綜合:端到端的地址翻譯547

9.7案例研究:intel core i7/linux存儲器系統550

9.7.1core i7地址翻譯551

9.7.2linux虛拟存儲器系統554

9.8存儲器映射556

9.8.1再看共享對象557

9.8.2再看fork函數558

9.8.3再看execve函數559

9.8.4使用mmap函數的用戶級存儲器映射559

9.9動态存儲器分配561

9.9.1malloc和free函數561

9.9.2為什麼要使用動态存儲器分配563

9.9.3分配器的要求和目标564

9.9.4碎片565

9.9.5實現問題565

9.9.6隐式空閑鍊表565

9.9.7放置已分配的塊567

9.9.8分割空閑塊567

9.9.9獲取額外的堆存儲器567

9.9.10合并空閑塊568

9.9.11帶邊界标記的合并568

9.9.12綜合:實現一個簡單的分配器570

9.9.13顯式空閑鍊表576

9.9.14分離的空閑鍊表576

9.10垃圾收集578

9.10.1垃圾收集器的基本知識579

9.10.2mark&sweep垃圾收集器580

9.10.3c程序的保守mark&sweep580

9.11c程序中常見的與存儲器有關的錯誤581

9.11.1間接引用壞指針582

9.11.2讀未初始化的存儲器582

9.11.3允許棧緩沖區溢出582

9.11.4假設指針和它們指向的對象是相同大小的583

9.11.5造成錯位錯誤583

9.11.6引用指針,而不是它所指向的對象583

9.11.7誤解指針運算584

9.11.8引用不存在的變量584

9.11.9引用空閑堆塊中的數據584

9.11.10引起存儲器洩漏585

9.12小結585

參考文獻說明586

家庭作業586

練習題答案589

第三部分程序間的交互和通信

第10章系統級i/o596

10.1unix i/o596

10.2打開和關閉文件597

10.3讀和寫文件598

10.4用rio包健壯地讀寫599

10.4.1rio的無緩沖的輸入輸出函數600

10.4.2rio的帶緩沖的輸入函數600

10.5讀取文件元數據604

10.6共享文件606

10.7i/o重定向608

10.8标準i/o609

10.9綜合:我該使用哪些i/o函數610

10.10小結611

參考文獻說明612

家庭作業612

練習題答案612

第11章網絡編程614

11.1客戶端-服務器編程模型614

11.2網絡615

11.3全球ip因特網618

11.3.1ip地址619

11.3.2因特網域名620

11.3.3因特網連接623

11.4套接字接口625

11.4.1套接字地址結構625

11.4.2socket函數626

11.4.3onnect函數626

11.4.4open_clientfd函數627

11.4.5bind函數628

11.4.6listen函數628

11.4.7open_listenfd函數628

11.4.8accept函數629

11.4.9echo客戶端和服務器的示例630

11.5web服務器633

11.5.1web基礎633

11.5.2web内容633

11.5.3http事務634

11.5.4服務動态内容636

11.6綜合:tiny web服務器639

11.7小結645

參考文獻說明645

家庭作業646

練習題答案646

第12章并發編程648

12.1基于進程的并發編程649

12.1.1基于進程的并發服務器649

12.1.2關于進程的優劣651

12.2基于i/o多路複用的并發編程651

12.2.1基于i/o多路複用的并發事件驅動服務器653

12.2.2i/o多路複用技術的優劣657

12.3基于線程的并發編程657

12.3.1線程執行模型657

12.3.2posix線程658

12.3.3創建線程659

12.3.4終止線程659

12.3.5回收已終止線程的資源660

12.3.6分離線程660

12.3.7初始化線程660

12.3.8一個基于線程的并發服務器661

12.4多線程程序中的共享變量662

12.4.1線程存儲器模型663

12.4.2将變量映射到存儲器663

12.4.3共享變量664

12.5用信号量同步線程664

12.5.1進度圖667

12.5.2信号量668

12.5.3使用信号量來實現互斥669

12.5.4利用信号量來調度共享資源670

12.5.5綜合:基于預線程化的并發服務器674

12.6使用線程提高并行性676

12.7其他并發問題680

12.7.1線程安全680

12.7.2可重入性682

12.7.3在線程化的程序中使用已存在的庫函數682

12.7.4競争683

12.7.5死鎖685

12.8小結687

參考文獻說明687

家庭作業688

練習題答案691

附錄a錯誤處理694

a.1unix系統中的錯誤處理694

a.2錯誤處理包裝函數696

參考文獻698

前言

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.

上一篇:社會經濟學

下一篇:生命的價值和意義

相關詞條

相關搜索

其它詞條