持久內存編程 Programming Persistent Memory: A Comprehensive Guide for Developers

SteveScargall  吳國安(Dennis)

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

商品描述

本書講述了持久內存編程這項技術,以及它為什麼受行業歡迎。
其中涵蓋了操作系統和硬件需求,以及如何使用模擬或真實的持久內存硬件創建開發環境。
本書解釋了基本概念,並介紹了C、C 、
JavaScript和其他語言的持久內存編程API,討論了持久內存上的RMDA,闡述了其安全特性。
本書還包括可以在讀者自己的系統上運行的源代碼和示例。

作者簡介

 吳國安(Dennis)

2005年碩十研究生畢業於上海交通大學,目前是英特爾持久內存工程部經理,
在IA架構、性能優化、軟件協同硬件開發方面有多年工作經驗。
目前主要支持客戶應用英特爾數據中心級持久化內存進行軟件開發和應用適配,提供IA架構上的客戶方案技術諮詢和支持。
在2012年加入英特爾之前,任職意法半導體,負責數字電視軟件開發和集成的工作。

目錄大綱

目錄
譯者序
前言
致謝
作者簡介
貢獻者簡介
技術評審者簡介
譯者簡介
第1章持久內存編程簡介1
1.1高級示例程序2
1.1.1有何區別4
1.1.2性能差異5
1.1.3程序複雜性5
1.1. 4 libpmemkv如何運行5
1.2後文提要6
1.3總結7

第2章持久內存架構8
2.1持久內存的特性8
2.2持久內存的平台支持9
2.3緩存層級10
2.4電源故障保護域11
2.5刷新、排序和屏障操作的需求13
2.6數據可見性16
2.7用於持久內存的英特爾機器指令16
2.8檢測平台功能17
2.9應用程序啟動與恢復18
2.10後文提要20
2.11總結20

第3章持久內存的操作系統支持21
3.1內存和存儲的操作系統支持21
3.2持久內存用作塊存儲22
3.3持久內存感知型文件系統23
3.4內存映射文件24
3.5持久內存直接訪問30
3.6總結37

第4章持久內存編程的基本概念38
4.1有何區別38
4.2原子更新39
4.3事務39
4.3.1原子性39
4.3.2一致性40
4.3.3隔離性40
4.3.4持久性40
4.4刷新不具有事務性41
4.5啟動時職責41
4.6針對硬件配置進行調優41
4.7總結42

第5章持久內存開發套件簡介43
5.1背景43
5.2選擇正確的語義44
5.3易失性庫44
5.3.1 libmemkind 44
5.3.2 libvmemcache 45
5.3.3 libvmem 46
5.4持久性庫46
5.4.1 libpmem 46
5.4.2 libpmemobj 46
5.4.3 libpmemobj-cpp 47
5.4.4 libpmemkv 47
5.4.5 libpmemlog 47
5.4.6 libpmemblk 48
5.5工具和命令程序48
5.5.1 pmempool 48
5.5.2 pmemcheck 48
5.5.3 pmreorder 49
5.6總結49

第6章libpmem:底層持久內存支持50
6.1使用庫51
6.2映射文件51
6.3複製到持久內存52
6.4分解刷新步驟53
6.5總結54

第7章libpmemobj:原生事務性對象存儲55
7.1什麼是libpmemobj 55
7.2為什麼不使用malloc 55
7.3組合操作56
7.4內存池56
7.4.1創建內存池56
7.4.2池對象指針和根對象59
7.4.3打開內存池並從內存池中讀取數據60
7.5內存池集61
7.5.1串聯池集61
7.5.2副本池集62
7.6管理內存池和池集62
7.7類型化對象標識符63
7.8分配內存63
7.9持久保存數據63
7.9.1原子操作64
7.9.2保留/發布API 66
7.9.3事務API 68
7.9.4可選標記71
7.9.5持久保存數據總結71
7.10 libpmemobj的API可提供保障71
7.11管理庫操作72
7.12調試與錯誤處理72
7.13總結74

第8章libpmemobj-cpp:自適應語言C和持久內存75
8.1簡介75
8.2元編程75
8.2.1持久指針76
8.2.2事務76
8.2.3創建快照77
8.2.4分配79
8.3 C標準限制80
8.3.1對象的生命週期80
8.3.2平凡類型81
8.3.3對象佈局82
8.3.4指針83
8.3.5限制總結85
8.4簡化持久性85
8.5生態系統91
8.5.1持久容器91
8.5.2持久容器示例91
8.6總結94

第9章pmemkv:持久內存鍵值存儲95
9.1 pmemkv架構97
9.2電話簿示例99
9.3讓持久內存更靠近雲102
9.4總結103

