記憶體不相容會怎樣的問題,透過圖書和論文來找解法和答案更準確安心。 我們找到下列懶人包和總整理

記憶體不相容會怎樣的問題,我們搜遍了碩博士論文和台灣出版的書籍,推薦徐波寫的 Go語言從入門到進階實戰(視頻教學版) 和(美)馬克·拉希諾維奇(美)大衛·A.所羅門(美)艾力克斯·伊納蘇的 深入解析Windows操作系統.下冊(第6版)都 可以從中找到所需的評價。

這兩本書分別來自機械工業 和電子工業所出版 。

接下來讓我們看這些論文和書籍都說些什麼吧:

除了記憶體不相容會怎樣,大家也想知道這些:

Go語言從入門到進階實戰(視頻教學版)

為了解決記憶體不相容會怎樣的問題,作者徐波 這樣論述:

本書採用“理論+實例”的形式編寫,作者通過大量實例,並結合多年的一線開發實戰經驗,全面介紹了Go語言的語法及應用開發。作者特意為本書精心錄製了同步配套教學視頻,這將極大地提升讀者的學習效率。本書分為13章,主要介紹了Go語言的特性與環境搭建、基本語法與使用、容器(存儲和組織資料的方式)、流程控制、函數、結構體、介面(interface)、包(package)、併發、反射、編譯與工具和開發技巧等內容,後的實戰演練部分剖析了作者的開源網路庫cellnet的架構及設計思想,並且實現了Socket聊天功能。本書對於Go語言的特色功能——併發,有全面、深入的講解,需要讀者重點學習。本書特別適合Go語言初

學者入門和進階閱讀,另外也適合社會培訓學校作為教材使用,還適合大中專院校的相關專業作為教學參考書。 徐波,資深全棧遊戲開發者,慕課網特邀講師,開源愛好者,Gopher之一。遊戲行業從業十余年。曾就職于著名的網路遊戲公司Possibility Space,與暴雪星際爭霸程序Gage Galinge和美術界知名原畫師朱峰(變形金剛電影版紅蜘蛛設計者)一起開發了大型3D暗黑系魔幻網游Warrior Epic。業界最早實現了微端Download On Demand技術。2009年開設戰魂小築博客。2012年開始使用Go語言,並在GitHub上發布了cellnet網路庫及tabtoy導

表工具,深受業界讚譽。作為慕課網特邀講師,製作了多個技術視頻,講授Go語言、Cocos和Unity等課程,廣受學員好評。 前言 第1章 初識Go語言1 1.1 Go語言特性1 1.2 使用Go語言的專案9 1.3 怎樣安裝Go語言開發包10 1.3.1 Windows版安裝11 1.3.2 Linux版安裝13 1.4 搭建開發環境14 1.4.1 整合式開發環境——Jetbrains GoLand14 1.4.2 方便定義功能的編輯器——Visual Studio Code15 第2章 Go語言基本語法與使用19 2.1 變數19 2.1.1 聲明變數19 2.1.2

初始化變數20 2.1.3 多個變數同時賦值23 2.1.4 匿名變數——沒有名字的變數24 2.2 資料類型24 2.2.1 整型25 2.2.2 浮點型25 2.2.3 示例:輸出正弦函數(Sin)圖像26 2.2.4 布林型28 2.2.5 字串29 2.2.6 字元31 2.2.7 切片——能動態分配的空間32 2.3 轉換不同的資料類型33 2.4 指針34 2.4.1 認識指標位址和指標類型35 2.4.2 從指標獲取指標指向的值36 2.4.3 使用指針修改值37 2.4.4 示例:使用指標變數獲取命令列的輸入資訊39 2.4.5 創建指標的另一種方法——new()函數40 2.

5 變數生命期——變數能夠使用的代碼範圍40 2.5.1 什麼是棧41 2.5.2 什麼是堆42 2.5.3 變數逃逸(Escape Analysis)——自動決定變數分配方式,提高運行效率43 2.6 字串應用46 2.6.1 計算字串長度46 2.6.2 遍歷字串——獲取每一個字串元素47 2.6.3 獲取字串的某一段字元48 2.6.4 修改字串49 2.6.5 連接字串49 2.6.6 格式化50 2.6.7 示例:Base64編碼——電子郵件的基礎編碼格式51 2.6.8 示例:從INI設定檔中查詢需要的值52 2.7 常量——恒定不變的值57 2.7.1 枚舉——一組常量值58 2

.7.2 將枚舉值轉換為字串59 2.8 類型別名(Type Alias)60 2.8.1 區分類型別名與類型定義61 2.8.2 非本地類型不能定義方法62 2.8.3 在結構體成員嵌入時使用別名63 第3章 容器:存儲和組織資料的方式65 3.1 陣列——固定大小的連續空間65 3.1.1 聲明陣列66 3.1.2 初始化陣列66 3.1.3 遍歷陣列——訪問每一個陣列元素67 3.2 切片(slice)——動態分配大小的連續空間67 3.2.1 從陣列或切片生成新的切片68 3.2.2 聲明切片70 3.2.3 使用make()函數構造切片71 3.2.4 使用append()函數為切

片添加元素71 3.2.5 複製切片元素到另一個切片73 3.2.6 從切片中刪除元素74 3.3 映射(map)——建立事物關聯的容器76 3.3.1 添加關聯到map並訪問關聯和資料76 3.3.2 遍歷map的“鍵值對”——?訪問每一個map中的關聯關係77 3.3.3 使用delete()函數從map中刪除鍵值對79 3.3.4 清空map中的所有元素79 3.3.5 能夠在併發環境中使用的map——?sync.Map79 3.4 列表(list)——可以快速增刪的非連續空間的容器81 3.4.1 初始化列表83 3.4.2 在清單中插入元素83 3.4.3 從清單中刪除元素84 3.

