私はトランザクショナル メモリと、システム プログラミング (データベース、オペレーティング システム、サーバーなど) の実行可能性についていくつかの作業を行ってきました。トランザクションを使用した私自身の経験と、実際のコードでトランザクションを使用するコミュニティがいかに少ないかを見てきたことから、次のような疑問が生じました。実動コードを作成している開発者が、業務にトランザクション メモリを使用することを納得させるにはどうすればよいでしょうか?
一般採用になるのでしょうか?高速?信頼性の向上?いくらで?
まだ見ていない方のために説明すると、メモリ トランザクションはデータベース トランザクションのように動作します。操作は (明らかに) 並行して進行し、2 つのトランザクション間で競合が発生した場合 (両方とも同じ値を書き込むなど)、トランザクションの一方または両方が実行されます。ロールバックされて再起動されます。
トランザクション メモリにはいくつかの利点があります。
- 信頼性デッドロックから完全に解放されます (たとえば、間違った順序のロック)。
- パフォーマンスロックの競合が少ない場合は速度が向上します。
- プログラマビリティ 多くの同期オブジェクトを管理せずに、きめ細かい同時実行制御を実現します。
ただし、 TM が正しく、完全で、高速に実装されていると仮定しても、ロックと比較すると、このプリミティブには既知の欠点があります。
トランザクションは数回実行される可能性があるため、経験的な実験以外でパフォーマンスを予測することはより困難です。
パフォーマンスのバグを再現できますか?
正しい実装間で異なるポリシー決定がいくつかあります。たとえば、別のトランザクション内で終了するトランザクションはどうなりますか? 今コミットしますか、それとも待ちますか?
コードの局所的な効果を十分に理解できるでしょうか?
ロールバックされるトランザクションで取消不能な動作 (「ミサイル発射」コマンドの送信など) をサポートするために、ランタイムはより複雑になります。
コードのグローバルな影響を適切に理解できますか?
最後に、ソフトウェア実装が最初に使用される可能性が高いため (いくつか例を挙げると、C、C++、Haskell、Clojure、および Scala には既に実装があります)、実際にはパフォーマンスの問題があります。競合が中程度の場合、ソフトウェア トランザクションはパフォーマンス ヒットを伴います。
パフォーマンスの予算はいくらですか? メリットが潜在的なコストを上回るのはどの時点ですか?