注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

中吴南顾惟一笑

成功法则就是那19个字

 
 
 

日志

 
 

STM  

2012-09-26 16:25:26|  分类: R&D |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

多核的普及给传统的程序设计模型带来了巨大的挑战,设计出可靠并且高效的并行程序目前还是一件很困难的事情。
并行程序由于存在并发和不确定性,其设计比顺序程序困难得多。心理学研究表示,人把注意力分散开来处理多个任务的能力是有限的。另外,在顺序程序分析中只需要考虑上下文,而在并行程序分析中还需要显式地去考虑同步问题。因此这类程序难于调试,同时程序中的错误也几乎不可能再现。

在多核处理器程序设计中,需要解决的关键问题是同步多个线程对共享内存的访问。传统上,这一问题主要使用基于锁的同步机制来解决。但是锁有下列问题:
1)粗粒度的锁虽然易于使用,但是性能低。例如,通过一个唯一的全局锁来同步所有对共享链表的操作,这时即使是两个无关的操作也要被迫顺序执行;
2)细粒度的锁虽然性能高,但是难于使用,并且容易导致优先级反转(Priority inversion)、死锁(Deadlock)、护航(Convoying)等问题;
3)基于锁的程序可组合性差,锁与条件变量不支持模块化编程。

于是后来产生了无锁编程(Lockless programming)的概念,即使用原子操作(Atomic Operations)和同步路障(Memory barrier)来完成线程间同步的功能,这种方法规避了使用锁时出现的上述问题并极大的提高了并行度,但是面临着原子操作本身功能局限性和组合性(Compositionality)不佳的问题。原子操作的局限性使得无锁编程的算法设计很难。


Transactional Memory,它将数据库中事务模式的核心思想移植到编程语言里来。程序员将自己的程序编写为一个个具有确定原子性的块,它们可以分离执行,因此只有在每个原子行为执行前和执行后,并发操作才能访问共享数据。通过将一系列操作抽象为事务,避免了程序设计员考虑复杂的同步问题。

事务内存目前有两种实现方式,基于软件的STM(Software Transactional Memory)和基于硬件的HTM(Hardware Transacational Memory)。

STM将内存堆或栈看作事务性数据集,可以开始一个事务,提交一个事务,甚至中止回滚事务。在遇到冲突时,事务自动重试。遇到中止时,内存回滚。事务是可嵌套的。

在各种编程语言中,Haskell在语言中内置了对STM的近乎完美支持。


总之,并行计算的理想境地应该是:

1. 函数式编程(FP)而不是面向对象编程(OOP),函数调用没有任何副作用,采用不可变(Immutable)数据;
2. 没有共享,包括状态和数据,分布式计算跟本地计算一样;
3. 通过消息传递实现实体间通信。

Erlang就通过软件(虚拟机)来实现了这样一种计算模型。

  评论这张
 
阅读(98)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017