4.4 遍歷清單——訪問清單的每一個元素85 第4章 流程控制87 4.1 條件判斷(if)87 4.2 構建迴圈(for)88 4.2.1 for中的初始語句——開始迴圈時執行的語句89 4.2.2 for中的條件運算式——控制是否迴圈的開關89 4.2.3 for中的結束語句——每次迴圈結束時執行的語句90 4.3 示例:九九乘法表90 4.4 鍵值迴圈(for range)——直接獲得物件的索引和資料91 4.4.1 遍歷陣列、切片——獲得索引和元素92 4.4.2 遍歷字串——獲得字元92 4.4.3 遍歷map——獲得map的鍵和值92 4.4.4 遍歷通道(channel)——接

收通道資料93 4.4.5 在遍歷中選擇希望獲得的變數93 4.5 分支選擇(switch)——擁有多個條件分支的判斷94 4.5.1 基本寫法95 4.5.2 跨越case的fallthrough——相容C語言的case設計96 4.6 跳轉到指定代碼標籤(goto)96 4.6.1 使用goto退出多層迴圈96 4.6.2 使用goto集中處理錯誤97 4.6.3 統一錯誤處理98 4.7 跳出指定迴圈(break)——可以跳出多層迴圈99 4.8 繼續下一次迴圈(continue)100 第5章 函數(function)101 5.1 聲明函數101 5.1.1 普通函數的聲明形式10

1 5.1.2 參數類型的簡寫102 5.1.3 函數的返回值102 5.1.4 調用函數104 5.1.5 示例:將“秒”解析為時間單位104 5.1.6 示例:函數中的參數傳遞效果測試105 5.2 函數變數——把函數作為值保存到變數中108 5.3 示例:字串的鏈式處理——操作與資料分離的設計技巧109 5.4 匿名函數——沒有函數名字的函數112 5.4.1 定義一個匿名函數112 5.4.2 匿名函數用作回呼函數113 5.4.3 使用匿名函數實現操作封裝113 5.5 函數類型實現介面——把函數作為介面來調用115 5.5.1 結構體實現介面115 5.5.2 函數體實現介面116

...... 5.6 閉包(Closure)——引用了外部變數的匿名函數118 5.6.1 在閉包內部修改引用的變數119 5.6.2 示例:閉包的記憶效應119 5.6.3 示例:閉包實現生成器121 5.7 可變參數——參數數量不固定的函數形式122 5.7.1 fmt包中的例子122 5.7.2 遍歷可變參數列表——獲取每一個參數的值123 5.7.3 獲得可變參數類型——獲得每一個參數的類型124 5.7.4 在多個可變參數函數中傳遞參數125 5.8 延遲執行語句(defer)127 5.8.1 多個延遲執行語句的處理順序127 5.8.2 使用延遲執行語句在函數退出時釋放資源12

7 5.9 處理運行時發生的錯誤131 5.9.1 net包中的例子131 5.9.2 錯誤介面的定義格式132 5.9.3 自訂一個錯誤132 5.9.4 示例:在解析中使用自訂錯誤133 5.10 宕機(panic)——程式終止運行135 5.10.1 手動觸發宕機135 5.10.2 在運行依賴的必備資源缺失時主動觸發宕機136 5.10.3 在宕機時觸發延遲執行語句136 5.11 宕機恢復(recover)——防止程式崩潰137 5.11.1 讓程式在崩潰時繼續執行137 5.11.2 panic和recover的關係139 第6章 結構體(struct)141 6.1 定義結構體

141 6.2 產生實體結構體——為結構體分配記憶體並初始化142 6.2.1 基本的產生實體形式142 6.2.2 創建指標類型的結構體143 6.2.3 取結構體的位址產生實體143 6.3 初始化結構體的成員變數144 6.3.1 使用“鍵值對”初始化結構體145 6.3.2 使用多個值的清單初始化結構體146 6.3.3 初始化匿名結構體147 6.4 構造函數——結構體和類型的一系列初始化操作的函數封裝148 6.4.1 多種方式創建和初始化結構體——類比構造函數重載149 6.4.2 帶有父子關係的結構體的構造和初始化——模擬父級構造調用149 6.5 方法150 6.5.1 為結

構體添加方法151 6.5.2 接收器——方法作用的目標152 6.5.3 示例:二維向量模擬玩家移動155 6.5.4 為類型添加方法160 6.5.5 示例:使用事件系統實現事件的回應和處理165 6.6 類型內嵌和結構體內嵌170 6.6.1 聲明結構體內嵌170 6.6.2 結構內嵌特性172 6.6.3 使用組合思想描述物件特性173 6.6.4 初始化結構體內嵌174 6.6.5 初始化內嵌匿名結構體175 6.6.6 成員名字衝突177 6.7 示例:使用匿名結構體分離JSON資料178 第7章 介面(interface)181 7.1 聲明介面181 7.1.1 介面聲明的格

式181 7.1.2 開發中常見的介面及寫法182 7.2 實現介面的條件182 7.2.1 介面被實現的條件一:介面的方法與實現介面的類型方法格式一致182 7.2.2 條件二:介面中所有方法均被實現185 7.3 理解類型與介面的關係186 7.3.1 一個類型可以實現多個介面186 7.3.2 多個類型可以實現相同的介面187 7.4 示例:便於擴展輸出方式的日誌系統189 7.5 示例:使用介面進行資料的排序195 7.5.1 使用sort.Interface介面進行排序195 7.5.2 常見類型的便捷排序197 7.5.3 對結構體資料進行排序199 7.6 介面的嵌套組合——將多

