天天看點

PMDK libpmem 例程2 數組寫入持久化記憶體

數組寫入持久化記憶體

libpmem是一個低層次持久化記憶體的庫,當需要持久化存儲的時候,需要手到flush,是以通常開發者采用libpmemobj更友善。

Key:

addr pmem_map_file() // 建立持久化記憶體的檔案,并将檔案映射,得到指向檔案的指針

pmem_memcpy_persist() // 若位址是指向持久化記憶體的數組,則采用pmem_memcpy_persist進行持久化

pmem_msync() // 若位址指向普通易失性記憶體的數組,則采用memcpy() 和 pmem_msync()進行持久化

pmem_unmap() // 解除映射關系

此處使用pmem_memcpy_persist(),不僅僅隻是針對數組,還可以針對長字串等大内容的資料。

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <libpmem.h>

/* just copying 4k to pmem for this example */
#define BUF_LEN 4096

int main(int argc, char *argv[])
{
    char buf[BUF_LEN];
    char *pmemaddr;
    size_t mapped_len;
    int is_pmem;

    /* create a pmem file and memory map it */
    if ((pmemaddr = pmem_map_file(argv[], BUF_LEN,
                PMEM_FILE_CREATE|PMEM_FILE_EXCL,
                , &mapped_len, &is_pmem)) == NULL) {
        perror("pmem_map_file");
        exit();
    }

    printf("mapped_len: %d\n", (int)mapped_len);
    printf("BUF_LEN   : %d\n", BUF_LEN);

    for (unsigned int i = ; i < mapped_len; ++i) {
        buf[i] = ;
    }

    /* write it to the pmem */
    if (is_pmem) {
        pmem_memcpy_persist(pmemaddr, buf, mapped_len);
    } else {
        memcpy(pmemaddr, buf, mapped_len);
        pmem_msync(pmemaddr, mapped_len);
    }

    pmem_unmap(pmemaddr, mapped_len);

    exit();
}
           

運作後結果:

$ ./simple_copy pmem.
mapped_len: 
BUF_LEN   : 
           

參考文獻:http://pmem.io/pmdk/libpmem/