深入理解計(jì)算機(jī)系統(tǒng)(原書(shū)第2版中文版)這本書(shū)盡量的做到相對(duì)實(shí)用,不去講那些和實(shí)際編程沒(méi)多大關(guān)系的計(jì)算機(jī)原理,畢竟是著名計(jì)算機(jī)院校里面最偏軟件的cmu的作品(作者是CMU計(jì)算機(jī)系主任),重點(diǎn)非常得當(dāng)。正如作者自己評(píng)價(jià)這本書(shū)時(shí)說(shuō)的一樣——如果你全力投身本書(shū)中的概念,完全理解底層計(jì)算機(jī)系統(tǒng)以及它對(duì)應(yīng)用程序的影響,那么你將會(huì)逐漸成為鳳毛麟角的“權(quán)威”程序員。如果你想查閱這本書(shū)的全部?jī)?nèi)容,點(diǎn)擊本文相應(yīng)的下載地址進(jìn)行下載后即可閱讀!該書(shū)為pdf格式免費(fèi)清晰掃描版,歡迎下載查閱!
深入理解計(jì)算機(jī)系統(tǒng)目錄
出版者的話
譯者序
前 言
第1章 計(jì)算機(jī)系統(tǒng)漫游1
1.1 信息就是位+上下文1
1.2 程序被其他程序翻譯成不同的格式3
1.3 了解編譯系統(tǒng)如何工作是大有益處的4
1.4 處理器讀并解釋存儲(chǔ)在存儲(chǔ)器中的指令5
1.4.1 系統(tǒng)的硬件組成5
1.4.2 運(yùn)行hello程序7
1.5 高速緩存至關(guān)重要7
1.6 存儲(chǔ)設(shè)備形成層次結(jié)構(gòu)9
1.7 操作系統(tǒng)管理硬件10
1.7.1 進(jìn)程11
1.7.2 線程12
1.7.3 虛擬存儲(chǔ)器12
1.7.4 文件13
1.8 系統(tǒng)之間利用網(wǎng)絡(luò)通信13
1.9 重要主題15
1.9.1 并發(fā)和并行15
1.9.2 計(jì)算機(jī)系統(tǒng)中抽象的重要性17
1.10 小結(jié)17
參考文獻(xiàn)說(shuō)明18
第一部分 程序結(jié)構(gòu)和執(zhí)行
第2章 信息的表示和處理20
2.1 信息存儲(chǔ)22
2.1.1 十六進(jìn)制表示法22
2.1.2 字25
2.1.3 數(shù)據(jù)大小25
2.1.4 尋址和字節(jié)順序26
2.1.5 表示字符串31
2.1.6 表示代碼31
2.1.7 布爾代數(shù)簡(jiǎn)介32
2.1.8 C語(yǔ)言中的位級(jí)運(yùn)算34
2.1.9 C語(yǔ)言中的邏輯運(yùn)算36
2.1.10 C語(yǔ)言中的移位運(yùn)算36
2.2 整數(shù)表示38
2.2.1 整型數(shù)據(jù)類(lèi)型38
2.2.2 無(wú)符號(hào)數(shù)的編碼39
2.2.3 補(bǔ)碼編碼40
2.2.4 有符號(hào)數(shù)和無(wú)符號(hào)數(shù)之間的轉(zhuǎn)換44
2.2.5 C語(yǔ)言中的有符號(hào)數(shù)與無(wú)符號(hào)數(shù)47
2.2.6 擴(kuò)展一個(gè)數(shù)字的位表示49
2.2.7 截?cái)鄶?shù)字51
2.2.8 關(guān)于有符號(hào)數(shù)與無(wú)符號(hào)數(shù)的建議52
2.3 整數(shù)運(yùn)算54
2.3.1 無(wú)符號(hào)加法54
2.3.2 補(bǔ)碼加法57
2.3.3 補(bǔ)碼的非59
2.3.4 無(wú)符號(hào)乘法60
2.3.5 補(bǔ)碼乘法60
2.3.6 乘以常數(shù)63
2.3.7 除以2的冪64
2.3.8 關(guān)于整數(shù)運(yùn)算的最后思考67
2.4 浮點(diǎn)數(shù)67
2.4.1 二進(jìn)制小數(shù)68
2.4.2 IEEE浮點(diǎn)表示70
2.4.3 數(shù)字示例71
2.4.4 舍入74
2.4.5 浮點(diǎn)運(yùn)算76
2.4.6 C語(yǔ)言中的浮點(diǎn)數(shù)77
2.5 小結(jié)79
參考文獻(xiàn)說(shuō)明80
家庭作業(yè)80
練習(xí)題答案90
第3章 程序的機(jī)器級(jí)表示102
3.1 歷史觀點(diǎn)103
3.2 程序編碼105
3.2.1 機(jī)器級(jí)代碼106
3.2.2 代碼示例107
3.2.3 關(guān)于格式的注解109
3.3 數(shù)據(jù)格式111
3.4 訪問(wèn)信息112
3.4.1 操作數(shù)指示符112
3.4.2 數(shù)據(jù)傳送指令114
3.4.3 數(shù)據(jù)傳送示例116
3.5 算術(shù)和邏輯操作118
3.5.1 加載有效地址118
3.5.2 一元操作和二元操作119
3.5.3 移位操作120
3.5.4 討論120
3.5.5 特殊的算術(shù)操作122
3.6 控制123
3.6.1 條件碼124
3.6.2 訪問(wèn)條件碼125
3.6.3 跳轉(zhuǎn)指令及其編碼127
3.6.4 翻譯條件分支129
3.6.5 循環(huán)132
3.6.6 條件傳送指令139
3.6.7 switch語(yǔ)句144
3.7 過(guò)程149
3.7.1 棧幀結(jié)構(gòu)149
3.7.2 轉(zhuǎn)移控制150
3.7.3 寄存器使用慣例151
3.7.4 過(guò)程示例152
3.7.5 遞歸過(guò)程156
3.8 數(shù)組分配和訪問(wèn)158
3.8.1 基本原則158
3.8.2 指針運(yùn)算159
3.8.3 嵌套的數(shù)組159
3.8.4 定長(zhǎng)數(shù)組161
3.8.5 變長(zhǎng)數(shù)組163
3.9 異質(zhì)的數(shù)據(jù)結(jié)構(gòu)164
3.9.1 結(jié)構(gòu)164
3.9.2 聯(lián)合167
3.9.3 數(shù)據(jù)對(duì)齊170
3.10 綜合:理解指針172
3.11 應(yīng)用:使用GDB調(diào)試器174
3.12 存儲(chǔ)器的越界引用和緩沖區(qū)溢出175
3.13 x86-64:將IA32擴(kuò)展到64位183
3.13.1 x86-64的歷史和動(dòng)因184
3.13.2 x86-64簡(jiǎn)介185
3.13.3 訪問(wèn)信息187
3.13.4 控制192
3.13.5 數(shù)據(jù)結(jié)構(gòu)200
3.13.6 關(guān)于x86-64的總結(jié)性評(píng)論200
3.14 浮點(diǎn)程序的機(jī)器級(jí)表示201
3.15 小結(jié)201
參考文獻(xiàn)說(shuō)明202
家庭作業(yè)202
練習(xí)題答案212
第4章 處理器體系結(jié)構(gòu)230
4.1 Y86指令集體系結(jié)構(gòu)231
4.1.1 程序員可見(jiàn)的狀態(tài)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 邏輯設(shè)計(jì)和硬件控制語(yǔ)言HCL242
4.2.1 邏輯門(mén)243
4.2.2 組合電路和HCL布爾表達(dá)式243
4.2.3 字級(jí)的組合電路和HCL整數(shù)表達(dá)式245
4.2.4 集合關(guān)系248
4.2.5 存儲(chǔ)器和時(shí)鐘248
4.3 Y86的順序?qū)崿F(xiàn)250
4.3.1 將處理組織成階段250
4.3.2 SEQ硬件結(jié)構(gòu)258
4.3.3 SEQ的時(shí)序259
4.3.4 SEQ階段的實(shí)現(xiàn)262
4.4 流水線的通用原理267
4.4.1 計(jì)算流水線268
4.4.2 流水線操作的詳細(xì)說(shuō)明269
4.4.3 流水線的局限性271
4.4.4 帶反饋的流水線系統(tǒng)272
4.5 Y86的流水線實(shí)現(xiàn)273
4.5.1 SEQ+:重新安排計(jì)算階段273
4.5.2 插入流水線寄存器276
4.5.3 對(duì)信號(hào)進(jìn)行重新排列和標(biāo)號(hào)277
4.5.4 預(yù)測(cè)下一個(gè)PC279
4.5.5 流水線冒險(xiǎn)280
4.5.6 用暫停來(lái)避免數(shù)據(jù)冒險(xiǎn)283
4.5.7 用轉(zhuǎn)發(fā)來(lái)避免數(shù)據(jù)冒險(xiǎn)285
4.5.8 加載/使用數(shù)據(jù)冒險(xiǎn)288
4.5.9 異常處理289
4.5.10 PIPE各階段的實(shí)現(xiàn)291
4.5.11 流水線控制邏輯297
4.5.12 性能分析305
4.5.13 未完成的工作306
4.6 小結(jié)308
參考文獻(xiàn)說(shuō)明309
家庭作業(yè)309
練習(xí)題答案314
第5章 優(yōu)化程序性能324
5.1 優(yōu)化編譯器的能力和局限性325
5.2 表示程序性能328
5.3 程序示例330
5.4 消除循環(huán)的低效率332
5.5 減少過(guò)程調(diào)用336
5.6 消除不必要的存儲(chǔ)器引用336
5.7 理解現(xiàn)代處理器340
5.7.1 整體操作340
5.7.2 功能單元的性能343
5.7.3 處理器操作的抽象模型344
5.8 循環(huán)展開(kāi)348
5.9 提高并行性351
5.9.1 多個(gè)累積變量351
5.9.2 重新結(jié)合變換354
5.10 優(yōu)化合并代碼的結(jié)果小結(jié)358
5.11 一些限制因素359
5.11.1 寄存器溢出359
5.11.2 分支預(yù)測(cè)和預(yù)測(cè)錯(cuò)誤處罰360
5.12 理解存儲(chǔ)器性能363
5.12.1 加載的性能363
5.12.2 存儲(chǔ)的性能364
5.13 應(yīng)用:性能提高技術(shù)369
5.14 確認(rèn)和消除性能瓶頸369
5.14.1 程序剖析370
5.14.2 使用剖析程序來(lái)指導(dǎo)優(yōu)化371
5.14.3 Amdahl定律374
5.15 小結(jié)375
參考文獻(xiàn)說(shuō)明375
家庭作業(yè)376
練習(xí)題答案378
第6章 存儲(chǔ)器層次結(jié)構(gòu)382
6.1 存儲(chǔ)技術(shù)382
6.1.1 隨機(jī)訪問(wèn)存儲(chǔ)器383
6.1.2 磁盤(pán)存儲(chǔ)389
6.1.3 固態(tài)硬盤(pán)398
6.1.4 存儲(chǔ)技術(shù)趨勢(shì)399
6.2 局部性401
6.2.1 對(duì)程序數(shù)據(jù)引用的局部性402
6.2.2 取指令的局部性403
6.2.3 局部性小結(jié)403
6.3 存儲(chǔ)器層次結(jié)構(gòu)405
6.3.1 存儲(chǔ)器層次結(jié)構(gòu)中的緩存406
6.3.2 存儲(chǔ)器層次結(jié)構(gòu)概念小結(jié)408
6.4 高速緩存存儲(chǔ)器408
6.4.1 通用的高速緩存存儲(chǔ)器結(jié)構(gòu)409
6.4.2 直接映射高速緩存410
6.4.3 組相聯(lián)高速緩存416
6.4.4 全相聯(lián)高速緩存418
6.4.5 有關(guān)寫(xiě)的問(wèn)題420
6.4.6 一個(gè)真實(shí)的高速緩存層次結(jié)構(gòu)的解剖421
6.4.7 高速緩存參數(shù)的性能影響422
6.5 編寫(xiě)高速緩存友好的代碼423
6.6 綜合:高速緩存對(duì)程序性能的影響426
6.6.1 存儲(chǔ)器山426
6.6.2 重新排列循環(huán)以提高空間局部性430
6.6.3 在程序中利用局部性433
6.7 小結(jié)433
參考文獻(xiàn)說(shuō)明434
家庭作業(yè)434
練習(xí)題答案442
第二部分 在系統(tǒng)上運(yùn)行程序
第7章 鏈接448
7.1 編譯器驅(qū)動(dòng)程序449
7.2 靜態(tài)鏈接450
7.3 目標(biāo)文件450
7.4 可重定位目標(biāo)文件451
7.5 符號(hào)和符號(hào)表452
7.6 符號(hào)解析454
7.6.1 鏈接器如何解析多重定義的全局符號(hào)455
7.6.2 與靜態(tài)庫(kù)鏈接457
7.6.3 鏈接器如何使用靜態(tài)庫(kù)來(lái)解析引用460
7.7 重定位461
7.7.1 重定位條目461
7.7.2 重定位符號(hào)引用462
7.8 可執(zhí)行目標(biāo)文件465
7.9 加載可執(zhí)行目標(biāo)文件466
7.10 動(dòng)態(tài)鏈接共享庫(kù)467
7.11 從應(yīng)用程序中加載和鏈接共享庫(kù)468
7.12 與位置無(wú)關(guān)的代碼(PIC)471
7.13 處理目標(biāo)文件的工具473
7.14 小結(jié)473
參考文獻(xiàn)說(shuō)明474
家庭作業(yè)474
練習(xí)題答案479
第8章 異?刂屏480
8.1 異常481
8.1.1 異常處理481
8.1.2 異常的類(lèi)別482
8.1.3 Linux/IA32系統(tǒng)中的異常484
8.2 進(jìn)程487
8.2.1 邏輯控制流487
8.2.2 并發(fā)流487
8.2.3 私有地址空間488
8.2.4 用戶模式和內(nèi)核模式488
8.2.5 上下文切換489
8.3 系統(tǒng)調(diào)用錯(cuò)誤處理491
8.4 進(jìn)程控制492
8.4.1 獲取進(jìn)程ID492
8.4.2 創(chuàng)建和終止進(jìn)程492
8.4.3 回收子進(jìn)程495
8.4.4 讓進(jìn)程休眠499
8.4.5 加載并運(yùn)行程序500
8.4.6 利用fork和execve運(yùn)行程序502
8.5 信號(hào)504
8.5.1 信號(hào)術(shù)語(yǔ)505
8.5.2 發(fā)送信號(hào)506
8.5.3 接收信號(hào)509
8.5.4 信號(hào)處理問(wèn)題511
8.5.5 可移植的信號(hào)處理516
8.5.6 顯式地阻塞和取消阻塞信號(hào)517
8.5.7 同步流以避免討厭的并發(fā)錯(cuò)誤517
8.6 非本地跳轉(zhuǎn)521
8.7 操作進(jìn)程的工具524
8.8 小結(jié)524
參考文獻(xiàn)說(shuō)明525
家庭作業(yè)525
練習(xí)題答案530
第9章 虛擬存儲(chǔ)器534
9.1 物理和虛擬尋址535
9.2 地址空間535
9.3 虛擬存儲(chǔ)器作為緩存的工具536
9.3.1 DRAM緩存的組織結(jié)構(gòu)537
9.3.2 頁(yè)表537
9.3.3 頁(yè)命中538
9.3.4 缺頁(yè)538
9.3.5 分配頁(yè)面539
9.3.6 又是局部性救了我們539
9.4 虛擬存儲(chǔ)器作為存儲(chǔ)器管理的工具540
9.5 虛擬存儲(chǔ)器作為存儲(chǔ)器保護(hù)的工具541
9.6 地址翻譯542
9.6.1 結(jié)合高速緩存和虛擬存儲(chǔ)器544
9.6.2 利用TLB加速地址翻譯545
9.6.3 多級(jí)頁(yè)表546
9.6.4 綜合:端到端的地址翻譯547
9.7 案例研究:Intel Core i7/Linux存儲(chǔ)器系統(tǒng)550
9.7.1 Core i7地址翻譯551
9.7.2 Linux虛擬存儲(chǔ)器系統(tǒng)554
9.8 存儲(chǔ)器映射556
9.8.1 再看共享對(duì)象557
9.8.2 再看fork函數(shù)558
9.8.3 再看execve函數(shù)559
9.8.4 使用mmap函數(shù)的用戶級(jí)存儲(chǔ)器映射559
9.9 動(dòng)態(tài)存儲(chǔ)器分配561
9.9.1 malloc和free函數(shù)561
9.9.2 為什么要使用動(dòng)態(tài)存儲(chǔ)器分配563
9.9.3 分配器的要求和目標(biāo)564
9.9.4 碎片565
9.9.5 實(shí)現(xiàn)問(wèn)題565
9.9.6 隱式空閑鏈表565
9.9.7 放置已分配的塊567
9.9.8 分割空閑塊567
9.9.9 獲取額外的堆存儲(chǔ)器567
9.9.10 合并空閑塊568
9.9.11 帶邊界標(biāo)記的合并568
9.9.12 綜合:實(shí)現(xiàn)一個(gè)簡(jiǎn)單的分配器570
9.9.13 顯式空閑鏈表576
9.9.14 分離的空閑鏈表576
9.10 垃圾收集578
9.10.1 垃圾收集器的基本知識(shí)579
9.10.2 Mark&Sweep垃圾收集器580
9.10.3 C程序的保守Mark&Sweep580
9.11 C程序中常見(jiàn)的與存儲(chǔ)器有關(guān)的錯(cuò)誤581
9.11.1 間接引用壞指針582
9.11.2 讀未初始化的存儲(chǔ)器582
9.11.3 允許棧緩沖區(qū)溢出582
9.11.4 假設(shè)指針和它們指向的對(duì)象是相同大小的583
9.11.5 造成錯(cuò)位錯(cuò)誤583
9.11.6 引用指針,而不是它所指向的對(duì)象583
9.11.7 誤解指針運(yùn)算584
9.11.8 引用不存在的變量584
9.11.9 引用空閑堆塊中的數(shù)據(jù)584
9.11.10 引起存儲(chǔ)器泄漏585
9.12 小結(jié)585
參考文獻(xiàn)說(shuō)明586
家庭作業(yè)586
練習(xí)題答案589
第三部分 程序間的交互和通信
第10章 系統(tǒng)級(jí)I/O596
10.1 Unix I/O596
10.2 打開(kāi)和關(guān)閉文件597
10.3 讀和寫(xiě)文件598
10.4 用RIO包健壯地讀寫(xiě)599
10.4.1 RIO的無(wú)緩沖的輸入輸出函數(shù)600
10.4.2 RIO的帶緩沖的輸入函數(shù)600
10.5 讀取文件元數(shù)據(jù)604
10.6 共享文件606
10.7 I/O重定向608
10.8 標(biāo)準(zhǔn)I/O609
10.9 綜合:我該使用哪些I/O函數(shù)610
10.10 小結(jié)611
參考文獻(xiàn)說(shuō)明612
家庭作業(yè)612
練習(xí)題答案612
第11章 網(wǎng)絡(luò)編程614
11.1 客戶端-服務(wù)器編程模型614
11.2 網(wǎng)絡(luò)615
11.3 全球IP因特網(wǎng)618
11.3.1 IP地址619
11.3.2 因特網(wǎng)域名620
11.3.3 因特網(wǎng)連接623
11.4 套接字接口625
11.4.1 套接字地址結(jié)構(gòu)625
11.4.2 socket函數(shù)626
11.4.3 connect函數(shù)626
11.4.4 open_clientfd函數(shù)627
11.4.5 bind函數(shù)628
11.4.6 listen函數(shù)628
11.4.7 open_listenfd函數(shù)628
11.4.8 accept函數(shù)629
11.4.9 echo客戶端和服務(wù)器的示例630
11.5 Web服務(wù)器633
11.5.1 Web基礎(chǔ)633
11.5.2 Web內(nèi)容633
11.5.3 HTTP事務(wù)634
11.5.4 服務(wù)動(dòng)態(tài)內(nèi)容636
11.6 綜合:TINY Web服務(wù)器639
11.7 小結(jié)645
參考文獻(xiàn)說(shuō)明645
家庭作業(yè)646
練習(xí)題答案646
第12章 并發(fā)編程648
12.1 基于進(jìn)程的并發(fā)編程649
12.1.1 基于進(jìn)程的并發(fā)服務(wù)器649
12.1.2 關(guān)于進(jìn)程的優(yōu)劣651
12.2 基于I/O多路復(fù)用的并發(fā)編程651
12.2.1 基于I/O多路復(fù)用的并發(fā)事件驅(qū)動(dòng)服務(wù)器653
12.2.2 I/O多路復(fù)用技術(shù)的優(yōu)劣657
12.3 基于線程的并發(fā)編程657
12.3.1 線程執(zhí)行模型657
12.3.2 Posix線程658
12.3.3 創(chuàng)建線程659
12.3.4 終止線程659
12.3.5 回收已終止線程的資源660
12.3.6 分離線程660
12.3.7 初始化線程660
12.3.8 一個(gè)基于線程的并發(fā)服務(wù)器661
12.4 多線程程序中的共享變量662
12.4.1 線程存儲(chǔ)器模型663
12.4.2 將變量映射到存儲(chǔ)器663
12.4.3 共享變量664
12.5 用信號(hào)量同步線程664
12.5.1 進(jìn)度圖667
12.5.2 信號(hào)量668
12.5.3 使用信號(hào)量來(lái)實(shí)現(xiàn)互斥669
12.5.4 利用信號(hào)量來(lái)調(diào)度共享資源670
12.5.5 綜合:基于預(yù)線程化的并發(fā)服務(wù)器674
12.6 使用線程提高并行性676
12.7 其他并發(fā)問(wèn)題680
12.7.1 線程安全680
12.7.2 可重入性682
12.7.3 在線程化的程序中使用已存在的庫(kù)函數(shù)682
12.7.4 競(jìng)爭(zhēng)683
12.7.5 死鎖685
12.8 小結(jié)687
參考文獻(xiàn)說(shuō)明687
家庭作業(yè)688
練習(xí)題答案691
附錄A 錯(cuò)誤處理694
A.1 Unix系統(tǒng)中的錯(cuò)誤處理694
A.2 錯(cuò)誤處理包裝函數(shù)696
參考文獻(xiàn)698
深入理解計(jì)算機(jī)系統(tǒng)內(nèi)容簡(jiǎn)介
本書(shū)從程序員的視角詳細(xì)闡述計(jì)算機(jī)系統(tǒng)的本質(zhì)概念,并展示這些概念如何實(shí)實(shí)在在地影響應(yīng)用程序的正確性、性能和實(shí)用性。全書(shū)共12章,主要內(nèi)容包括信息的表示和處理、程序的機(jī)器級(jí)表示、處理器體系結(jié)構(gòu)、優(yōu)化程序性能、存儲(chǔ)器層次結(jié)構(gòu)、鏈接、異常控制流、虛擬存儲(chǔ)器、系統(tǒng)級(jí)I/O、網(wǎng)絡(luò)編程、并發(fā)編程等。書(shū)中提供大量的例子和練習(xí),并給出部分答案,有助于讀者加深對(duì)正文所述概念和知識(shí)的理解。
本書(shū)的最大優(yōu)點(diǎn)是為程序員描述計(jì)算機(jī)系統(tǒng)的實(shí)現(xiàn)細(xì)節(jié),幫助其在大腦中構(gòu)造一個(gè)層次型的計(jì)算機(jī)系統(tǒng),從最底層的數(shù)據(jù)在內(nèi)存中的表示到流水線指令的構(gòu)成,到虛擬存儲(chǔ)器,到編譯系統(tǒng),到動(dòng)態(tài)加載庫(kù),到最后的用戶態(tài)應(yīng)用。通過(guò)掌握程序是如何映射到系統(tǒng)上,以及程序是如何執(zhí)行的,讀者能夠更好地理解程序的行為為什么是這樣的,以及效率低下是如何造成的。
本書(shū)適合那些想要寫(xiě)出更快、更可靠程序的程序員閱讀,也適合作為高等院校計(jì)算機(jī)及相關(guān)專(zhuān)業(yè)本科生、研究生的教材。
深入理解計(jì)算機(jī)系統(tǒng)內(nèi)容截圖
- PC官方版
- 安卓官方手機(jī)版
- IOS官方手機(jī)版