天天看點

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

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

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

經曆兩次核心态切換,經過一次CPU COPY。

2、mmap+memcpy的IO機制

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

沒有了核心态到使用者态之間的切換。仍然需要一次CPU COPY。

3、PMDK的IO機制

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

都是在使用者态進行操作,同樣需要經過一次CPU COPY,不過通過MOVNT指令,不經過CPU CACHE。另外通過單指令多資料進行copy。理論上比memcpy快。

附錄