ソフトウェアトランザクショナルメモリ
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2023/02/19 19:55 UTC 版)
計算機科学において、ソフトウェアトランザクショナルメモリ(英: software transactional memory, STM)は、データベーストランザクションに似た並行性制御機構であり、並列計算を行う際の共有メモリへのアクセス法である。この機構はロックベースの同期を用いた並行性制御の代替手段として機能し、ノンブロッキングな方法で実装される物もある。ここでいうトランザクションとは、共有メモリに対する一連の読み出しと書き込みを実行するコードを意味する。論理的にはこれらの読み出しと書き込みは、時間的なある一点で行われ、他のトランザクションからはその間の状態は見えない。トランザクションを行うためにハードウェアにサポートさせるアイデア(ハードウェアトランザクショナルメモリ)は、1986年に Tom Knight により論文と特許として出された。そのアイデアを普及させたのが Maurice Herlihy と J.Eliot B. Moss である。1995年、Nir Shavit と Dan Touitou がこのアイデアをソフトウェアのみで行うトランザクショナルメモリ (STM) に拡張した。STM は近年非常に研究が進み、実用的な実装も進展している。
- 1 ソフトウェアトランザクショナルメモリとは
- 2 ソフトウェアトランザクショナルメモリの概要
- 3 提案されている言語側のサポート
- 4 不透明性
ソフトウェアトランザクショナルメモリ
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2022/03/26 23:32 UTC 版)
「Clojure」の記事における「ソフトウェアトランザクショナルメモリ」の解説
それぞれに10個の値の入った長さ100の配列(vector)があり、10×100=1,000個の異なる連続した数が格納されている。これら100個のvectorを16個のスレッドで共有する。各スレッドは、ランダムに2つのvectorを選びそれぞれの配列でランダムな位置を決めて、二つの配列の要素の内容を交換する、という作業をClojure言語のソフトウェアトランザクショナルメモリを使って行う。この作業を300,000回繰り返しても、最初に格納されていた1,000個の数はどれひとつとして失われることがない。 (defn run [nvecs nitems nthreads niters] (let [vec-refs (vec (map (comp ref vec) (partition nitems (range (* nvecs nitems))))) swap #(let [v1 (rand-int nvecs) v2 (rand-int nvecs) i1 (rand-int nitems) i2 (rand-int nitems)] (dosync (let [temp (nth @(vec-refs v1) i1)] (alter (vec-refs v1) assoc i1 (nth @(vec-refs v2) i2)) (alter (vec-refs v2) assoc i2 temp)))) report #(do (prn (map deref vec-refs)) (println "Distinct:" (count (distinct (apply concat (map deref vec-refs))))))] (report) (dorun (apply pcalls (repeat nthreads #(dotimes [_ niters] (swap))))) (report)))(run 100 10 16 300000)
※この「ソフトウェアトランザクショナルメモリ」の解説は、「Clojure」の解説の一部です。
「ソフトウェアトランザクショナルメモリ」を含む「Clojure」の記事については、「Clojure」の概要を参照ください。
固有名詞の分類
- ソフトウェアトランザクショナルメモリのページへのリンク