新書推薦:
《
成吉思汗传:看历代帝王将相谋略 修炼安身成事之根本
》
售價:NT$
280.0
《
爱丁堡古罗马史-罗马城的起源和共和国的崛起
》
售價:NT$
349.0
《
人生解忧:佛学入门四十讲
》
售價:NT$
490.0
《
浪潮将至
》
售價:NT$
395.0
《
在虚无时代:与马克斯·韦伯共同思考
》
售價:NT$
260.0
《
日内交易与波段交易的资金风险管理
》
售價:NT$
390.0
《
自然信息图:一目了然的万物奇观
》
售價:NT$
640.0
《
女性史:古代卷(真正意义上的女性大历史)
》
售價:NT$
560.0
|
內容簡介: |
本书讲述了持久内存编程这项技术,以及它为什么受行业欢迎。其中涵盖了操作系统和硬件需求,以及如何使用模拟或真实的持久内存硬件创建开发环境。本书解释了基本概念,并介绍了C、C++、JavaScript和其他语言的持久内存编程API,讨论了持久内存上的RMDA,阐述了其安全特性。本书还包括可以在读者自己的系统上运行的源代码和示例。
|
關於作者: |
贡献者简介
技术评审者简介
译者简介
第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章 持久内存编程简介11.1 高级示例程序21.1.1 有何区别41.1.2 性能差异51.1.3 程序复杂性51.1.4 libpmemkv如何运行51.2 后文提要61.3 总结7第2章 持久内存架构82.1 持久内存的特性82.2 持久内存的平台支持92.3 缓存层级102.4 电源故障保护域112.5 刷新、排序和屏障操作的需求132.6 数据可见性162.7 用于持久内存的英特尔机器指令162.8 检测平台功能172.9 应用程序启动与恢复182.10 后文提要202.11 总结20第3章 持久内存的操作系统支持213.1 内存和存储的操作系统支持213.2 持久内存用作块存储223.3 持久内存感知型文件系统233.4 内存映射文件243.5 持久内存直接访问303.6 总结37第4章 持久内存编程的基本概念384.1 有何区别384.2 原子更新394.3 事务394.3.1 原子性394.3.2 一致性404.3.3 隔离性404.3.4 持久性404.4 刷新不具有事务性414.5 启动时职责414.6 针对硬件配置进行调优414.7 总结42第5章 持久内存开发套件简介435.1 背景435.2 选择正确的语义445.3 易失性库445.3.1 libmemkind445.3.2 libvmemcache455.3.3 libvmem465.4 持久性库465.4.1 libpmem465.4.2 libpmemobj465.4.3 libpmemobj-cpp475.4.4 libpmemkv475.4.5 libpmemlog475.4.6 libpmemblk485.5 工具和命令程序485.5.1 pmempool485.5.2 pmemcheck485.5.3 pmreorder495.6 总结49第6章 libpmem:底层持久内存支持506.1 使用库516.2 映射文件516.3 复制到持久内存526.4 分解刷新步骤536.5 总结54第7章 libpmemobj:原生事务性对象存储557.1 什么是libpmemobj557.2 为什么不使用malloc557.3 组合操作567.4 内存池567.4.1 创建内存池567.4.2 池对象指针和根对象597.4.3 打开内存池并从内存池中读取数据607.5 内存池集617.5.1 串联池集617.5.2 副本池集627.6 管理内存池和池集627.7 类型化对象标识符637.8 分配内存637.9 持久保存数据637.9.1 原子操作647.9.2 保留发布API667.9.3 事务API687.9.4 可选标记717.9.5 持久保存数据总结717.10 libpmemobj的API可提供保障717.11 管理库操作727.12 调试与错误处理727.13 总结74第8章 libpmemobj-cpp:自适应语言C++和持久内存758.1 简介758.2 元编程758.2.1 持久指针768.2.2 事务768.2.3 创建快照778.2.4 分配798.3 C++标准限制808.3.1 对象的生命周期808.3.2 平凡类型818.3.3 对象布局828.3.4 指针838.3.5 限制总结858.4 简化持久性858.5 生态系统918.5.1 持久容器918.5.2 持久容器示例918.6 总结94第9章 pmemkv:持久内存键值存储959.1 pmemkv架构979.2 电话簿示例999.3 让持久内存更靠近云1029.4 总结103第10章 持久内存编程的易失性用途10410.1 简介10410.2 背景10510.2.1 内存分配10510.2.2 工作原理10510.2.3 支持的内存“类型”10510.3 memkind API10710.3.1 类型管理API10710.3.2 堆管理API11110.3.3 类型配置管理11210.3.4 更多memkind代码示例11310.4 面向PMEM类型的C++分配器11310.4.1 pmem::allocator方法11410.4.2 嵌套容器11410.5 C++示例11410.5.1 使用pmem::allocator11510.5.2 创建字符串向量11510.6 使用持久内存扩展易失性内存11610.7 libvmemcache:面向大容量持久内存的高效易失性键值缓存12010.7.1 libvmemcache概述12010.7.2 libvmemcache设计12210.7.3 使用libvmemcache12410.8 总结126第11章 设计适用于持久内存的数据结构12711.1 连续数据结构和碎片化12711.1.1 内部和外部碎片化12711.1.2 原子性和一致性12811.1.3 选择性持久化13111.1.4 示例数据结构13111.2 总结140第12章 调试持久内存应用程序14112.1 用于Valgrind的pmemcheck14212.1.1 栈溢出示例14212.1.2 内存泄漏示例14312.2 Intel Inspector?—?Persistence Inspector14412.2.1 栈溢出示例14412.2.2 内存泄漏示例14512.3 常见的持久内存编程问题14612.3.1 非持久存储14612.3.2 数据存储未添加到事务15712.3.3 将一个内存对象添加至两个不同的事务16012.3.4 内存覆写16512.3.5 非必要刷新16612.3.6 乱序写入17012.4 总结179第13章 实际应用程序中实现持久性18013.1 数据库示例18013.2 不同的持久内存实现方式18113.3 开发持久内存感知型MariaDB*存储引擎18113.3.1 了解存储层18213.3.2 创建存储引擎类18313.4 总结191第14章 并发和持久内存19214.1 事务与多线程19214.2 持久内存上的互斥体19614.3 原子操作与持久内存19814.4 持久内存的并发数据结构19814.4.1 并发有序映射19914.4.2 并发散列映射20214.5 总结202第15章 分析与性能20415.1 简介20415.2 性能分析概念20415.2.1 计算受限与内存受限20415.2.2 内存延时与内存容量20515.2.3 读取与写入性能20515.2.4 内存访问模式20515.2.5 IO存储受限的工作负载20515.3 确定工作负载是否适合持久内存20615.3.1 易失性用例20615.3.2 需要持久性的用例20815.4 使用持久内存的工作负载性能分析20915.4.1 确定工作负载特性21015.4.2 内存带宽与延时21015.4.3 持久内存读写比率21115.4.4 工作集大小与内存占用空间大小21115.4.5 非一致内存架构行为21115.4.6 优化面向持久内存的软件21215.5 总结215第16章 PMDK内部组件:重要算法和数据结构21616.1 持久内存池:高层架构概览21616.2 内存映射的不确定性:持久内存对象标识符21816.3 持久化线程本地存储:使用通道22016.4 确保电源故障原子性:重做日志和撤销日志22016.4.1 事务重做日志22116.4.2 事务撤销日志22116.4.3 libpmemobj统一日志22216.5 持久分配:事务持久分配器的接口22316.6 持久内存堆管理:持久内存分配器设计22316.7 ACID事务:高效的底层持久事务22616.8 延迟重新初始化变量:将易失性状态存储在持久内存上22716.9 总结228第17章 可靠性、可用性与可维护性22917.1 处理不可纠正错误22917.1.1 已使用的不可纠正错误处理23017.1.2 未使用的不可纠正错误处理23117.1.3 清除不可纠正错误23417.2 设备状态23417.2.1 ACPI定义的设备状态函数(_NCH,_NBS)23617.2.2 特定供应商的设备状态(_DSM)23617.2.3 ACPI NFIT状态事件通知23617.3 不安全异常关机23717.4 总结238第18章 远程持久内存23918.1 RDMA网络协议24018.2 初始远程持久内存架构的目标24218.3 确保远程持久性24218.3.1 通用远程复制方法24318.3.2 设备远程复制方法24418.4 一般软件架构24618.5 librpmem架构及其在复制中的使用24618.5.1 使用内存池集配置远程复制24918.5.2 性能注意事项24918.5.3 远程复制错误处理25018.5.4 向复制世界“问好”25118.6 总结254第19章 高级主题25619.1 非一致性内存访问25619.1.1 NUMACTL Linux程序25719.1.2 NDCTL Linux程序25819.1.3 英特尔内存延迟检查器程序25919.1.4 NUMASTAT程序26019.1.5 英特尔VTune Profiler —Platform Profiler26119.1.6 IPMCTL程序26119.1.7 BIOS调优选项26119.1.8 自动NUMA平衡26119.2 使用具有持久内存的卷管理器26319.3 mmap的MAP_SYNC标记26419.4 总结265附录A 如何在Linux上安装NDCTL和DAXCTL266附录B 如何安装持久内存开发套件271附录C 如何在Linux和Windows上安装IPMCTL277附录D 面向持久内存的Java282附录E 远程持久内存复制的未来289术语表292
|
目錄:
|
译者序前言致谢作者简介贡献者简介技术评审者简介译者简介第1章 持久内存编程简介11.1 高级示例程序21.1.1 有何区别41.1.2 性能差异51.1.3 程序复杂性51.1.4 libpmemkv如何运行51.2 后文提要61.3 总结7第2章 持久内存架构82.1 持久内存的特性82.2 持久内存的平台支持92.3 缓存层级102.4 电源故障保护域112.5 刷新、排序和屏障操作的需求132.6 数据可见性162.7 用于持久内存的英特尔机器指令162.8 检测平台功能172.9 应用程序启动与恢复182.10 后文提要202.11 总结20第3章 持久内存的操作系统支持213.1 内存和存储的操作系统支持213.2 持久内存用作块存储223.3 持久内存感知型文件系统233.4 内存映射文件243.5 持久内存直接访问303.6 总结37第4章 持久内存编程的基本概念384.1 有何区别384.2 原子更新394.3 事务394.3.1 原子性394.3.2 一致性404.3.3 隔离性404.3.4 持久性404.4 刷新不具有事务性414.5 启动时职责414.6 针对硬件配置进行调优414.7 总结42第5章 持久内存开发套件简介435.1 背景435.2 选择正确的语义445.3 易失性库445.3.1 libmemkind445.3.2 libvmemcache455.3.3 libvmem465.4 持久性库465.4.1 libpmem465.4.2 libpmemobj465.4.3 libpmemobj-cpp475.4.4 libpmemkv475.4.5 libpmemlog475.4.6 libpmemblk485.5 工具和命令程序485.5.1 pmempool485.5.2 pmemcheck485.5.3 pmreorder495.6 总结49第6章 libpmem:底层持久内存支持506.1 使用库516.2 映射文件516.3 复制到持久内存526.4 分解刷新步骤536.5 总结54第7章 libpmemobj:原生事务性对象存储557.1 什么是libpmemobj557.2 为什么不使用malloc557.3 组合操作567.4 内存池567.4.1 创建内存池567.4.2 池对象指针和根对象597.4.3 打开内存池并从内存池中读取数据607.5 内存池集617.5.1 串联池集617.5.2 副本池集627.6 管理内存池和池集627.7 类型化对象标识符637.8 分配内存637.9 持久保存数据637.9.1 原子操作647.9.2 保留发布API667.9.3 事务API687.9.4 可选标记717.9.5 持久保存数据总结717.10 libpmemobj的API可提供保障717.11 管理库操作727.12 调试与错误处理727.13 总结74第8章 libpmemobj-cpp:自适应语言C++和持久内存758.1 简介758.2 元编程758.2.1 持久指针768.2.2 事务768.2.3 创建快照778.2.4 分配798.3 C++标准限制808.3.1 对象的生命周期808.3.2 平凡类型818.3.3 对象布局828.3.4 指针838.3.5 限制总结858.4 简化持久性858.5 生态系统918.5.1 持久容器918.5.2 持久容器示例918.6 总结94第9章 pmemkv:持久内存键值存储959.1 pmemkv架构979.2 电话簿示例999.3 让持久内存更靠近云1029.4 总结103第10章 持久内存编程的易失性用途10410.1 简介10410.2 背景10510.2.1 内存分配10510.2.2 工作原理10510.2.3 支持的内存“类型”10510.3 memkind API10710.3.1 类型管理API10710.3.2 堆管理API11110.3.3 类型配置管理11210.3.4 更多memkind代码示例11310.4 面向PMEM类型的C++分配器11310.4.1 pmem::allocator方法11410.4.2 嵌套容器11410.5 C++示例11410.5.1 使用pmem::allocator11510.5.2 创建字符串向量11510.6 使用持久内存扩展易失性内存11610.7 libvmemcache:面向大容量持久内存的高效易失性键值缓存12010.7.1 libvmemcache概述12010.7.2 libvmemcache设计12210.7.3 使用libvmemcache12410.8 总结126第11章 设计适用于持久内存的数据结构12711.1 连续数据结构和碎片化12711.1.1 内部和外部碎片化12711.1.2 原子性和一致性12811.1.3 选择性持久化13111.1.4 示例数据结构13111.2 总结140第12章 调试持久内存应用程序14112.1 用于Valgrind的pmemcheck14212.1.1 栈溢出示例14212.1.2 内存泄漏示例14312.2 Intel Inspector?—?Persistence Inspector14412.2.1 栈溢出示例14412.2.2 内存泄漏示例14512.3 常见的持久内存编程问题14612.3.1 非持久存储14612.3.2 数据存储未添加到事务15712.3.3 将一个内存对象添加至两个不同的事务16012.3.4 内存覆写16512.3.5 非必要刷新16612.3.6 乱序写入17012.4 总结179第13章 实际应用程序中实现持久性18013.1 数据库示例18013.2 不同的持久内存实现方式18113.3 开发持久内存感知型MariaDB*存储引擎18113.3.1 了解存储层18213.3.2 创建存储引擎类18313.4 总结191第14章 并发和持久内存19214.1 事务与多线程19214.2 持久内存上的互斥体19614.3 原子操作与持久内存19814.4 持久内存的并发数据结构19814.4.1 并发有序映射19914.4.2 并发散列映射20214.5 总结202第15章 分析与性能20415.1 简介20415.2 性能分析概念20415.2.1 计算受限与内存受限20415.2.2 内存延时与内存容量20515.2.3 读取与写入性能20515.2.4 内存访问模式20515.2.5 IO存储受限的工作负载20515.3 确定工作负载是否适合持久内存20615.3.1 易失性用例20615.3.2 需要持久性的用例20815.4 使用持久内存的工作负载性能分析20915.4.1 确定工作负载特性21015.4.2 内存带宽与延时21015.4.3 持久内存读写比率21115.4.4 工作集大小与内存占用空间大小21115.4.5 非一致内存架构行为21115.4.6 优化面向持久内存的软件21215.5 总结215第16章 PMDK内部组件:重要算法和数据结构21616.1 持久内存池:高层架构概览21616.2 内存映射的不确定性:持久内存对象标识符21816.3 持久化线程本地存储:使用通道22016.4 确保电源故障原子性:重做日志和撤销日志22016.4.1 事务重做日志22116.4.2 事务撤销日志22116.4.3 libpmemobj统一日志22216.5 持久分配:事务持久分配器的接口22316.6 持久内存堆管理:持久内存分配器设计22316.7 ACID事务:高效的底层持久事务22616.8 延迟重新初始化变量:将易失性状态存储在持久内存上22716.9 总结228第17章 可靠性、可用性与可维护性22917.1 处理不可纠正错误22917.1.1 已使用的不可纠正错误处理23017.1.2 未使用的不可纠正错误处理23117.1.3 清除不可纠正错误23417.2 设备状态23417.2.1 ACPI定义的设备状态函数(_NCH,_NBS)23617.2.2 特定供应商的设备状态(_DSM)23617.2.3 ACPI NFIT状态事件通知23617.3 不安全异常关机23717.4 总结238第18章 远程持久内存23918.1 RDMA网络协议24018.2 初始远程持久内存架构的目标24218.3 确保远程持久性24218.3.1 通用远程复制方法24318.3.2 设备远程复制方法24418.4 一般软件架构24618.5 librpmem架构及其在复制中的使用24618.5.1 使用内存池集配置远程复制24918.5.2 性能注意事项24918.5.3 远程复制错误处理25018.5.4 向复制世界“问好”25118.6 总结254第19章 高级主题25619.1 非一致性内存访问25619.1.1 NUMACTL Linux程序25719.1.2 NDCTL Linux程序25819.1.3 英特尔内存延迟检查器程序25919.1.4 NUMASTAT程序26019.1.5 英特尔VTune Profiler —Platform Profiler26119.1.6 IPMCTL程序26119.1.7 BIOS调优选项26119.1.8 自动NUMA平衡26119.2 使用具有持久内存的卷管理器26319.3 mmap的MAP_SYNC标记26419.4 总结265附录A 如何在Linux上安装NDCTL和DAXCTL266附录B 如何安装持久内存开发套件271附录C 如何在Linux和Windows上安装IPMCTL277附录D 面向持久内存的Java282附录E 远程持久内存复制的未来289术语表292
|
內容試閱:
|
关于本书持久内存通常被称为非易失性内存(NVM)或存储级内存(SCM)。在本书中,特意将持久内存作为一个包罗万象的术语,指代当前及未来所有与此相关的内存技术。本书介绍持久内存技术,并对一些关键问题做出解答。对于软件开发人员,这些问题包括:什么是持久内存?如何使用持久内存?可以使用哪些API和库?持久内存能为应用程序提供哪些优势?需要学习哪些新的编程方法?如何设计应用程序以使用持久内存?在哪里查找相关信息、文档和帮助?对于系统和云架构师,这些问题包括:什么是持久内存?持久内存的工作原理是什么?持久内存与DRAM或SSDNVMe存储设备相比有何不同?硬件和操作系统方面有哪些要求?哪些应用程序需要或者可以从持久内存中获益?现有应用程序在不经修改的情况下可以使用持久内存吗?对于软件应用程序而言,持久内存不是一种即插即用的技术。尽管从外表看持久内存与传统DRAM内存类似,但应用程序必须进行修改才能充分发挥持久内存的持久特性。应用程序在未经修改的情况下也可以在安装了持久内存的系统上运行,但是这样无法发挥持久内存的全部潜能。庆幸的是,服务器和操作系统厂商在早期设计阶段进行了合作,并推出了许多相关产品。Linux和Microsoft Windows已经可以原生支持持久内存技术。许多常见的虚拟化技术也支持持久内存。然而,对于ISV和整个开发人员社区而言,针对持久内存技术的开发之旅才刚刚起步。一些软件已经完成修改并进入市场。但企业和云计算行业需要一段时间才能加以采用并推出相应的硬件产品。ISV和软件开发人员也需要时间了解现有应用程序需要做出哪些更改,并实现它们。为了简化必要的开发工作,英特尔开发并开源了持久内存开发套件(PMDK),你可以访问https:pmem.iopmdk获取该套件。我们将在第5章详细介绍PMDK,并在随后的章节中对大多数可用的库进行介绍。本书每章都会提供一份深入指南,方便开发人员了解所要使用的库。PMDK是一套基于存储网络工业协会(SNIA)NVM编程模型的开源库和工具,由50多家行业合作伙伴联合设计并实现。你可以访问https:www.snia.orgtech_activitiesstandardscurr_standardsnpm获取最新的NVM编程模型文档。该模型描述了软件如何利用持久内存的特性,来支持设计人员开发能够充分发挥NVM特性和性能的API。PMDK同时提供Linux和Windows版本,并支持高级语言,旨在推动持久内存编程的普及。C和C++支持已经过全面验证。在本书编写之际,对其他语言(Java和Python)的支持也正在验证之中。预计其他语言也将采用编程模型,为开发人员提供原生的持久内存API。PMDK开发团队欢迎并鼓励大家在持久内存键值存储(pmemkv)的核心代码、新语言绑定或新存储引擎方面做出更多贡献。本书假设你不了解持久内存硬件设备或软件开发,并经过了精心的编排设计,你可以按照自己希望的顺序随意浏览本书内容。尽管本书后面的内容以之前章节中介绍的概念和知识为基础,但是也无须按顺序阅读所有章节,同时为了方便起见,在内容中添加了对于相关章节的引用,以便你学习或回忆相关知识。本书结构本书共有19章,每章侧重于介绍不同的主题。全书由三个主要部分组成。第1~4章介绍了持久内存架构、硬件和操作系统支持。第5~16章旨在帮助开发人员了解PMDK库以及如何在应用程序中使用这些库。最后,第17~19章介绍了部分高级主题,比如RAS以及使用RDMA复制数据等。第1章介绍持久内存,并通过一个简单的例子尝试,这个例子使用libpmemkv来存储持久键-值对。第2章介绍持久内存架构,并重点介绍开发人员应知晓的硬件要求。第3章介绍操作系统相关变更、新特性,以及操作系统如何发现持久内存。第4章以前3章的内容为基础,介绍持久内存编程的基本概念。第5章介绍PMDK,即一套帮助软件从业人员进行开发的库。第6章介绍并展示如何使用PMDK的libpmem,即提供持久内存支持的底层库。第7章使用PMDK的C原生对象存储库libpmemobj提供相关信息和示例。第8章演示PMDK的C++ libpmemobj-cpp对象存储,它是在libpmemobj之上用C++头文件构建而成的。第9章通过示例详细介绍第1章中提到的libpmemkv。第10章主要面向希望充分利用持久内存但不需要对数据进行持久化存储的读者。libmemkind是构建在jemalloc之上的用户可扩展堆管理器,支持控制内存特性以及在不同类型的内存之间对堆进行分区。libvmemcache是一种可嵌入式轻量级内存缓存解决方案,它可以通过高效、可扩展的内存映射充分利用大容量存储,例如支持DAX(直接访问)的持久内存。第11章详细介绍如何设计适用于持久内存的数据结构。第12章介绍持久内存相关的工具,并举例说明软件开发人员如何调试支持持久内存的应用程序。第13章探讨如何修改实际应用程序以使用持久内存特性。第14章介绍如何实现应用程序中的并发性以便用于持久内存。第15章介绍性能的概念,并展示如何使用英特尔VTune工具套件在代码更改前后对系统和应用程序进行分析。第16章详细介绍PMDK设计、架构、算法和内
|
|