【发布时间】:2023-03-19 07:38:01
【问题描述】:
我一直在研究事务性内存及其对系统编程(数据库、操作系统、服务器等)的可行性。我自己使用事务的经验,以及看到很少有社区在实际代码中使用事务,提出了一个问题:什么会说服你,一个编写生产代码的开发人员,在你的工作中使用事务内存?
会被普遍采用吗?高速?提高可靠性?多少?
对于那些还没有见过它们的人,内存事务就像数据库事务:操作(显然)并行进行,如果两个事务之间存在冲突(例如,它们都写入相同的值),那么一个或两个的事务将被回滚并重新启动。
事务性内存有几个好处:
- 可靠性完全摆脱死锁(例如错误顺序锁定)。
- 性能 锁争用较少时速度更快。
- 可编程性 精细的并发控制,无需管理许多同步对象。
即使假设 TM 是正确、完整和快速的实现,与锁相比,这个原语也存在已知的缺点。
-
由于事务可能会执行多次,因此除了通过经验实验之外,更难以预测性能。
我们可以重现性能错误吗?
-
在正确的实现之间存在一些不同的政策决定,例如在另一个事务中结束的事务会发生什么?我们是现在提交,还是等待?
我们能否充分理解代码的局部影响?
-
为了在回滚的事务中支持不可撤销的行为(例如发送“发射导弹”命令),运行时变得更加复杂。
我们能否充分理解代码的全局影响?
最后,由于软件实现可能首先被使用(C、C++、Haskell、Clojure 和 Scala 等已经有实现),实际上存在性能问题。在适度的争用下,软件事务会带来性能损失。
您的绩效预算是多少?什么时候收益大于潜在成本?
【问题讨论】:
-
嗯,我希望得到比我们三个人更广泛的答案。
标签: performance multithreading synchronization reliability transactional-memory