NVM代码总结

2021-07-04  本文已影响0人  CPinging

Optane非易失性内存代码实测:

使用PMDK中的obj封装好的库进行:

#include <stdio.h>
#include <string.h>
#include <libpmemobj.h>
#include <fstream>
#include <iostream>
#include <math.h>
#include <mutex>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
#include <vector>
#include <libpmem.h>
using namespace std;

POBJ_LAYOUT_BEGIN(lastfm_dataset);
POBJ_LAYOUT_ROOT(lastfm_dataset, struct MY_ROOT); //必须要定义才能够使用
// POBJ_LAYOUT_TOID(lastfm_dataset, LN) // 如何需要用其他结构体,需要在这里定义好
POBJ_LAYOUT_END(lastfm_dataset);
#define MAX_BUF_LEN 10

struct MY_ROOT {
    int a;
    int buf[MAX_BUF_LEN];
};
static inline int file_exists(char const *file) { return access(file, F_OK); }
int main(int argc, char *argv[])
{
    char* persistent_path = "/mnt/pmem/recNVM/data/lastfm";
    PMEMobjpool *pop; // 预先分配好空间
    if (file_exists(persistent_path) != 0) {
        pop = pmemobj_create(persistent_path, "lastfm_dataset", 8000000000,
                            0666); // 创建NVM的池子
        if (pop == NULL)
        {
            perror("pmemobj_create failed\n");
            exit(0);
        }
    } else {
        pop = pmemobj_open(persistent_path, "lastfm_dataset"); //如果已经创建则直接打开
    }

    TOID(struct MY_ROOT) root = POBJ_ROOT(pop, struct MY_ROOT); // 创建胖指针
    int buf[10];
    for(int i=0; i<10; i++)
        buf[i] = (i);
    TX_BEGIN(pop) {
        TX_MEMCPY(D_RW(root)->buf, buf, sizeof(float) * 10); //调用事务,原子性地将数据写入,其中D_RW将胖指针root转成常用瘦指针,不然不能操作
    } TX_END

    for(int i=0; i<10; i++){
        cout<<D_RO(root)->buf[i]<<" "; // D_RO表示读数据
    }

    pmemobj_close(pop);

    return 0;
}

上一篇下一篇

猜你喜欢

热点阅读