個介面放在一個介面內202 7.7 在介面和類型間轉換205 7.7.1 類型斷言的格式205 7.7.2 將介面轉換為其他介面205 7.7.3 將介面轉換為其他類型208 7.8 空介面類別型(interface{})——能保存所有值的類型208 7.8.1 將值保存到空介面209 7.8.2 從空介面獲取值209 7.8.3 空介面的值比較210 7.9 示例:使用空介面實現可以保存任意值的字典211 7.10 類型分支——批量判斷空介面中變數的類型214 7.10.1 類型斷言的書寫格式214 7.10.2 使用類型分支判斷基本類型215 7.10.3 使用類型分支判斷介面類別型215

7.11 示例:實現有限狀態機(FSM)217 第8章 包(package)227 8.1 工作目錄(GOPATH)227 8.1.1 使用命令列查看GOPATH資訊227 8.1.2 使用GOPATH的工程結構228 8.1.3 設置和使用GOPATH229 8.1.4 在多專案工程中使用GOPATH230 8.2 創建包package——編寫自己的代碼擴展231 8.3 匯出識別字——讓外部訪問包的類型和值231 8.3.1 匯出包內識別字231 8.3.2 匯出結構體及介面成員232 8.4 導入包(import)——在代碼中使用其他的代碼232 8.4.1 默認導入的寫法233 8

.4.2 導入包後自訂引用的包名234 8.4.3 匿名導入包——只導入包但不使用包內類型和數值235 8.4.4 包在程式啟動前的初始化入口:init235 8.4.5 理解包導入後的init()函數初始化順序235 8.5 示例:工廠模式自動註冊——管理多個包的結構體237 第9章 併發241 9.1 羽量級執行緒(goroutine)——根據需要隨時創建的“執行緒”241 9.1.1 使用普通函數創建goroutine241 9.1.2 使用匿名函數創建goroutine244 9.1.3 調整併發的運行性能(GOMAXPROCS)245 9.1.4 理解併發和並行245 9.1.5

Go語言的協作程式(goroutine)和普通的協作程式(coroutine)246 9.2 通道(channel)——在多個goroutine間通信的管道246 9.2.1 通道的特性247 9.2.2 聲明通道類型247 9.2.3 創建通道248 9.2.4 使用通道發送資料248 9.2.5 使用通道接收資料249 9.2.6 示例:併發列印252 9.2.7 單向通道——通道中的單行道254 9.2.8 帶緩衝的通道255 9.2.9 通道的多工——同時處理接收和發送多個通道的資料257 9.2.10 示例:模擬遠端程序呼叫(RPC)258 9.2.11 示例:使用通道回應計時器的事

件261 9.2.12 關閉通道後繼續使用通道264 9.3 示例:Telnet回音伺服器——TCP伺服器的基本結構266 9.4 同步——保證併發環境下資料訪問的正確性273 9.4.1 競態檢測——檢測代碼在併發環境下可能出現的問題273 9.4.2 互斥鎖(sync.Mutex)——保證同時只有一個goroutine可以訪問共用資源275 9.4.3 讀寫互斥鎖(sync.RWMutex)——在讀比寫多的環境下比互斥鎖更高效277 9.4.4 等待組(sync.WaitGroup)——保證在併發環境中完成指定數量的任務277 第10章 反射280 10.1 反射的類型對象(reflec

t.Type)280 10.1.1 理解反射的類型(Type)與種類(Kind)281 10.1.2 指標與指標指向的元素283 10.1.3 使用反射獲取結構體的成員類型284 10.1.4 結構體標籤(Struct Tag)——對結構體欄位的額外資訊標籤287 10.2 反射的值對象(reflect.Value)288 10.2.1 使用反射值物件包裝任意值288 10.2.2 從反射值對象獲取被包裝的值289 10.2.3 使用反射訪問結構體的成員欄位的值290 10.2.4 反射物件的空和有效性判斷292 10.2.5 使用反射值物件修改變數的值293 10.2.6 通過類型創建類型的

實例297 10.2.7 使用反射調用函數298 10.3 示例:將結構體的資料保存為JSON格式的文本資料299 第11章 編譯與工具306 11.1 編譯(go build)306 11.1.1 go build 無參數編譯306 11.1.2 go build+文件列表307 11.1.3 go build +包308 11.1. 4 go build編譯時的附加參數310 11.2 編譯後運行(go run)310 11.3 編譯並安裝(go install)311 11.4 一鍵獲取代碼、編譯並安裝(go get)312 11.4.1 遠端包的路徑格式312 11.4.2 go g

et + 遠程包312 11.4.3 go get使用時的附加參數313 11.5 測試(go test)313 11.5.1 單元測試——測試和驗證代碼的框架313 11.5.2 基準測試——獲得代碼記憶體佔用和運行效率的性能資料316 11.6 性能分析(go pprof)——發現代碼性能問題的調用位置319 11.6.1 安裝協力廠商圖形化顯式分析資料工具(Graphviz)319 11.6.2 安裝協力廠商性能分析來分析代碼包319 11.6.3 性能分析代碼319 第12章 “避坑”與技巧323 12.1 合理地使用併發特性323 12.1.1 瞭解goroutine的生命期時再創

建goroutine323 12.1.2 避免在不必要的地方使用通道326 12.2 反射:性能和靈活性的雙刃劍330 12.3 介面的nil判斷335 12.4 map的多鍵索引——多個數值條件可以同時查詢336 12.4.1 基於雜湊值的多鍵索引及查詢337 12.4.2 利用map特性的多鍵索引及查詢341 12.4.3 總結342 12.5 優雅地處理TCP粘包342 第13章 實戰演練——剖析cellnet網路庫設計並實現Socket聊天功能354 13.1 瞭解cellet網路庫特性、流程及架構354 13.1.1 cellnet網路庫的特性354 13.1.2 cellnet網

