前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >持久内存指令(PMDK)简介

持久内存指令(PMDK)简介

原创
作者头像
yzsDBA
修改2020-09-16 10:11:48
1K0
修改2020-09-16 10:11:48
举报

持久内存指令(PMDK)简介

PMDK函数

libpmem库主要特性是提供一种将脏数据刷写到持久内存的方法。常用的函数主要包括pmem_flush、pmem_drain、pmem_memcpy_nodrain。由于CPU CACHE内容向PM刷写的时机和顺序不受用户控制,所以需要特定指令进行强制刷写。pmem_flush的功能为调用CLWB、CLFLUSHOPT或CLFLUSH指令强制将CPU CACHE中内容(以cache line为单位)刷写到PM;指令发起后,由于CPU是多核,cache中内容到PM的顺序也不一样,所以还需要pmem_drain即调用SFENCE指令,确保CLWBs全部执行完成。如果pmem_flush调用的指令是CLFLUSH,则该指令中包含sfence,所以理论上不再需要调用pmem_drain,实际上如果是这个指令的话,pmem_drain什么也不做。

上述讲述了CPU cache内容向PM刷写的函数。下面讲述内存拷贝,即从内存向PM拷贝数据。该功能由pmem_memcpy_nodrain完成,调用MOVNT指令(MOV或MOVNTDQ),该指令拷贝不经过CPU CACHE,所以这个功能不需要flush。但是需要在结束的时候建立sfence确保所有数据都已经拷贝到PM。

优势

1、write的IO机制

经历两次内核态切换,经过一次CPU COPY。

2、mmap+memcpy的IO机制

没有了内核态到用户态之间的切换。仍然需要一次CPU COPY。

3、PMDK的IO机制

都是在用户态进行操作,同样需要经过一次CPU COPY,不过通过MOVNT指令,不经过CPU CACHE。另外通过单指令多数据进行copy。理论上比memcpy快。

附录

内存屏障作用、指令顺序:

https://blog.lovezhy.cc/2020/03/14/%E6%90%9E%E6%87%82%E5%86%85%E5%AD%98%E5%B1%8F%E9%9A%9C-%E6%8C%87%E4%BB%A4%E4%B8%8EJMM/

https://blog.csdn.net/maokelong95/article/details/80727952

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 持久内存指令(PMDK)简介
    • PMDK函数
      • 优势
        • 1、write的IO机制
        • 2、mmap+memcpy的IO机制
        • 3、PMDK的IO机制
      • 附录
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档