コンピュータサイエンスにおいて、永続メモリとは、データ構造を効率的に保存し、作成または最後に変更したプロセスが終了した後でも、メモリ命令またはメモリAPIを使用してアクセスし続けることができるようにするためのあらゆる方法または装置のことである。[ 1 ]
不揮発性ランダムアクセスメモリ(NVRAM)と混同されがちですが、永続メモリは、それを生成したプロセスの障害領域外に存在するプログラム状態を重視するという点で、永続性の概念により密接に関連しています。(プロセスとは実行中のプログラムのことです。プロセスの障害領域とは、例えばプログラムを実行しているコンピュータで使用されている信頼性の低いコンポーネントなどが原因で、プロセスが障害発生後も実行を継続することで破損する可能性のあるプログラム状態のサブセットのことです。)
効率的なメモリのようなアクセスは、永続メモリの決定的な特徴です。[ 2 ]これは、ロードやストアなどのマイクロプロセッサのメモリ命令を使用して提供できます。また、RDMA リードや RDMA ライトなどのリモート ダイレクト メモリ アクセス(RDMA) アクションを実装する API を使用して提供することもできます。バイト単位のデータへのアクセスを可能にするその他の低遅延方法も適格です。
永続メモリの機能は、格納されたビットの不揮発性だけにとどまりません。例えば、ページテーブルエントリや仮想アドレスを物理アドレスに変換するその他の構成要素といった重要なメタデータが失われると、永続ビットが非永続的になる可能性があります。この点において、永続メモリはファイルシステムなどのより抽象的なコンピュータストレージの形態に似ています。実際、既存の永続メモリ技術のほぼすべては、格納されたエクステントに名前や識別子を関連付けるために使用できる基本的なファイルシステムを少なくとも実装しており、少なくともそのようなエクステントに名前を付けたり割り当てたりするために使用できるファイルシステムメソッドを提供しています。
永続メモリ上でロックフリープログラムを実行すると、非永続書き込みの読み取り問題が発生することがわかっています。比較交換(CAS)操作では書き込まれた値が永続メモリに保持されないため、変更されたデータは、永続メモリ上のクラッシュオブザーバによって観測される前に、キャッシュコヒーレンスプロトコルによって並行オブザーバに可視化される可能性があります。書き込みが可視化された直後に電源障害が発生しても、まだ永続化されていない場合、非永続書き込みの読み取り問題が発生する可能性があります。つまり、比較交換操作によって変更されたデータ変数が、クラッシュオブザーバよりも先に並行オブザーバに可視化され、クラッシュ時の不整合を引き起こす可能性があります。
問題を説明するために、単方向リンクのロックフリーリストの場合、プロデューサースレッド Aが先頭ノードの後にノードを挿入すると、先頭ノードのnextポインタがアトミックに切り替えられ (CAS)、新しいノード Aを指すようになりますが、この CAS は永続化されません。次に、プロデューサースレッド Bがノード Aの後に別のノードを挿入します。ノード Aの CAS は既にすべての同時実行スレッドから見える状態です。CAS はノード Aのnextポインタをノード Bを指すようにアトミックに切り替え、この CAS は永続化されます。この時点で停電が発生すると、リンク リストを使用するアプリケーションは矛盾した状態になり、先頭ノードからノード Aへのnextポインタが永続化されていないため、ノード Aとノード Bの両方が失われます。ノード B は公開されていますが、再起動後にはアクセスできず、ノード Bを介してアクセスされる、またはノード Bに依存する他のデータが永続化されている可能性があるため、そのようなデータへの以降のアクセスはすべて不可能になり、データ損失が発生します。[ 3 ]
非永続書き込みの読み取り問題は、ロックフリーのリンクリストに限らず、同時可視性と永続可視性の間に潜在的なギャップが存在する可能性のあるあらゆるロックフリーのデータ構造で発生する可能性があります。たとえば、永続的な循環バッファでも同様の問題が発生します。[ 4 ]