PMDK libpmemblk 例程1 读写持久化内存块

使用libpmemblk能直接访问storage(DAX),支持 load/store access,不需要 paging blocks。
libpmemblk API说明:http://pmem.io/pmdk/manpages/linux/master/libpmemblk/libpmemblk.7.html

Key:
pmemblk_create()  // 创建pmem的内存块
pmemblk_open()  // 打开已创建的内存块
pmemblk_nblock()  // 获得某内存块内分片元素数量
pmemblk_write()  // 将数据写入某分片元素
pmemblk_read()  // 从某分片元素中读出数据
pmemblk_set_zero()  // 将某分片元素设置成0
pmemblk_close()  // 关闭内存块
pmemblk_set_funcs()  // 允许用户覆盖libpmemblk内的malloc、free等函数,实现自定义malloc、free等
例子:

#include 
#include 
#include 
#include 
#include 

#include 

#define POOL_SIZE ((size_t)(1024 * 1024 * 1024))  /* size of the pmemblk pool -- 1 GB */
#define ELEMENT_SIZE 1024  /* size of each element in the pmem pool */

int main(int argc, char *argv[])
{
    const char path[] = "/root/hostnme/pmemblk.002";
    char buf[ELEMENT_SIZE];
    char rcv[ELEMENT_SIZE];

    /* create the pmemblk pool or open it if it already exists */
    PMEMblkpool *pbp = pmemblk_create(path, ELEMENT_SIZE, POOL_SIZE, 0666);

    if (pbp == NULL)
        pbp = pmemblk_open(path, ELEMENT_SIZE);

    if (pbp == NULL) {
        perror(path);
        exit(1);
    }

    /* how many elements fit into the file? */
    size_t nelements = pmemblk_nblock(pbp);
    printf("file holds %zu elements\n", nelements);

    /* store a block at index 5 */
    strcpy(buf, "hello, world");
    printf("buf: %s\n", buf);
    if (pmemblk_write(pbp, buf, 0) < 0 ||
        pmemblk_write(pbp, buf, 5) < 0 ||
        pmemblk_write(pbp, buf, 6) < 0) {
        perror("pmemblk_write");
        exit(1);
    }

    /* read the block at index 5 */
    if (pmemblk_read(pbp, rcv, 5) < 0) {
        perror("pmemblk_read");
        exit(1);
    }
    printf("rcv: %s\n", rcv);

    /* read the block at index 10 (reads as zeros initially) */
    if (pmemblk_read(pbp, rcv, 10) < 0) {
        perror("pmemblk_read");
        exit(1);
    }
    printf("rcv: %s\n", rcv);

    /* zero out the block at index 5 */
    if (pmemblk_set_zero(pbp, 5) < 0) {
        perror("pmemblk_set_zero");
        exit(1);
    }

    /* read the block at index 5 */
    if (pmemblk_read(pbp, rcv, 5) < 0) {
        perror("pmemblk_read");
        exit(1);
    }
    printf("rcv: %s\n", rcv);

    pmemblk_close(pbp);

    return 0;

运行结果如下:POOL_SIZE 除以 ELEMENT_SIZE 为 1024*1024,但结果为1044204,说明pmemblk创建时占用了部分字节,需根据pmemblk_nblock()得到pmemblk_create()创建得到的实际block数量。

$ ./manpage 
file holds 1044204 elements
buf: hello, world
rcv: hello, world
rcv: 
rcv:

通过pmempool查看结果,每一个block(0x000037f0减0x00003400等于1009),说明实际每个block中并没有1024的element,注意一下hello, world总共12个字符(中间有空格)对应与前面的12个字节68 65 6c 6c 6f 2c 20 77 6f 72 6c 64,中间无分隔符:

$ ./pmempool info -d /root/hostname/pmemblk.002 --skip-zeros 
Part file:
path                     : /root/hostname/pmemblk.002
type                     : regular file
size                     : 1073741824

POOL Header:
Signature                : PMEMBLK
Major                    : 1
Mandatory features       : 0x0
Not mandatory features   : 0x0
Forced RO                : 0x0
Pool set UUID            : 6aa96390-7748-4991-bccf-9c535261f909
UUID                     : c5af766e-054f-4b09-93ee-44efd89a0c40
Previous part UUID       : c5af766e-054f-4b09-93ee-44efd89a0c40
Next part UUID           : c5af766e-054f-4b09-93ee-44efd89a0c40
Previous replica UUID    : c5af766e-054f-4b09-93ee-44efd89a0c40
Next replica UUID        : c5af766e-054f-4b09-93ee-44efd89a0c40
Creation Time            : Wed Aug 22 2018 21:31:40
Alignment Descriptor     : 0x000007f737777310[OK]
Class                    : 64
Data                     : 2's complement, little endian
Machine                  : AMD X86-64
Last shutdown            : clean
Checksum                 : 0xdc5e837e32c6a106 [OK]

PMEM BLK Header:
Block size               : 1024
Is zeroed                : true

[ARENA 0]
PMEM BLK BTT Info Header:
Signature                : BTT_ARENA_INFO
UUID of container        : 6aa96390-7748-4991-bccf-9c535261f909
Flags                    : 0x0
Major                    : 1
Minor                    : 1
External LBA size        : 1024
External LBA count       : 1044204
Internal LBA size        : 1024
Internal LBA count       : 1044460
Free blocks              : 256
Info block size          : 4096
Next arena offset        : 0x0
Arena data offset        : 0x1000
Area map offset          : 0x3fbfd000
Area flog offset         : 0x3fff9000
Info block backup offset : 0x3fffd000
Checksum                 : 0x39e2a520dc291ae3 [OK]

PMEM BLK blocks data:
Block          0: offset: 0x00000001 state: normal
00003400  68 65 6c 6c 6f 2c 20 77  6f 72 6c 64 00 00 00 00  |hello, world....|
00003410  00 00 00 00 00 00 00 00  c4 95 23 0a 2c 7f 00 00  |..........#.,...|
*
00003430  04 00 00 00 00 00 00 00  28 4d 7b 09 2c 7f 00 00  |........(M{.,...|
00003440  04 00 00 00 00 00 00 00  16 00 00 00 00 00 00 00  |................|
00003450  0d 39 8a 92 00 00 00 00  c4 95 23 0a 2c 7f 00 00  |.9........#.,...|
00003460  e1 e5 49 92 02 80 ff ff  28 4d 7b 09 2c 7f 00 00  |..I.....(M{.,...|
00003470  04 00 00 00 00 00 00 00  16 00 00 00 00 00 00 00  |................|
00003480  57 db 93 1c 00 00 00 00  fb 9c 23 0a 2c 7f 00 00  |W.........#.,...|
00003490  b1 e5 49 92 02 80 ff ff  10 1a b6 6d fd 7f 00 00  |..I........m....|
000034a0  d0 37 7b 09 2c 7f 00 00  68 9d 7b 09 2c 7f 00 00  |.7{.,...h.{.,...|
000034b0  20 1b b6 6d fd 7f 00 00  10 1b b6 6d fd 7f 00 00  | ..m.......m....|
000034c0  17 00 00 00 00 00 00 00  15 cf 89 09 2c 7f 00 00  |............,...|
000034d0  00 00 00 00 00 00 00 00  c4 95 23 0a 2c 7f 00 00  |..........#.,...|
000034e0  18 fa 44 0a 2c 7f 00 00  00 4f b7 09 2c 7f 00 00  |..D.,....O..,...|
000034f0  03 00 00 00 00 00 00 00  16 00 00 00 00 00 00 00  |................|
00003500  31 6e d5 35 00 00 00 00  fb 9c 23 0a 2c 7f 00 00  |1n.5......#.,...|
00003510  30 57 65 01 00 00 00 00  90 1a b6 6d fd 7f 00 00  |0We........m....|
00003520  ec 4c b7 09 2c 7f 00 00  d8 61 b7 09 2c 7f 00 00  |.L..,....a..,...|
00003530  a0 1b b6 6d fd 7f 00 00  90 1b b6 6d fd 7f 00 00  |...m.......m....|
00003540  31 00 00 00 2c 7f 00 00  c0 1a b6 6d fd 7f 00 00  |1...,......m....|
00003550  00 00 00 00 00 00 00 00  30 59 43 0a 2c 7f 00 00  |........0YC.,...|
00003560  50 f5 44 0a 2c 7f 00 00  55 a9 ff 09 2c 7f 00 00  |P.D.,...U...,...|
00003570  50 6e b7 09 2c 7f 00 00  98 95 ff 09 2c 7f 00 00  |Pn..,.......,...|
00003580  00 00 00 00 01 00 00 00  c9 00 00 00 01 00 00 00  |................|
00003590  18 fa 44 0a 2c 7f 00 00  58 1c b6 6d fd 7f 00 00  |..D.,...X..m....|
000035a0  30 1c b6 6d fd 7f 00 00  01 00 00 00 00 00 00 00  |0..m............|
000035b0  30 59 43 0a 2c 7f 00 00  20 0a 45 0a 2c 7f 00 00  |0YC.,... .E.,...|
000035c0  c8 06 45 0a 2c 7f 00 00  df 9f 23 0a 2c 7f 00 00  |..E.,.....#.,...|
000035d0  00 00 00 00 00 00 00 00  c4 95 23 0a 2c 7f 00 00  |..........#.,...|
000035e0  01 00 00 00 2c 7f 00 00  28 4d 7b 09 2c 7f 00 00  |....,...(M{.,...|
000035f0  04 00 00 00 00 00 00 00  16 00 00 00 00 00 00 00  |................|
00003600  2e 4e 3d f6 00 00 00 00  fb 9c 23 0a 2c 7f 00 00  |.N=.......#.,...|
00003610  01 00 00 00 2c 7f 00 00  90 1b b6 6d fd 7f 00 00  |....,......m....|
00003620  30 4b 7b 09 2c 7f 00 00  a8 11 7c 09 2c 7f 00 00  |0K{.,.....|.,...|
00003630  a0 1c b6 6d fd 7f 00 00  90 1c b6 6d fd 7f 00 00  |...m.......m....|
00003640  2e 00 00 00 00 00 00 00  55 a9 ff 09 2c 7f 00 00  |........U...,...|
00003650  00 00 00 00 00 00 00 00  40 58 43 0a 2c 7f 00 00  |........@XC.,...|
00003660  18 fa 44 0a 2c 7f 00 00  d1 05 40 00 00 00 00 00  |..D.,.....@.....|
00003670  78 1d 7c 09 2c 7f 00 00  60 03 40 00 00 00 00 00  |x.|.,...`.@.....|
00003680  00 00 00 00 01 00 00 00  30 08 00 00 01 00 00 00  |........0.......|
00003690  d0 19 7c 09 2c 7f 00 00  58 1d b6 6d fd 7f 00 00  |..|.,...X..m....|
000036a0  30 1d b6 6d fd 7f 00 00  01 00 00 00 00 00 00 00  |0..m............|
000036b0  40 58 43 0a 2c 7f 00 00  a8 34 45 0a 2c 7f 00 00  |@XC.,....4E.,...|
000036c0  50 31 45 0a 2c 7f 00 00  df 9f 23 0a 2c 7f 00 00  |P1E.,.....#.,...|
000036d0  00 00 00 00 00 00 00 00  40 58 43 0a 2c 7f 00 00  |........@XC.,...|
000036e0  01 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
000036f0  01 00 00 00 fd 7f 00 00  50 31 45 0a 2c 7f 00 00  |........P1E.,...|
00003700  01 00 00 00 fd 7f 00 00  00 00 00 00 00 00 00 00  |................|
00003710  01 00 00 00 00 00 00 00  d8 61 b7 09 2c 7f 00 00  |.........a..,...|
00003720  00 00 00 00 00 00 00 00  a8 34 45 0a 2c 7f 00 00  |.........4E.,...|
00003730  a0 1c b6 6d fd 7f 00 00  90 1c b6 6d fd 7f 00 00  |...m.......m....|
00003740  2e 4e 3d f6 00 00 00 00  d1 05 40 00 00 00 00 00  |.N=.......@.....|
00003750  ff ff ff ff 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00003760  a8 11 7c 09 2c 7f 00 00  18 fa 44 0a 2c 7f 00 00  |..|.,.....D.,...|
00003770  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00003780  72 65 67 69 6f 6e 00 53  74 61 72 74 20 74 72 61  |region.Start tra|
00003790  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
000037b0  72 65 67 69 6f 6e 00 53  74 61 72 74 20 74 72 61  |region.Start tra|
000037c0  00 00 00 00 00 00 00 00  38 20 60 00 00 00 00 00  |........8 `.....|
000037d0  c0 08 40 00 00 00 00 00  90 1e b6 6d fd 7f 00 00  |[email protected]....|
000037e0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
000037f0  00 00 00 00 00 00 00 00  1e e9 23 0a 2c 7f 00 00  |..........#.,...|
------------------------------------------------------------------------------
Block          6: offset: 0x00000006 state: normal
00004800  68 65 6c 6c 6f 2c 20 77  6f 72 6c 64 00 00 00 00  |hello, world....|
00004810  00 00 00 00 00 00 00 00  c4 95 23 0a 2c 7f 00 00  |..........#.,...|
*
00004830  04 00 00 00 00 00 00 00  28 4d 7b 09 2c 7f 00 00  |........(M{.,...|
00004840  04 00 00 00 00 00 00 00  16 00 00 00 00 00 00 00  |................|
00004850  0d 39 8a 92 00 00 00 00  c4 95 23 0a 2c 7f 00 00  |.9........#.,...|
00004860  e1 e5 49 92 02 80 ff ff  28 4d 7b 09 2c 7f 00 00  |..I.....(M{.,...|
00004870  04 00 00 00 00 00 00 00  16 00 00 00 00 00 00 00  |................|
00004880  57 db 93 1c 00 00 00 00  fb 9c 23 0a 2c 7f 00 00  |W.........#.,...|
00004890  b1 e5 49 92 02 80 ff ff  10 1a b6 6d fd 7f 00 00  |..I........m....|
000048a0  d0 37 7b 09 2c 7f 00 00  68 9d 7b 09 2c 7f 00 00  |.7{.,...h.{.,...|
000048b0  20 1b b6 6d fd 7f 00 00  10 1b b6 6d fd 7f 00 00  | ..m.......m....|
000048c0  17 00 00 00 00 00 00 00  15 cf 89 09 2c 7f 00 00  |............,...|
000048d0  00 00 00 00 00 00 00 00  c4 95 23 0a 2c 7f 00 00  |..........#.,...|
000048e0  18 fa 44 0a 2c 7f 00 00  00 4f b7 09 2c 7f 00 00  |..D.,....O..,...|
000048f0  03 00 00 00 00 00 00 00  16 00 00 00 00 00 00 00  |................|
00004900  31 6e d5 35 00 00 00 00  fb 9c 23 0a 2c 7f 00 00  |1n.5......#.,...|
00004910  30 57 65 01 00 00 00 00  90 1a b6 6d fd 7f 00 00  |0We........m....|
00004920  ec 4c b7 09 2c 7f 00 00  d8 61 b7 09 2c 7f 00 00  |.L..,....a..,...|
00004930  a0 1b b6 6d fd 7f 00 00  90 1b b6 6d fd 7f 00 00  |...m.......m....|
00004940  31 00 00 00 2c 7f 00 00  c0 1a b6 6d fd 7f 00 00  |1...,......m....|
00004950  00 00 00 00 00 00 00 00  30 59 43 0a 2c 7f 00 00  |........0YC.,...|
00004960  50 f5 44 0a 2c 7f 00 00  55 a9 ff 09 2c 7f 00 00  |P.D.,...U...,...|
00004970  50 6e b7 09 2c 7f 00 00  98 95 ff 09 2c 7f 00 00  |Pn..,.......,...|
00004980  00 00 00 00 01 00 00 00  c9 00 00 00 01 00 00 00  |................|
00004990  18 fa 44 0a 2c 7f 00 00  58 1c b6 6d fd 7f 00 00  |..D.,...X..m....|
000049a0  30 1c b6 6d fd 7f 00 00  01 00 00 00 00 00 00 00  |0..m............|
000049b0  30 59 43 0a 2c 7f 00 00  20 0a 45 0a 2c 7f 00 00  |0YC.,... .E.,...|
000049c0  c8 06 45 0a 2c 7f 00 00  df 9f 23 0a 2c 7f 00 00  |..E.,.....#.,...|
000049d0  00 00 00 00 00 00 00 00  c4 95 23 0a 2c 7f 00 00  |..........#.,...|
000049e0  01 00 00 00 2c 7f 00 00  28 4d 7b 09 2c 7f 00 00  |....,...(M{.,...|
000049f0  04 00 00 00 00 00 00 00  16 00 00 00 00 00 00 00  |................|
00004a00  2e 4e 3d f6 00 00 00 00  fb 9c 23 0a 2c 7f 00 00  |.N=.......#.,...|
00004a10  01 00 00 00 2c 7f 00 00  90 1b b6 6d fd 7f 00 00  |....,......m....|
00004a20  30 4b 7b 09 2c 7f 00 00  a8 11 7c 09 2c 7f 00 00  |0K{.,.....|.,...|
00004a30  a0 1c b6 6d fd 7f 00 00  90 1c b6 6d fd 7f 00 00  |...m.......m....|
00004a40  2e 00 00 00 00 00 00 00  55 a9 ff 09 2c 7f 00 00  |........U...,...|
00004a50  00 00 00 00 00 00 00 00  40 58 43 0a 2c 7f 00 00  |........@XC.,...|
00004a60  18 fa 44 0a 2c 7f 00 00  d1 05 40 00 00 00 00 00  |..D.,.....@.....|
00004a70  78 1d 7c 09 2c 7f 00 00  60 03 40 00 00 00 00 00  |x.|.,...`.@.....|
00004a80  00 00 00 00 01 00 00 00  30 08 00 00 01 00 00 00  |........0.......|
00004a90  d0 19 7c 09 2c 7f 00 00  58 1d b6 6d fd 7f 00 00  |..|.,...X..m....|
00004aa0  30 1d b6 6d fd 7f 00 00  01 00 00 00 00 00 00 00  |0..m............|
00004ab0  40 58 43 0a 2c 7f 00 00  a8 34 45 0a 2c 7f 00 00  |@XC.,....4E.,...|
00004ac0  50 31 45 0a 2c 7f 00 00  df 9f 23 0a 2c 7f 00 00  |P1E.,.....#.,...|
00004ad0  00 00 00 00 00 00 00 00  40 58 43 0a 2c 7f 00 00  |........@XC.,...|
00004ae0  01 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00004af0  01 00 00 00 fd 7f 00 00  50 31 45 0a 2c 7f 00 00  |........P1E.,...|
00004b00  01 00 00 00 fd 7f 00 00  00 00 00 00 00 00 00 00  |................|
00004b10  01 00 00 00 00 00 00 00  d8 61 b7 09 2c 7f 00 00  |.........a..,...|
00004b20  00 00 00 00 00 00 00 00  a8 34 45 0a 2c 7f 00 00  |.........4E.,...|
00004b30  a0 1c b6 6d fd 7f 00 00  90 1c b6 6d fd 7f 00 00  |...m.......m....|
00004b40  2e 4e 3d f6 00 00 00 00  d1 05 40 00 00 00 00 00  |.N=.......@.....|
00004b50  ff ff ff ff 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00004b60  a8 11 7c 09 2c 7f 00 00  18 fa 44 0a 2c 7f 00 00  |..|.,.....D.,...|
00004b70  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00004b80  72 65 67 69 6f 6e 00 53  74 61 72 74 20 74 72 61  |region.Start tra|
00004b90  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00004bb0  72 65 67 69 6f 6e 00 53  74 61 72 74 20 74 72 61  |region.Start tra|
00004bc0  00 00 00 00 00 00 00 00  38 20 60 00 00 00 00 00  |........8 `.....|
00004bd0  c0 08 40 00 00 00 00 00  90 1e b6 6d fd 7f 00 00  |[email protected]....|
00004be0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00004bf0  00 00 00 00 00 00 00 00  1e e9 23 0a 2c 7f 00 00  |..........#.,...|
------------------------------------------------------------------------------

你可能感兴趣的:(Persistent,Memory)