路庫的流程及架構356 13.2 管理TCP Socket連接356 13.2.1 理解Socket的事件類型357 13.2.2 管理事件回檔359 13.2.3 連接器(Connector)361 13.2.4 會話管理(SessionManager)363 13.2.5 接受器(Acceptor)366 13.3 組織接收和發送資料流程程的Socket會話(Session)367 13.3.1 在會話開始時啟動goroutine和派發事件368 13.3.2 會話中的接收資料迴圈369 13.3.3 會話中的發送資料迴圈370 13.4 排隊處理事件的事件佇列(EventQueue)37

2 13.4.1 實現事件佇列372 13.4.2 使用不同的事件佇列模式處理資料374 13.5 消息編碼(codec)——讓cellnet支援消息的多種編碼格式377 13.6 消息元資訊(MessageMeta)——消息ID、消息名稱和消息類型的關聯關係379 13.6.1 理解消息元資訊380 13.6.2 註冊消息元資訊380 13.6.3 示例:使用消息元資訊381 13.6.4 實現消息的編碼(EncodeMessage())和解碼(DecodeMessage())函數382 13.7 接收和發送封包(packet)383 13.7.1 接收可變長度封包384 13.7.2 瞭解

封包資料讀取器(PacketReader)385 13.7.3 瞭解封包資料寫入器(PacketWriter)387 13.7.4 讀取自訂封包及數據387 13.7.5 寫入自訂封包及資料389 13.7.6 回應訊息處理事件390 13.8 使用cellnet網路庫實現聊天功能392 13.8.1 定義聊天協議393 13.8.2 實現用戶端功能394 13.8.3 實現伺服器功能396 13.8.4 運行聊天伺服器和用戶端398

深入解析Windows操作系統.下冊(第6版)

為了解決記憶體不相容會怎樣的問題,作者(美)馬克·拉希諾維奇(美)大衛·A.所羅門(美)艾力克斯·伊納蘇 這樣論述:

本書是Windows技術權威參考書的最新版本,本書主要介紹了基於Windows 7 and Windows Server 2008 R2的核心技術與底層技術,全面闡釋Windows技術機理,是廣大Windows開發人員必備的參考書。 Mark Russinovich(馬克·拉希諾維奇)是微軟windows Azure組技術人員,是Sysinternals工具的作者之一,合著了《深入解析Windows作業系統》系列圖書;David A.Solomon(大衛·A.所羅門)是《深入解析Windows作業系統》系列圖書的合著者,並為全球成千上萬的開發人員和IT專業人士,包括微軟員

工,講授Windows內幕課程。他時常在微軟舉辦的會議中發言,包括TechNet和PDC。 范德成,2004年畢業于上海交通大學,在微軟和 SAP公司有多年專案經驗,構建了微型開源專案Robbie’s Shell。   潘愛民,任職于阿裡巴巴,長期從事軟體和系統技術的研究與開發工作,撰寫了大量軟體技術文章,著譯了多部經典計機圖書,在國內外學術刊物上發 表了30多篇文章。曾經任教於北京大學和清華大學(兼職),後進入工業界,先後任職于微軟亞洲研究院、盛大網路發展有限公司和阿裡雲計算有限公司,目前也 是工信部移動作業系統專家組成員。潘愛民先生獲得了數學學士學位和電腦科學博士學位,主要研究領域包括軟

體設計、資訊安全、作業系統和互聯網技術。 第8章 I/O系統1 8.1I/O系統元件1 I/O管理器3 典型的I/O處理過程4 8.2設備驅動程式5 設備驅動程式的類型5 WDM驅動程式6 分層的驅動程式7 實驗:查看已載入的驅動程式清單9 驅動程式的結構11 驅動程式物件和設備物件13 實驗:看一看設備物件15 實驗:顯示驅動程式和設備物件17 打開設備18 實驗:查看設備控制碼21 實驗:查看Windows設備名稱之間的映射23 8.3I/O處理24 I/O類型24 同步I/O和非同步I/O24 快速I/O25 實驗:查看一個驅動程式登記的快速I/O常式25 映射文件I

/O和文件緩存26 分散/聚集I/O27 I/O請求包27 IRP棧單元28 實驗:查看驅動程式的分發常式29 實驗:查看一個執行緒的未完成IRP29 IRP緩衝區管理30 針對單層驅動程式的I/O請求32 為一個中斷提供服務33 完成一個I/O請求34 同步36 針對分層的驅動程式的I/O請求38 實驗:查看一個設備棧39 實驗:查看IRP40 執行緒無關I/O45 I/O取消45 用戶發起的I/O取消46 執行緒終止時的I/O取消47 實驗:調試一個無法被殺死的進程48 I/O完成埠49 IoCompletion對象50 使用完成埠50 I/O完成埠操作52 I/O優先順序支持54 I/O

優先順序54 優先化策略55 I/O優先順序反轉的避免(I/O優先順序繼承)57 I/O優先順序提升和撞升57 實驗:“非常低”和“正常”I/O輸送量的對比58 實驗:I/O優先順序提升/撞升的性能分析59 頻寬預留(計畫的檔I/O)60 容器通知60 驅動程式檢驗器(DriverVerifier)61 8.4核心模式驅動程式框架(KMDF)63 KMDF驅動程式的結構和操作64 實驗:顯示KMDF驅動程式65 KMDF資料模型66 KMDF的I/O模型69 8.5使用者模式驅動程式框架(UMDF)72 8.6隨插即用(PnP)管理器76 隨插即用支持的級別77 驅動程式對於隨插即用的支援77

驅動程式載入、初始化和安裝79 Start值80 設備列舉81 實驗:將設備樹轉儲出來84 設備棧85 設備棧的驅動程式載入86 實驗:在裝置管理員中查看詳細的devnode資訊88 驅動程式安裝90 實驗:檢查一個驅動程式的INF檔92 實驗:查看目錄(catalog)檔93 8.7電源管理器94 電源管理器的操作96 驅動程式的電源操作97 實驗:查看一個驅動程式的電源映射關係97 實驗:查看系統的電源能力和策略98 驅動程式和應用程式對於設備電源的控制100 電源可用性請求100 實驗:在調試器中查看一個電源可用性請求101 實驗:利用Powercfg查看電源可用性請求103 處理器電

