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