本文へスキップ

ソフトウェアトランザクショナルメモリとは?

そふとうぇあとらんざくしょなるめもり

ソフトウェアトランザクショナルメモリとは、データベースのトランザクションと同様の概念をメモリ操作に適用し、並行処理における競合状態をロックなしに安全に管理する仕組みです。

ソフトウェアトランザクショナルメモリ(Software Transactional Memory、STM)は、並行プログラミングにおける共有メモリへのアクセスをトランザクションの単位で管理する手法です。データベースのACID特性のうち原子性(Atomicity)と分離性(Isolation)をメモリ操作に持ち込んだものと考えることができます。

従来の並行制御では、ミューテックスやセマフォなどのロックを使って共有データへの排他アクセスを実現しますが、ロックには次のような問題があります。

  • デッドロック(複数スレッドが互いのロックを待って停止)
  • ライブロック・優先度逆転などの難しいバグ
  • ロックの粒度を細かくするほど設計が複雑になる

STMではこれらを解決するために「楽観的並行制御」を採用します。スレッドはロックなしに共有変数を読み書きし、コミット時に他スレッドによる競合変更がなかったかを検証します。競合が検出された場合はトランザクションをロールバックして再試行します。

STMを採用した言語・ライブラリの例としては、Haskell(GHCのSTMパッケージ)、Clojure(refと dosync)、Scala(Akka STM)などがあります。STMは競合が少ない状況では高いスループットを発揮しますが、競合が多いと再試行コストが増大するため、全ての場面で優れているわけではありません。ハードウェアトランザクショナルメモリ(HTM)と組み合わせることでさらに高速化できる研究も進んでいます。

使い方・例文

Haskellでは atomically ブロック内に複数の共有変数(TVar)の読み書きをまとめて記述するだけで、デッドロックなしに原子的な操作が保証されます。

この用語をシェア

𝕏 でポスト LINE

最終更新:

関連用語