トランザクションメモリとは何ですか?

マルチコアプロセッサがますます一般的になるにつれて、利用可能なすべてのプロセッサを使用してプログラムを作成する機能がますます重要になります。 マルチコアプロセッサ用のプログラムを作成する既存の広く使用されている手段が十分なソリューションではない理由、トランザクションメモリとは何か、そしてこの問題をどのように解決するのかを見てみましょう。





原則として、プログラム(純粋に関数型の言語で記述されていない場合)には、これらのプログラムが配置される可変メモリ領域があります。 プログラムがこのデータを処理する複数の制御フローを持っている場合、それらへのアクセスは、他のストリームから並行して書き込まれているメモリ領域の読み取り、またはからの書き込みなど、並列アクセスに問題がないように構成することが重要です同時に2つのスレッド。



命令型言語プログラムでデータアクセスを同期する最も一般的な方法は、ブロッキングです。 データにアクセスする前に、ロックを取得する必要があります。ロックが既に取得されている場合、スレッドはロックが解除される瞬間を待ちます。 したがって、同じデータが複数のストリームにアクセスすることはありません。 残念ながら、問題があります。 多くのスレッドを同時に動作させたい。 したがって、プログラムデータの多かれ少なかれ独立した部分ごとに独自のロックが行われるようにプログラムを構成することは論理的です。 ただし、ロックが多数ある場合、デッドロックが発生する可能性があります。ロックが異なる順序で取得される場合です。 それらに対処するには、同じ順序でロックを取得する必要があります。 これを行うには、メソッドごとに、呼び出し元がどのロックを取得できるか、この呼び出し中にどのロックを取得できるかを理解し、ロックの順序が常に同じであることを確認する必要があります。 それは非常に困難に動作し、プログラムが動作しても、間違った場所に不正確に呼び出しを追加するとデッドロックにつながる可能性があります。



ロックに代わるものは何ですか? 共有データへのアクセスの問題に対する1つの解決策は、トランザクションメモリです。 トランザクションメモリを使用すると、データベーストランザクションと同様のトランザクションを使用してデータを操作できます。 トランザクションは、現在のトランザクションが現在のデータに対する唯一の操作であるかのように実行されます。 トランザクションの終了時に、他のトランザクションとの競合を探します。 そうでなかった場合(最も可能性の高いオプション)、変更が受け入れられ、そうでない場合、再度経肛門が繰り返されます。 さまざまなメモリ領域で動作する多数のスレッドを持つプログラムでは、このようなスキームは非常にうまく機能します。競合はまれであり、並列度は高くなります。 残念ながら、いくつかの欠点があります。トランザクションブロックでは、副作用のあるコードを呼び出さないことをお勧めします。入力/出力、画面への描画などです。



現在、かなり多数のライブラリ(たとえば、 MultiVerse for Java)があり、既存のプログラミング言語や、トランザクションメモリを直接サポートするいくつかの言語(Fortress、Clojure)でこのアプローチを使用できます。



All Articles