源管理(PPM)103 核心停運的策略104 利用率函數105 實驗:查看利用率和頻率的資訊106 實驗:查看利用率和頻率的歷史107 演算法覆蓋108 增加/減少動作108 各種閾值和策略的設置109 實驗:查看當前的核心停運策略111 “性能檢查”演算法112 實驗:查看當前的PPM檢查資訊116 8.8本章總結118 第9章 存儲管理119 9.1有關存儲的術語119 9.2磁片設備120 旋轉磁片120 磁片的磁區格式120 固態硬碟122 NAND型快閃記憶體122 檔的刪除和irim命令124 9.3磁片驅動程式125 Winload125 磁片類、埠和小埠驅動程式126 iSC

SI驅動程式127 多路徑I/O(MPIO)驅動程式128 實驗:觀察物理磁片I/O130 磁片設備物件130 分區管理器131 9.4卷的管理132 基本磁片133 MBR風格的分區133 GPT(GUID分區表)分區方案133 基本磁片卷管理器134 動態磁片135 LDM資料庫135 實驗:使用LDMDump來查看LDM資料庫137 LDM和GPT或MBR風格的分區方案139 動態磁片的卷管理器140 多分區卷的管理140 跨距卷141 條帶卷142 實驗:觀察鏡像磁碟區的I/O操作143 RAID—5卷145 卷名字空間145 掛載管理器146 掛載點147 卷的掛載148 實驗:查看

VPB149 卷的I/O操作152 虛擬磁片服務153 9.5虛擬硬碟(VHD檔)支援155 附載VHD的操作156 嵌套的檔案系統156 9.6BitLocker驅動器加密157 加密金鑰159 可信平臺模組(TPM)161 BitLocker引導過程163 BitLocker金鑰的恢復165 全卷加密驅動程式166 BitLocker的管理167 BitLockerToGo168 9.7卷影像(shadow)拷貝服務170 影像拷貝170 “克隆”影像拷貝170 “寫時複製”影像拷貝170 VSS的架構170 VSS的操作171 影像拷貝提供者172 實驗:查看Microsoft影像拷貝提

供者的過濾型設備物件173 Windows中的用途174 備份174 實驗:查看影像卷的設備物件174 “之前的版本”和系統還原175 實驗:導航到“之前的版本”176 實驗:映射卷影像設備物件177 9.8本章總結178 第10章 記憶體管理179 10.1記憶體管理器簡介179 記憶體管理器元件180 內部同步181 檢查記憶體的使用情況182 實驗:查看系統記憶體信息182 10.2記憶體管理器提供的服務184 大頁面和小頁面185 保留頁面和提交頁面187 實驗:保留的頁面對比提交的頁面188 提交限額190 鎖住記憶體190 分配細微性191 共用記憶體和映射檔192 實驗:查看記

憶體映射檔193 保護記憶體194 “不可執行”頁面保護196 實驗:查看進程上的DEP保護199 軟體的資料執行保護200 寫時複製201 位址窗口擴展203 10.3核心模式堆(系統記憶體池)204 記憶體池的大小205 實驗:確定最大的池大小值206 監視記憶體池的使用208 實驗:診斷記憶體池洩漏210 快查表(Look—AsideList)211 實驗:查看系統的快查表212 10.4堆管理器212 堆的類型213 堆管理器結構214 堆同步215 低碎片堆215 堆的安全特性216 堆的調試特性217 pageheap218 容錯堆218 10.5虛擬位址空間的佈局結構219 x8

6位址空間的佈局結構221 實驗:檢查一個應用程式能否感知大位址空間222 x86系統位址空間的佈局結構223 x86會話空間224 實驗:查看會話224 實驗:查看會話空間的使用情況225 系統分頁表項目(PTE,PageTableEntry)226 實驗:查看會話空間的使用情況226 64位元位址空間佈局結構227 x64虛擬定址的限制230 Windowsx64的16TB限制231 動態的系統虛擬位址空間管理233 實驗:查詢系統虛擬位址的用量234 實驗:設置系統虛擬位址的限制值235 系統的虛擬位址空間配額236 使用者位址空間的佈局結構237 實驗:對使用者虛擬位址空間進行分析23

8 映射隨機化239 棧的隨機化240 堆的隨機化240 內核位址空間中的ASLR240 對安全性緩和措施的控制240 實驗:查看進程上的ASLR保護241 10.6地址轉譯241 x86虛擬位址轉譯242 頁目錄245 實驗:檢查頁目錄和PDE245 頁表和分頁表項目246 分頁表項目中硬體和軟體的“寫”位元247 頁面內的位元組248 地址轉譯快查緩衝區248 實體位址擴充(PAE)249 實驗:轉譯地址251 x64虛擬位址轉譯253 IA64虛擬位址轉譯254 10.7分頁錯誤處理255 無效PTE256 原型PTE258 頁面換入I/O259 衝突的分頁錯誤260 聚簇的分頁錯誤26

0 分頁檔261 實驗:查看系統分頁檔262 提交用量和系統提交限額263 提交用量和分頁檔的大小266 實驗:利用工作管理員來查看分頁檔使用量266 10.8棧268 用戶棧268 實驗:創建最大數量的執行緒268 內核棧269 實驗:觀察內核棧的使用量269 DPC棧270 10.9虛擬位址描述符270 進程的VAD271 實驗:查看虛擬位址描述符272 旋轉VAD272 10.10NUMA273 10.11記憶體區物件274 實驗:查看記憶體區物件275 實驗:查看控制區域277 10.12驅動程式檢驗器280 10.13頁面幀編號資料庫284 實驗:查看PFN資料庫287 頁面清單的動

