acm-header
登录

ACM通信

研究突出了

技术角度:交易是明天的负荷和储存


在计算机科学中,当我们说“时间就是金钱”时,我们通常指的是两种类型的时间,它们决定了给定计算机程序的成本和收益:程序运行所需的时间,以及程序编写和维护所需的时间。在这两种时间类型之间有一个微妙的权衡:我们希望程序运行得越快,我们在编写和维护它时需要花费的时间就越多,反之亦然。

直到最近,这种取舍似乎在很大程度上还可以被忽略。使程序运行得更快的工作落到了硬件架构师的肩上,他们继续以可靠的速度提高单CPU时钟速度。这些可靠的速度提高使得软件工程师和编程语言设计师可以专注于添加软件结构,从而大大减少编写和维护代码所需的时间。这是怎么做到的?我们想到的术语是抽象、模块化和组合性。

不幸的是,正如我们所听到的,事情即将发生巨大的变化。摩尔定律并没有被废除,每年都有越来越多的晶体管被放入同一个空间,但CPU时钟速度不能再有效地提高。硬件设计师转而采用多核架构,在这种架构中,每个处理器芯片上都包含多个计算核心。向多核架构的切换可以提高并行性,但不能提高单线程性能。即使这种增加的并行性以可靠的速度交付,硬件设计人员自己也无法交付程序运行速度的可靠提高。这项工作对软件工程师来说是唾手可得的。

在当今的编程语言中,处理并发性的主要工具是锁——一种允许加载和存储序列以互斥方式访问数据的软件结构。事实上,基于锁的程序在多核架构上具有惊人的性能。然而,越来越明显的是,虽然使用锁将允许我们继续减少程序运行所需的时间,但它们将导致我们编写和维护程序所需的时间迅速恢复。

问题的核心可能是,没有人真正知道如何组织和维护依赖于锁定的大型系统。锁不是模块化的,也不是组合的,锁和数据之间的关联主要是通过约定建立的。最终,这种关联只存在于程序员的脑海中,并且可能只记录在注释中。

解决这个问题的一个有希望的办法是引入原子的记忆事务作为多核编程抽象。虽然事务已经在数据库社区中使用了多年,但现在,它们被提议作为我们通常在程序中使用的负载和存储的平等伙伴,甚至可能是替代品。这个想法很简单:在一个事务中封装加载和存储的序列,并保证如果任何操作发生,它们都发生,并且如果它们发生,它们对其他线程来说是原子地进行操作,作为一个不可分割的操作。

工作上设计高效事务内存实施工作一直在认真地进行。但是,这里缺少一个元素:一个基于事务内存的并发性框架,该框架将在设计和维护大规模并发系统时提供必要的模块化和组合性。

这就是蒂姆·哈里斯、西蒙·马洛、西蒙·佩顿·琼斯和莫里斯·赫里希在可组合存储事务方面的突破性工作的中心。他们第一次提供了一个并发语言模型和一组构造,允许事务性编程中真正的简单性。

他们必须克服的一个困难来源是,事务是乐观的:它们被尝试过,但可能失败并必须回滚,因此不能允许在事务中发生具有副作用的事件,例如I/O。

作者的解决方案是在纯声明性语言中使用事务,事实证明,这是事务的完美匹配,因为类型系统显式地将可能有副作用的计算与无效果的计算分离开来。

另一个大问题是并发编程要求线程等待其他线程的事件。在事务外部等待条件极大地限制了它能做的事情,而在事务内部等待则会使事务陷入僵局。

作者通过引入新的事务结构解决了这个问题,其中包括一个优雅的重试命令,它允许事务有效地中止,然后只有在一个潜在的好事件增加了满足条件的可能性之后才重新启动。非常令人惊讶的是,重试是允许组合事务操作序列以使它们一起生效的关键因素。

语言结构和添加的事务组合构造提供了一个干净的框架,允许事务组合,而不放弃它们对锁的天然优势:并发程序员可以使用内存中跨多个对象的原子操作进行编程,而不必打破抽象障碍。

如果多核体系结构是继续提高程序运行时间的方法,那么可能组合内存事务是提高我们编写和维护它们的时间的方法。

回到顶部

作者

近红外光谱Shavit(shanir@cs.tau.ac.il)是过去ACM的PODC和SPAA会议的项目主席,并获得了2004年ACM的Gödel理论计算机科学奖。

回到顶部

脚注

DOI: http://doi.acm.org/10.1145/1378704.1378724


©2008 acm 0001-0782/08/0800 $5.00

允许制作本作品的全部或部分的数字或硬拷贝用于个人或课堂使用,但前提是该拷贝不是为了盈利或商业利益而制作或分发,并且该拷贝在第一页上带有本通知和完整引用。以其他方式复制、重新发布、在服务器上发布或重新分发到列表,需要事先获得特定的许可和/或付费。

数字图书馆是由计算机协会出版的。版权所有©2008 ACM有限公司


没有发现记录

登录为完全访问
»忘记密码? *创建ACM Web帐户
文章内容:
Baidu
map