持久記憶體指令(PMDK)簡介

yzs87發表於2020-09-11

持久記憶體指令(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

   


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31493717/viewspace-2718980/,如需轉載,請註明出處,否則將追究法律責任。

相關文章