態變化288 實驗:空閒清單和零頁面清單289 實驗:已修改列表和備用列表291 頁面優先順序296 實驗:觀察區分優先順序的備用列表298 已修改頁面寫出器299 PFN資料結構301 實驗:查看PFN項304 10.14實體記憶體的限制305 Windows客戶版本的限制306 32位元客戶的有效記憶體限制307 10.15工作集309 按需換頁309 邏輯預取器310 實驗:窺探預取文件內部312 實驗:觀察預取檔的讀和寫312 放置策略313 工作集管理314 實驗:查看進程工作集大小316 實驗:工作集與虛擬大小316 實驗:在調試器中查看工作集列表317 平衡集管理器和交換器318

系統工作集319 記憶體通知事件320 實驗:查看記憶體資源通知事件321 10.16主動式記憶體管理(Superfetch)322 各個元件322 跟蹤過程和日誌記錄324 場景325 頁面優先順序和重平衡326 魯棒性能328 RAM優化軟體329 ReadyBoost330 ReadyDrive331 統一緩存332 進程反射334 實驗:利用Preflect來觀察進程反射的行為336 10.17本章總結337 第11章 緩存管理器338 11.1緩存管理器的關鍵特性338 單個中心化的系統緩存339 記憶體管理器339 快取一致性339 虛擬塊緩存341 流式緩存機制341 對可恢

復檔案系統的支持341 11.2緩存的虛擬記憶體管理342 11.3緩存的大小344 緩存的虛擬大小344 緩存的工作集大小344 實驗:查看系統緩存的工作集345 緩存的物理大小345 11.4緩存的資料結構347 系統範圍的緩存資料結構347 實驗:查看系統緩存的工作集349 針對每個檔的緩存資料結構350 實驗:查看共用的和私有的緩存表353 11.5檔案系統介面355 從緩存中來回拷貝資料356 通過映射和鎖定介面進行緩存356 通過直接記憶體存取介面進行緩存357 11.6快速I/O357 11.7預讀(ReadAhead)和滯後寫(WriteBehind)359 智能預讀359 回

寫緩存(Write—BackCaching)和延遲寫(LazyWriting)361 實驗:觀察緩存管理器的活動情況362 禁止一個檔的延遲寫出行為367 強迫緩存被直寫(write—through)到磁片上367 刷新映射文件367 實驗:觀察緩存的刷新368 寫節流(WriteThrottling)369 實驗:查看寫節流參數370 系統執行緒370 11.8本章總結371 第12章 檔案系統372 12.1Windows檔案系統格式373 CDFS373 UDF374 FAT12、FAT16和FAT32374 exFAT377 NTFS377 12.2檔案系統驅動程式總體結構378 本

地FSD379 遠程FSD380 鎖定381 實驗:查看已註冊檔案系統的列表383 檔案系統操作387 顯式文件I/O388 記憶體管理器的修改頁面寫出器和映射頁面寫出器392 緩存管理器的延遲寫出器(LazyWriter)392 緩存管理器的預讀執行緒392 記憶體管理器的分頁錯誤處理器393 檔案系統過濾型驅動程式393 進程監視器393 實驗:查看進程監視器的過濾型驅動程式394 12.3診斷檔案系統的問題395 進程監視器的基本和高級模式395 實驗:在一個空閒系統上查看檔案系統的活動395 進程監視器診斷技巧396 12.4公用日誌檔案系統397 列集操作397 日誌的類型398 日

誌的佈局結構400 日誌序號401 日誌塊401 所有者頁面402 虛擬LSN到物理LSN的轉譯403 管理策略404 12.5NTFS設計目標和特性404 高端(High—End)檔案系統的需求404 可恢復性405 安全性405 資料冗余和容錯能力405 NTFS的高級特性406 多資料流程406 實驗:查看資料流程408 基於Unicode的名稱408 通用的索引設施409 動態的壞簇重新映射409 硬連結(link)和交接(junction)409 實驗:創建一個硬連結410 符號(軟)連結和交接(junction)410 實驗:創建一個符號連結412 壓縮檔和稀疏文件412 變化日誌

413 針對每個用戶的卷配額413 連結跟蹤414 加密415 POSIX支持416 磁碟重組416 動態分區417 12.6NTFS檔案系統驅動程式419 12.7NTFS在磁片上的結構421 卷(volume)421 簇(cluster)422 主檔案表格(MFT)423 實驗:查看NTFS信息425 檔記錄號426 檔記錄426 檔案名429 隧道傳輸431 駐留的和非駐留的屬性432 資料壓縮和稀疏文件435 壓縮稀疏資料435 壓縮非稀疏資料437 稀疏文件439 變化日誌檔439 實驗:讀取變化日誌441 索引442 對象ID444 配額跟蹤444 統一的安全性445 重解析點44

7 事務支援447 隔離性448 實驗:理解和管理事務449 事務型API450 資源管理器451 實驗:查詢資源管理器的資訊452 磁片上的實現453 日誌的實現454 恢復的實現455 12.8NTFS的恢復支持455 設計456 中繼資料日誌記錄457 日誌檔服務(LFS)457 日誌記錄類型459 恢復461 分析掃描(AnalysisPass)462 重做掃描(RedoPass)463 撤銷掃描(UndoPass)463 NTFS的壞簇恢復465 自我修復468 12.9加密檔案系統(EFS)安全性469 第一次加密一個檔472 加密檔資料473 解密過程474 加密檔的備份474

實驗:查看EFS信息475 加密檔的複製475 12.10本章總結476 第13章 啟動和停機477 13.1引導過程477 BIOS引導準備477 BIOS引導磁區和Bootmgr481 UEFI引導過程495 從iSCSI引導496 初始化內核和執行體子系統497 實驗:載入器參數塊497 Smss、Csrss和Wininit504 未完成的檔重命名操作507 ReadyBoot509 自動啟動的映射檔510 實驗:Autoruns511 13.2引導和啟動問題的故障檢查511 最後已知的好配置512 安全模式512 安全模式下的驅動程式載入513 能感知安全模式的使用者程式514 安全

