.NET Core 底層入門

老農;劉浩楊

  • 出版商: 北京航空航天大學
  • 出版日期: 2020-01-01
  • 售價: $594
  • 貴賓價: 9.5$564
  • 語言: 簡體中文
  • 頁數: 523
  • 裝訂: 平裝
  • ISBN: 7512431953
  • ISBN-13: 9787512431959
  • 相關分類: .NET
  • 立即出貨 (庫存 < 3)

買這商品的人也買了...

商品描述

本書講解了.NET Core公共語言運行時的底層實現,從介紹MSIL和x86彙編語言開始,到講解異常、
多線程、GC以及JIT編譯器的實現原理與實現細節。
本書包含了大量圖表讓讀者可以更容易了解其中的內容,
同時涉及到.NET Core底層實現的部分還給出了對應的源代碼鏈接,
讓讀者可以參考源代碼有更深入的理解。
此外,本書還有相關提問用的倉庫和QQ 群便於讀者交流,詳見序言。

本書主要面向有一年以上.NET (C#)開發經驗的開發者,
其他程序語言的開發者也可以閱讀本書來比較.NET Core與其他語言的運行時之間有哪些共同點和不同點,
本書的知識可以為讀者在編寫高性能應用或底層應用時提供有力的支持。

作者簡介

老農

開源MVC框架ZKWeb的作者,對C++和x86彙編有多年研究,
熟悉逆向分析和性能優化。


劉浩楊

高級軟件工程師,關注應用性能管理(APM)和高級語言虛擬機實現,熟悉Web應用性能優化,對MSIL和CLR有深入了解。
開源愛好者,開源AOP框架AspectCore作者,Apache SkyWalking APM的.NET Core探針作者。

目錄大綱

目錄
第1章公共語言運行時概述1
1.1.1.NET框架簡介1
1.1.2公共語言運行時中的各個組成部分3
1.1.3名稱規範5

第2章MSIL入門7
第1節逆向.NET程序到IL7
2.1.1ildasm7
2.1.2使用ILSpy10
2.1.3dnSpy10
第2節基礎語法11
2.2.1IL語法格式11
2.2.2IL指令格式17
2.2.3評價堆棧18
2.2.4常用指令19
2.2.5常見的C#代碼與IL代碼的對比21
第3節流程控制26
2.3.1IL流程控制26
2.3.2常見的流程控制C#代碼與IL代碼對比28

第3章x86彙編入門37
第1節彙編與機器碼37
3.1.1理解彙編語言與機器碼37
3.1.2RISC與CISC42
3.1.3流水線42
第2節內存44
3.2.1位與字節44
3.2.2負數的表現46
3.2.3小端與大端47
3.2.4內存地址47
3.2.5虛擬內存48
3.2.6了解虛擬內存的實現50
第3節寄存器50
3.3.1通用寄存器50
3.3.2程序計數器52
3.3.3標誌寄存器52
第4節基礎指令55
3.4.1彙編指令記法55
3.4.2彙編指令格式56
3.4.3彙編指令簡寫57
3.4.4基礎彙編指令58
3.4.5更多指令68
3.4.6機器碼的編碼方式68
第5節流程控制69
3.5.1流程控制實現69
3.5.2比較指令70
3.5.3跳轉指令73
3.5.4其他流程控制77
3.5.5分支預測79
第6節函數調用82
3.6.1棧結構82
3.6.2函數調用85
3.6.3enter與leave指令89
3.6.4調用規範89
第7節系統調用91
3.7.1系統調用簡介91
3.7.2在x86上發起系統調用(軟中斷)92
3.7.3在x86上發起系統調用(sysenter)93
3.7.4在x8664上發起系統調用(syscall)94
第8節內存屏障95
3.8.1亂序執行95
3.8.2內存屏障簡介96
3.8.3雙檢鎖97

第4章編譯與調試CoreCLR100
第1節在Windows上編譯CoreCLR100
4.1.1準備編譯環境100
4.1.2下載CoreCLR源代碼101
4.1.3編譯CoreCLR102
4.1.4使用編譯出來的CoreCLR103
4.1.5最新的編譯文檔103
第2節在Windows上調試CoreCLR104
4.2.1使用Visual Studio調試CoreCLR104
4.2.2使用WinDbg調試CoreCLR105
4.2.3在WinDbg中使用SOS擴展109
4.2.4更方便地調試託管方法對應的彙編代碼113
第3節在Linux上編譯CoreCLR113
第4節在Linux上調試CoreCLR116
4.4.1使用LLDB調試CoreCLR116
4.4.2在LLDB中使用SOS擴展119

第5章異常處理實現126
第1節異常處理簡介126
5.1.1通過返回值報告錯誤與通過異常報告錯誤的區別126
5.1.2.NET中的異常處理129
第2節用戶異常的觸發132
5.2.1用戶異常132
5.2.2通過throw關鍵詞拋出異常133
5.2.3調用.NET運行時內部函數拋出異常135
5.2.4JIT編譯時自動插入拋出異常的代碼135
5.2.5CoreCLR中的相關代碼137
第3節硬件異常的觸發137
5.3.1硬件異常137
5.3.2訪問null對象的字段時拋出異常138
5.3.3調用null對象的方法時拋出異常142
5.3.4對整數進行零除時的處理144
5.3.5CoreCLR中的相關代碼146
第4節異常處理實現146
5.4.1異常處理的過程146
5.4.2捕捉異常並獲取拋出異常的位置147
5.4.3通過調用鏈跟踪獲取拋出異常的函數與所有調用來源148
5.4.4獲取函數元數據中的異常處理表150
5.4.5枚舉異常處理表調用對應的finally塊與catch塊151
5.4.6重新拋出異常的處理151
5.4.7CoreCLR中的相關代碼153
第5節異常處理對性能的影響154

第6章多線程實現158
第1節原生線程158
6.1.1原生線程簡介158
6.1.2上下文切換159
6.1.3線程調度​​​​161
6.1.4棧空間161
第2節託管線程162
6.2.1託管線程簡介162
6.2.2託管線程對象163
6.2.3創建託管線程的例子163
6.2.4前台線程與後台線程164
6.2.5CoreCLR中的相關代碼166
第3節搶佔模式與合作模式166
6.3.1切換模式的實現167
6.3.2CoreCLR中的相關代碼169
第4節線程本地儲存169
6.4.1ThreadStatic Attribute屬性的實現171
6.4.2ThreadLocal類的實現172
6.4.3CoreCLR中的相關代碼175
第5節原子操作175
6.5.1原子操作簡介175
6.5.2.NET中的原子操作179
6.5.3無鎖算法182
6.5.4CoreCLR中的相關代碼183
第6節自旋鎖184
6.6.1線程鎖184
6.6.2使用Thread.SpinWait實現自旋鎖185
6.6.3使用System.Threading.SpinWait代替187
6.6.4使用System.Threading.SpinLock實現自旋鎖188
6.6.5Thread.Sleep(0)與Thread.Yield的區別189
6.6.6使用pause指令的另一個原因190
6.6.7CoreCLR中的相關代碼190
第7節互斥鎖191
第8節混合鎖與lock語句197
6.8.1線程中止安全200
6.8.2CoreCLR中的相關代碼201
第9節信號量204
6.9.1輕量信號量206
6.9.2通過信號量實現生產者—消費者模式206
6.9.3通過Monitor類實現生產者—消費者模式208
6.9.4CoreCLR中的相關代碼210
第10節讀寫鎖213
第11節異步操作216
6.11.1阻塞操作216
6.11.2事件循環機制217
6.11.3異步編程模型219
6.11.4異步編程模型的實現原理221
6.11.5任務並行庫224
6.11.6任務並行庫的實現原理226
6.11.7ValueTask229
6.11.8async與await關鍵字的例子230
6.11.9async與await關鍵字的實現原理231
6.11.10堆積的協程與無堆的協程239
6.11.11CoreCLR中的相關代碼239
第12節執行上下文242
6.12.1異步本地變量與執行上下文242
6.12.2CoreCLR中的相關代碼247
第13節同步上下文248
6.13.1同步上下文的使用例子(基於WinForm)249
6.13.2自定義同步上下文實現252
6.13.3CoreCLR中的相關代碼258

第7章GC垃圾回收實現260
第1節GC簡介260
7.1.1棧空間與堆空間260
7.1.2值類型與引用類型261
7.1.3.NET中的GC263
7.1.4垃圾回收VS引用計數271
第2節對象內存結構271
7.2.1值類型對象的內存結構271
7.2.2引用類型對象的內存結構273
7.2.3存活標記與固定標記276
7.2.4裝箱與拆箱277
7.2.5CoreCLR中的相關代碼278
第3節託管堆結構280
7.3.1.NET程序的內存結構280
7.3.2託管堆與堆段282
7.3.3分配上下文284
7.3.4分代的實現286
7.3.5自由對象列表287
7.3.6跨代引用記錄289
7.3.7析構對象列表與析構隊列291
7.3.8CoreCLR中的相關代碼291
第4節分配對象流程293
7.4.1new關鍵字生成的代碼293
7.4.2從託管堆分配空間的內部函數297
7.4.3分配小對象的流程299
7.4.4分配大對象的流程299
7.4.5記錄包含析構函數的對像到析構對象列表302
7.4.6CoreCLR中的相關代碼302
第5節垃圾回收流程303
7.5.1GC的觸發303
7.5.2執行GC的線程306
7.5.3GC的總體流程307
7.5.4重新決定目標代309
7.5.5判斷是否應該執行後台GC311
7.5.6CoreCLR中的相關代碼312
第6節標記階段314
7.6.1獲取根對象314
7.6.2遞歸掃描根對象並設置存活標記315
7.6.3通過卡片表掃描跨代引用並設置存活標記318
7.6.4枚舉強引用GC句柄並設置存活標記318
7.6.5枚舉固定GC句柄並設置固定標記319
7.6.6枚舉弱引用GC句柄並清空不再存活對象引用319
7.6.7掃描析構對象列表並添加不再存活對像到析構隊列319
7.6.8枚舉跟踪復活弱引用GC句柄並清空不再存活對象引用320
7.6.9決定是否啟用升代320
7.6.10CoreCLR中的相關代碼321
第7節計劃階段323
7.7.1構建Plug樹323
7.7.2構建Brick表324
7.7.3模擬壓縮325
7.7.4判斷是否執行壓縮與新建短暫堆段327
7.7.5CoreCLR中的相關代碼328
第8節重定位階段328
7.8.1修改對象引用地址328
7.8.2CoreCLR中的相關代碼330
第9節壓縮階段330
7.9.1複製對象值330
7.9.2結束GC332
7.9.3CoreCLR中的相關代碼333
第10節清掃階段333
7.10.1創建自由對象並加到自由列表333
7.10.2結束GC334
7.10.3CoreCLR中的相關代碼334
第11節後台GC335
7.11.1後台標記階段335
7.11.2後台清掃階段336
7.11.3CoreCLR中的相關代碼337
第12節調整GC行為338
7.12.1設置GC模式338
7.12.2設置延遲模式339
7.12.3設置延遲等級340
7.12.4開啟無GC區域341
7.12.5開啟大對象堆壓縮342
7.12.6保留堆段空間地址342
7.12.7更多選項(針對.NET Core)343
第13節獲取GC信息344
7.13.1獲取GC執行次數344
7.13.2註冊完整GC觸發前的通知345
7.13.3在Windows系統上使用ETW捕捉GC事件347
7.13.4在Linux系統上使用Lttng捕捉GC事件350
7.13.5使用EventListener捕捉GC事件351

第8章JIT編譯器實現354
第1節JIT簡介354
8.1.1JIT編譯器354
8.1.2.NET中的RyuJIT編譯器356
8.1.3在Visual Studio中查看生成的彙編代碼356
8.1.4使用JITDump日誌查看JIT編譯流程與生成的彙編代碼357
第2節JIT編譯流程358
8.2.1JIT的觸發358
8.2.2分層編譯360
8.2.3JIT編譯流程362
8.2.4CoreCLR中的相關代碼363
第3節IR結構366
8.3.1HIR與LIR366
8.3.2HIR的結構367
8.3.3HIR的例子367
8.3.4LIR的結構372
8.3.5LIR的例子372
8.3.6常見