問題タブ [stm]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
scala - ソフトウェア トランザクショナル メモリを実際に使用した経験はありますか?
最近、STM (ソフトウェア トランザクショナル メモリ) フレームワークと言語拡張への関心が高まっているようです。 特にClojureは、ローリング コミット ログではなくMVCC (マルチバージョン同時実行制御)を使用する優れた実装を備えています。GHC Haskell には、トランザクション合成も可能にする非常にエレガントな STM モナドもあります。最後に、私自身の口癖を少しだけ説明するために、私は最近、参照制限を静的に適用する Scala 用の STM フレームワークを実装しました。
これらはどれも興味深い実験ですが、その領域だけに限定されているようです (実験)。私の質問は、現実の世界で STM を見たり使用したりしたことがある人はいますか? もしそうなら、なぜですか?それはどのような利益をもたらしましたか。パフォーマンスはどうですか?(この点については多くの矛盾する情報があるようです) STM を再び使用しますか、それともアクターのような他の並行処理の抽象化を使用したいと思いますか?
locking - トランザクション メモリを要求しすぎていませんか?
私は最近、トランザクションメモリについてよく読んでいます。TM は少し誇大宣伝されているため、多くの人が熱心に取り組んでおり、ロックに関する厄介な問題の解決策を提供していますが、定期的に苦情も見られます。
- I/O を行うことはできません
- アトミック セクションを複数回実行できるように記述する必要があります (ローカル変数に注意してください!)。
- ソフトウェア トランザクショナル メモリのパフォーマンスが低い
- [ここにあなたのペットのおしっこを挿入してください]
私はこれらの懸念を理解しています: 多くの場合、いくつかの本当に気の利いたアトミック操作 ( LL/SCなど) をサポートする特定のハードウェアでのみ実行される STM に関する記事を見つけたり、架空のコンパイラでサポートする必要があるか、それを必要とします。メモリへのすべてのアクセスがトランザクショナルであること、モナド スタイルの型制約などが導入されることなどです。そして何よりも、これらは実際の問題です。
ロックの代わりにトランザクション メモリをローカルで使用することに反対する理由は何ですか? これはすでに十分な価値をもたらすでしょうか、それともトランザクション メモリを使用する場合、あらゆる場所で使用する必要がありますか?
multithreading - ソフトウェア トランザクショナル メモリをどのように実装しますか?
実際の低レベルのアトミック命令とメモリ フェンス (使用されていると思います) に関して、STM をどのように実装しますか?
私にとって不可解な部分は、コードの任意のチャンクが与えられた場合、後で戻って各ステップで使用された値が有効かどうかを判断する方法が必要だということです。それをどのように行い、どのように効率的に行うのですか? これは、他の「ロック」ソリューションと同様に、(競合の可能性を減らすために) クリティカル セクションをできるだけ小さくしたいことを示唆しているようにも思えますが、そうですか?
また、STM は「計算の実行中に別のスレッドがこの領域に入ったため、計算は無効です」を単純に検出できますか、それとも破壊された値が使用されたかどうかを実際に検出できますか (したがって、運が良ければ、2 つのスレッドが同じクリティカル セクションを実行せずに同時に実行される場合があります)。ロールバックの必要性)?
c - STM hash library for C (glib?)
I'm looking for some C library that includes STM-style (Software Transactional Memory) hash maps, but I had no luck so far. It would be great if it was based on glib / gobject, but it's not that crucial. It also doesn't need proper transactions over many objects - single immutable hash support is all I really need.
Must haves: immutable snapshot read, lock-free write with auto-retry.
clojure - ネストされたdosync呼び出しはどのように動作しますか?
ネストされたdosync呼び出しを作成するとどうなりますか?サブトランザクションは親スコープで完了しますか?親トランザクションが失敗した場合、これらのサブトランザクションは元に戻せますか?
multithreading - スレッド レベルのメモリ保護/ページングを使用する場合、実行時にどのような問題が発生しますか?
さて、今日はプロセスごとのメモリ ページング/保護をサポートします。私は何年もの間、私たちの OS が現在サポートしている最小の実行単位であるスレッドにページ レベルの保護を提供することで、どのような利点が得られるのか疑問に思っていました。 ソフトウェア トランザクショナル メモリに関するこの質問は、私にとって最前線に戻ってきました。
ページ レベルのスレッド所有権を持つ利点
- アクセス時にページをロックするための OS サポート
- 理論的には、OS がスレッドの存続期間にわたって所有権を取得するメカニズムを持っている場合、メモリ破損に対する保護。
欠点:
- 標準的なロック手法によるデッドロックの検出は、すでに十分に困難です
- ページレベルの所有権を決定するためのデバッガー/OS サポート
このようなモデルをサポートすることでわかるその他の欠点や利点はありますか?
java - Clojure STM(dosync)xJava同期ブロック
Clojure STM(dosync)アプローチとJava同期ブロックの違いは何ですか?
「居眠り床屋」の問題から以下のコードを読んでいます。(http://www.bestinclass.dk/index.clj/2009/09/scala-vs-clojure-round-2-concurrency.html)
競合状態を回避するためにdosync
が使用されているので、「Java同期ブロックとの違い(STM)は何ですか?」と自問します。この重要なコードをブロックしますか?
前もって感謝します !ダンタス
haskell - Clojure、Haskell (およびその他の言語) で STM 用に使用されているアルゴリズムは何ですか?
私が理解しているように、ソフトウェア トランザクショナル メモリを実装するためのアルゴリズムはいくつかあります (これは非常に活発な研究分野です)。さまざまな言語やライブラリ、特に Clojure と Haskell (GHC) で使用されている (ソース コードに飛び込まなくても) どこで見つけることができますか?
clojure - clojure STMプログラムを永続化するにはどうすればよいですか?
私はSTMを使用するclojureプログラムを書いています。現時点では、データベースからの起動時に(refsを使用して)STMにデータを入力し、dosyncトランザクションが成功するたびにデータベースを非同期的に更新しています。しかし、これを正しい方法で行っているのか、それともこれを行うためのより優れた標準的な手法があるのかはわかりません。ClojureプログラムでSTMのACIプロパティをACIDに変換する方法を誰かに説明してもらえますか?
haskell - ClojureSTMはHaskellSTMとどのように異なりますか?
ClojureがSTMと呼んでいるものと、HaskellにSTMとして実装されているものとの違いを見つけようとしています。実際の言語のセマンティックの違いは別として、Rich HickeyがスピーチでClojureのSTMの実装は他のどの言語とも大きく異なると言っているので、少し混乱していますが、言語の選択以外の違いはわかりません。