模式下的引導日誌515 Windows恢復環境(WinRE)516 引導狀態檔519 解決常見的引導問題520 MBR損壞520 引導磁區損壞520 BCD的錯誤配置520 系統檔損壞521 Windows資源保護522 System儲巢損壞523 啟動畫面之後的崩潰或者掛起523 13.3停機525 實驗:驗證HungAppTimeout值526 13.4本章總結528 第14章 崩潰轉儲分析529 14.1Windows為什麼會崩潰529 14.2藍屏530 Windows崩潰的原因531 14.3診斷崩潰問題533 14.4崩潰轉儲文件535 實驗:查看轉儲檔的資訊539 崩潰轉儲的生

成540 14.5Windows錯誤報告542 14.6線上崩潰分析543 14.7基本的崩潰轉儲分析545 Notmyfault545 基本的崩潰轉儲分析546 詳細的分析547 14.8使用崩潰診斷工具549 緩衝區溢位、記憶體破壞和特殊記憶體池550 實驗:通過驅動程式檢驗器啟用特殊記憶體池552 代碼改寫和系統代碼防寫553 14.9高級的崩潰轉儲分析554 棧破壞555 掛起的或無回應的系統557 實驗:利用LiveKd來生成Hyper—V客戶的轉儲559 當沒有崩潰轉儲時561 實驗:附載一個內核調試器562 14.10對常見停止代碼的分析564 0xD1—DRIVER_IRQL_

NOT_LESS_OR_EQUAL564 0x8E—KERNEL_MODE_EXCEPTION_NOT_HANDLED566 0x7F—UNEXPECTED_KERNEL_MODE_TRAP567 0xC5—DRIVER_CORRUPTED_EXPOOL569 硬體故障571 實驗:藍屏螢幕保護裝置程式572 14.11本章小結572 譯者序一 在所有介紹Windows作業系統的圖書中,我相信都離不開Windows Internals系列提供的資訊。除了公開可見到的Windows原始程式碼以外,本書是披露Windows系統機理最為詳盡的一份資料,尤其對於 Windows的每

一個最新版本。本書第6版專門針對Windows 7和Windows Server 2008 R2進行了大幅度更新。由於篇幅的增加,這一版本改成了上下兩冊來發行,由此也可見本書的“分量”。本書上冊中文版已於2014年4月出版,這幾年間,我 經常收到讀者的詢問,本書下冊是否出版。現在,下冊中文版終於要出版了,讀者們可以如願看到本書了。 在Windows作業系統的發展歷程 中,Windows 7是一個具有特殊意義的版本。它可以算得上是最為複雜的單機作業系統,無論是從代碼規模、代碼複雜度,還是從系統適應場景的複雜程度,都超過了以前所有的 版本。從某種意義上,Windows 7代表了軟體工程的一個頂峰

——人類可以構造出如此複雜且能穩定工作的軟體系統!與此相對應,要用一本書來涵蓋其中的各種機理也同樣是一項艱巨的任務,本書作者基於他們過去所做的大量工作,以及對Windows的深入理解,出色地完成了這一詮釋工作。 本書的權威性毋庸置疑。Mark Russinovich因在Windows內核探索方面所作出的貢獻而成為Microsoft Fellow(現為Azure CTO),本書中用到的大量Sysinternals工具均出自他的手筆。David Solomon長期從事Windows NT內部機理的培訓,他不僅在全球各地培訓Windows系統程式師,甚至也為Microsoft的內部員工提供Wind

ows內核培訓服務,他從本書第 2版開始奠定了卓有成效的敘述風格。Alex Ionescu是一名年輕的駭客型Windows專家,曾經為ReactOS(一個開源的作業系統專案,旨在相容Windows 2000/XP/Server 2003的應用程式)編寫了絕大多數內核代碼。他曾經發現和報告了一些與Windows內核相關的軟體漏洞,也跟David Solomon一起講授Windows內部機理的課程。有如此強大的作者組合,再加上Microsoft的內部支援(包括提供原始程式碼,以及Windows 開發組的細緻解釋),本書無疑是Windows最新版本的第一手技術資料。 每一個對Windows作業系統

有濃厚興趣的讀者都不應該錯過這本書。 本書上冊介紹了Windows的系統架構、系統機制、管理機制、進程與執行緒、安全性和網路。下冊是上冊的直接延續,共有7章,分別介紹了Windows I/O、存儲管理、記憶體管理、緩存管理器、檔案系統、啟動與停機,以及崩潰轉儲分析。每一章都是一個重要話題,讀者既可以在上冊的基礎上繼續深入鑽研 Windows各個子系統,也可以有選擇地閱讀某些章節。在閱讀過程中,最好能動手做一做書中描述的實驗。做這些實驗的門檻並不高,但效果非常好,既可以 讓你直觀地領會Windows內部的一些設計與實現,也可以積累一些洞察Windows內部活動的方法,這些方法對於排查Windo

ws平臺上出現的問題 往往很有幫助。 我與本書的淵源是從第4版(針對Windows XP/Server 2003)開始的,後來第5版(針對Windows Vista/Server 2008)錯過了出版週期,直至這次第6版又有機會翻譯。這三個版本,連同後來的第7版(針對Windows 10/Server 2016)都採用同樣的敘述框架,只是針對最新的Windows版本做了更新。本書講述的內容,雖然是針對Windows 7/Server 2008 R2,但更新幅度較大,尤其是有關64位元系統的介紹,有較多新內容。即使讀者已經在Windows 8或者Windows 10上工作,本書中的內容仍然對你

