PMDK 的全称是 Persistent Memory Development Kit,它包含了 Intel 开发的一系列旨在 方便非易失性内存的应用开发的函数库和工具。PMDK 是一个还在快速发展变化的新鲜事物,不过版本的迭代更新等很多信息都可以公开看到[1]。需要注意的是,PMDK 的网站入口[2] 和 Git 仓库的入口[3]不是严格的一一对应关系。
实际上,PMDK 的 Git 仓库 [3] 中包含了 libpmem、libvmem、libpmemblk、libpmemlog、libpmemobj、libpmempool、libvmmalloc 等很多函数库。还有很多函数库和工具分散在其他的一些 Git 仓库中,例如我们下面要 介绍的 libpmemkind、libvmemcache、libpmemkv 以及支持 C/C++、Java、Python 等语言的绑定。在此前的文章 A Try on PMDK 中,我使用的是 PMDK 中最底层的一个函数库 libpmem。
Intel 把前面提到的很多函数库、工具等统称为 PMDK [2]。可以推测,它在快速发 展过程中会不断的增加新的成员,也可能会删除旧的成员。这些五花八门的函数库、工具、 例子和文档正说明了 NVM 潜在应用范围之广泛,也证明了 Intel 在不遗余力的构建围绕 NVM 的软件生态。 https://zhuanlan.zhihu.com/p/69345874
有了持久性内存,应用程序就有一个可用于数据放置的新层,如图1所示。除了内存和存储层之外,持久性存储层还提供了比DRAM更大的容量,并且比存储还快得多的性能。应用程序可以像访问传统内存一样就地访问持久性内存驻留数据结构,从而无需在内存和存储之间来回分页数据块。
图1:具有持久内存层的内存存储层次结构
为了获得这种低延迟的直接访问,需要一种新的软件体系结构,该体系结构允许应用程序访问持久性内存的范围。
在持久性存储器开发套件(PMDK)是库和工具,系统管理员和应用程序开发人员简化管理和访问持久性存储设备的集合。这些库在Linux和Windows上进行了调优和验证,它们建立在直接访问(DAX)功能的基础上,该功能使应用程序可以直接访问持久性内存作为内存映射文件。在存储网络行业协会(SNIA)NVM编程模型中对此进行了详细描述。图2显示了模型,该模型描述了当数据映射到应用程序时,应用程序如何使用传统的POSIX标准API(例如读,写,前置和pwrite)或加载/存储操作(例如memcpy)访问持久性存储设备(NVDIMM)。 。“持久性内存”区域描述了最快的访问速度,因为应用程序I / O绕过了现有文件系统页面缓存,并直接与持久性存储介质进行通讯。
图2:SNIA编程模型
直接访问物理介质会带来新的编程挑战和范例。PMDK为应用程序开发人员提供了许多下面突出显示的库和功能,以解决一些较困难的编程问题:
可用库:
-
- libpmem: 提供低级别的持久内存支持
-
- libpmemobj: 提供了一个事务对象存储,提供内存分配,交易和持久性存储器编程设施一般。
-
- libpmemblk: PMEM驻留的块,所有具有相同的尺寸,被原子方式更新的支撑件阵列。
-
- libpmemlog: 提供PMEM驻留日志文件。
-
- libvmem(已废弃): 原来的持久存储池到易失性内存池,类似于系统堆,但保持独立,并与自己的malloc风格的API。由于持久性内存支持已集成到libmemkind中,因此对于任何易失性实现,建议选择该库。 Libmemkind将对多种类型的易失性存储器的支持组合到一个便捷的API中。
-
- libvmmalloc: 库透明地将所有的动态内存分配到永久性的内存分配。
-
- libpmempool: 提供离线池管理和诊断支持。
-
- librmem: 提供了一种用于一种利用能进行RDMA的RNICs持久性存储器的远程访问底层支持。
-
- libvmemcache:是一个可嵌入和轻质的内存的缓存解决方案。它旨在以有效且可扩展的方式通过内存映射来充分利用大容量内存,例如具有DAX的持久性内存。
可用的实用程序:
证明文件
配套视频
-
持久性存储器编程入门(系列):
非易失性存储器库(NVML)现在称为持久性存储器开发套件(PMDK)。在这些视频中,其架构师Andy Rudoff向您介绍了持久性存储器编程,并向您展示了如何将其应用于应用程序。
-
第1部分:什么是永久记忆?
-
第2部分:描述SNIA规划模型
-
第3部分:介绍PMDK库
-
第4部分:思考以事务
-
第5部分:A C ++实施例
-
推荐阅读
《持久内存开发套件(Persistent Memory Development Kit-PMDK) - pmem.io: PMDK》
《PMDK介绍》