第10章持久內存編程的易失性用途104
10.1簡介104
10.2背景105
10.2.1內存分配105
10.2.2工作原理105
10.2.3支持的內存“類型” 105
10.3 memkind API 107
10.3.1類型管理API 107
10.3.2堆管理API 111
10.3.3類型配置管理112
10.3.4更多memkind代碼示例113
10.4面向PMEM類型的C分配器113
10.4.1 pmem::allocator方法114
10.4.2嵌套容器114
10.5 C示例114
10.5.1使用pmem::allocator 115
10.5.2創建字符串向量115
10.6使用持久內存擴展易失性內存116
10.7 libvmemcache:面向大容量持久內存的高效易失性鍵值緩存120
10.7.1 libvmemcache概述120
10.7.2 libvmemcache設計122
10.7.3使用libvmemcache 124
10.8總結126

第11章設計適用於持久內存的數據結構127
11.1連續數據結構和碎片化127
11.1.1內部和外部碎片化127
11.1.2原子性和一致性128
11.1.3選擇性持久化131
11.1.4示例數據結構131
11.2總結140

第12章調試持久內存應用程序141
12.1用於Valgrind的pmemcheck 142
12.1.1棧溢出示例142
12.1.2內存洩漏示例143
12.2 Intel Inspector?—?Persistence Inspector 144
12.2. 1棧溢出示例144
12.2.2內存洩漏示例145
12.3常見的持久內存編程問題146
12.3.1非持久存儲146
12.3.2數據存儲未添加到事務157
12.3.3將一個內存對象添加至兩個不同的事務160
12.3.4內存覆寫165
12.3.5非必要刷新166
12.3.6亂序寫入170
12.4總結179

第13章實際應用程序中實現持久性180
13.1數據庫示例180
13.2不同的持久內存實現方式181
13.3開發持久內存感知型MariaDB存儲引擎181
13.3.1了解存儲層182
13.3.2創建存儲引擎類183
13.4總結191

第14章並發和持久內存192
14.1事務與多線程192
14.2持久內存上的互斥體196
14.3原子操作與持久內存198
14.4持久內存的並發數據結構198
14.4.1並發有序映射199
14.4.2並發散列映射202
14.5總結202

第15章分析與性能204
15.1簡介204
15.2性能分析概念204
15.2.1計算受限與內存受限204
15.2.2內存與內存容量205
15.2.3讀取與寫入性能205
15.2.4內存訪問模式205
15.2.5 I/O存儲受限的工作負載205
15.3確定工作負載是否適合持久內存206
15.3.1易失性用例206
15.3.2需要持久性的用例208
15.4使用持久內存的工作負載性能分析209
15.4.1確定工作負載特性210
15.4.2內存帶寬與210
15.4.3持久內存讀寫比率211
15.4.4工作集大小與內存佔用空間大小211
15.4.5非一致內存架構行為211
15.4.6優化面向持久內存的軟件212
15.5總結215

第16章PMDK內部組件:重要算法和數據結構216
16.1持久內存池:高層架構概覽216
16.2內存映射的不確定性:持久內存對象標識符218
16.3持久化線程本地存儲:使用通道220
16.4確保電源故障原子性:重做日誌和撤銷日誌220
16.4.1事務重做日誌221
16.4.2事務撤銷日誌221
16.4.3 libpmemobj統一日誌222
16.5持久分配:事務持久分配器的接口223
16.6持久內存堆管理:持久內存分配器設計223
16.7 ACID事務:高效的底層持久事務226
16.8延遲重新初始化變量:將易失性狀態存儲在持久內存上227
16.9總結228

第17章可靠性、可用性與可維護性229
17.1處理不可糾正錯誤229
17.1.1已使用的不可糾正錯誤處理230
17.1.2未使用的不可糾正錯誤處理231
17.1.3清除不可糾正錯誤234
17.2設備狀態234
17.2.1 ACPI定義的設備狀態函數(_NCH,_NBS) 236
17.2.2特定供應商的設備狀態(_DSM) 236
17.2.3 ACPI NFIT狀態事件通知236
17.3不安全/異常關機237
17.4總結238

第18章遠程持久內存239
18.1 RDMA網絡協議240
18.2初始遠程持久內存架構的目標242
18.3確保遠程持久性242
18.3.1通用遠程複製方法243
18.3.2設備遠程複製方法244
18.4一般軟件架構246
18.5 librpmem架構及其在復制中的使用246
18.5.1使用內存池集配置遠程複製249
18.5.2性能注意事項249
18.5.3遠程複製錯誤處理250
18.5.4向複製世界“問好” 251
18.6總結254

19章高級主題256
19.1非一致性內存訪問256
19.1.1 NUMACTL Linux程序257
19.1.2 NDCTL Linux程序258
19.1.3英特爾內存延遲檢查器程序259
19.1.4 NUMASTAT程序260
19.1.5英特爾VTune Profiler —Platform Profiler 261
19.1.6 IPMCTL程序261
19.1 .7 BIOS調優選項261
19.1.8自動NUMA平衡261
19.2使用具有持久內存的捲管理器263
19.3 mmap的MAP_SYNC標記264
19.4總結265
附錄A如何在Linux上安裝NDCTL和DAXCTL 266
附錄B如何安裝持久內存開發套件271
附錄C如何在Linux和Windows上安裝IPMCTL 277
附錄D面向持久內存的Java 282
附錄E遠程持久內存複製的未來289
術語表292