有價值。另外,如果讀者不滿足于本書Windows系統機理的系列介紹,而希望進一步理解Windows作業系統的源代 碼實現以及內核中的各種基礎演算法,則推薦閱讀另一本書《Windows內核原理與實現》,這是我在Windows XP/Server 2003 SP1內核代碼基礎上寫作的一本講解Windows內核的書,它幾乎將Windows內核大白於天下。 最後,我要特別感謝范德成先生,他在我第4版譯稿的基礎上,更新到了第6版。也要感謝電子工業出版社的編輯劉皎,依然把第6版的翻譯工作交給了我,使我有機會彌補第5版中文版未能出版之缺憾。 潘愛民 2018年1月於杭州 譯者序二 微軟的Windows

作業系統歷經三十年左右的發展,早已成為一個博大精深的桌面及伺服器作業系統,並在市場上獲得了很大的成功。但近十年來,以亞馬遜、穀 歌、Facebook等為代表的互聯網企業在市場和技術兩方面開疆拓土,極大地推動了移動設備、雲計算、大資料和人工智慧等行業的發展,顯著影響了包括微 軟在內的各大傳統軟體巨頭的發展態勢。繼2006年亞馬遜提出雲計算之後,微軟於2008年首度公開Azure虛擬機器雲平臺,SAP也在2012年公開其 應用程式雲平臺。儘管各種新的技術不斷湧現,但本書的定位焦點仍然在Windows作業系統本身,在我看來,這本書的價值依然很高,因為技術的本源有共通 性,Windows作業系統又可謂

是微軟技術的中流砥柱——微軟的Azure雲平臺的作業系統就是基於Windows開發的,其上運行的虛擬機器管理器正是 最早在Windows Server 2008中發佈的Hyper-V。 如果你對Windows作業系統有著濃厚的興趣,自然不應該錯過本書。如 果你是分散式系統架構師,也同樣能從本書中受益。這是因為,分散式系統和作業系統在許多方面都有著或多或少的相似性,對作業系統設計原理的掌握自然會對分 布式系統的設計有重大啟發和幫助。比如,作業系統的執行緒調度和分散式系統的負載均衡、作業系統的磁片緩存和分散式系統的緩存設計、作業系統的檔案系統和分 布式系統的檔案系統、虛擬機器管理器的VLAN和分

散式系統的軟體定義網路(SDN)、作業系統的效能監視器與分散式系統伺服器的性能監視平臺等之間都有不少相似性。 以交易處理為例,Windows Vista中引入了KTM(內核事務管理器,參見本書第12章),它所實現的事務的隔離級別類似於資料庫的READ COMMITTED級別,是一種幾乎所有SQL資料庫都會實現的隔離級別;而分散式系統中的Paxos共識演算法所能實現的分散式事務,其隔離級別也類似於 READ COMMITTED。又以磁片緩存為例(參見本書第11章),作業系統的磁片緩存是強一致性的,而分散式系統緩存可以做成應用伺服器內的,或者是專門的緩 存層,前一種實現對負載均衡調度有特殊要求,

而普通的負載均衡會大大降低緩存命中率從而導致系統性能低下,後一種實現則在網路延遲上稍差些。兩種實現都要 考慮是做成強一致性的還是最終一致性的,前者需要在寫的同時更新緩存,後者則需要自動淘汰舊的緩存資料。緩存的細微性也很重要,細微性過小可能導致索引資料量 過大,這和作業系統磁片緩存的原理是類似的。所以,理解作業系統的知識能拓展眼界,進而對基於這些系統的設計產生正面影響。 此外,理解作業系統的 行為有助於設計性能更高的分散式程式。比如,瞭解作業系統磁片緩存的原理,有助於設計出高性能的物件存儲服務——可以想辦法提高物件存儲在作業系統上的緩 存命中率,或者在必要時禁用作業系統緩存而改為自己實現緩存機制

。又如,瞭解作業系統網路棧的工作模式,有助於編寫做高速網路傳輸的程式,甚至可以深入驅 動程式層面做進一步的性能優化。 我是Windows作業系統的深度使用者,學習和研究了包括Windows、Linux、FreeBSD、 OpenBSD在內的多種作業系統。從1995年首次接觸Windows 3.1開始,就與Windows結下了不解之緣。陸續使用過Windows 3.1、Windows 95、Windows 98、Windows ME、Windows NT 4.0、Windows 2000、Windows XP、Windows Vista、Windows 7、Windows 8、Windows 8

.1和Windows 10等各個版本,還接觸過Windows Server 2000、Windows Server 2003、Windows Server 2008、Windows Server 2008 R2等伺服器版本,以及其上的Microsoft Virtual PC、Virtual Server和Hyper-V虛擬化技術。我會好奇它們有著怎樣的功能和性能,底層是怎樣工作的,為什麼這樣設計而不是那樣設計的;正是因為這種好奇,所 以Windows Internals一直是我十分感興趣的一本書。在完成本書上冊的翻譯工作後,我寫了一篇後記。2012年,當好友高博打電話告訴我有機會參與《深入解析

Windows作業系統》第6版的翻譯時,我非常欣喜。在高博的引薦下,我首次見到了仰慕已久的潘愛民老師。因此我非常感謝高博的引薦和潘愛民老師的認 可,感謝電子工業出版社的劉皎和白濤兩位編輯,本書的出版離不開他們的策劃和編輯。 范德成 2018年1月於上海浦東張江 引言 《深入解析Windows作業系統(第6版)》的讀者物件是那些想要理解Microsoft Windows 7和Windows Server 2008 R2作業系統的核心元件內部工作機理的高級電腦專業人員(包括開發人員和系統管理員)。開發人員利用這些知識,可以在構建Windows平臺上的應用程 序時更好地理解各種設計決策背後的基

本原理,調試複雜的問題。系統管理員也可以從這些資訊中獲益,因為理解了