image-20210616113503631

大赛官网 | 大赛资料 | 报名链接 | 技术社区

大赛支持微信群

img

Hello World, PMem!

我们在这里准备了一个 PMem 版的 Hello World 程序,给大家直观的讲解一下如何通过 libpmemobj-cpp (https://pmem.io/libpmemobj-cpp/) 函数库进行C++的持久内存编程。该函数库也是本次比赛编程挑战赛道推荐使用的持久内存编程库。hello_world_pmem 是一个使用 libpmemobj-cpp 在持久内存中存储数据的示例程序,将提供的源文件hello_world_pmem.cppMakefile 放在目录中运行 make 即可编译成可执行文件。

下载源文件包 cpp 源文件

hello_world_pmem简介

hello_world_pmem 使用 libpmemobj-cpp 创建一个持久内存池(pmem pool),并在其root中,存放一个如下结构的持久内存对象:

其中compound_type定义如下:

hello_world_pmem程序运行时,需要传入一个PMem路径下的文件,用来开辟pmem pool。首次运行时(即传入的文件不存在),程序将创建一个新的pmem pool,并将struct root中的count和comp初始化并打印出来。接下来再次运行时(即传入的文件已经存在),程序会将此pmem pool打开,读取并打印上述两个变量的旧值,然后将它们更新,并将更新后的值再次写入pmem并打印。同时,会将他们的旧值添加到一个类型为pmem::obj::vector(与c++标准容器vector非常类似的持久化容器vector)的history变量中,history用来记录这两个变量的最近一定数量的历史值。如果发现存在历史值,会将一定数量的历史值按旧到新的顺序打印出来。

更详细的描述和API使用方法,请参考 hello_world_pmem.cpp 的注释部分。

hello_world_pmem运行示例

编译

首次运行

再次运行N次

poolset的使用方法

通常情况,当我们创建一个持久内存池(pmem pool)的时候,需要固定持久内存池的大小。对于某些应用,持久内存所需要的大小是动态变化的,这时候我们就需要poolset的方案来解决这个问题。poolset需要提供一个set file,来定义poolset的位置,以及最大的持久内存空间。下面是一个poolset的set file的简单示例:

其中/pmem/poolset为预先创建的目录位置,100G为最大的持久内存空间(但真实pool文件会动态分配,而不是直接分配100G的pool文件)。

使用poolset的时候需要注意:

相关技术背景资料

比赛推荐使用libpmemobj-cpp进行编程,以下推荐相关进一步的技术资料。