并发计算

本页使用了标题或全文手工转换
维基百科,自由的百科全书

并发计算(英语:Concurrent computing,或译为并行处理共时计算),是一种程式计算的形式,在系统中,至少有两个以上的计算在同时运作,计算结果可能同时发生。用来实作并行系统(Concurrent system)的程式语言与各种演算法,统称为并行计算。

并行程式通常被设计为互动式的运算过程,因为它的运算过程是不确定的,在设计上的难度较高。设计并行程式最大的挑战,在于确保不同运算执行步骤间的互动或是通讯,能以正确的顺序进行,同时,也要确保在不同执行步骤间共享的资源,能够正确被存取。在这个领域的先驱人物有艾兹赫尔·戴克斯特拉东尼·霍尔泊·派克·汉森等人。

概论

并行计算,简单来说,就是将一个计算任务,分割成几个小的部份,让它们同时被计算,之后再汇整计算结果,以完成任务。它跟平行计算(Parallel computing)与分散式计算,有重叠之处,在概念上不同,但常会让人混淆。

并行计算是一种程式运算的特性,可以被视为是平行运算的进一步抽象,它包涵了时间片这种可以被用来实作虚拟平行运算(pseudoparallelism)的技术,因此在实际的物理运作中,计算过程可能是平行,或非平行的。

平行计算是指,当并行计算的程式,在机器平台上同时被执行的状况,因此,平行计算是一种机器运算的形式之一。分散式计算(Distributed computing)则是平行计算的一个特例,它采用计算机网路来进行同步。

实作并行程式有许多方式,依程式语言作业系统的支援,可以用行程,或是执行绪来实作。它可以执行在单一处理器上,将不同的执行步骤分散在不同时间片中执行,以非平行方式循序运算;它也可以用平行计算来实现,将每个行程指定给处理器组中的某个处理器,以单晶片多处理器平台,或是透过网路连结的分散平台来实做。

依照硬体与作业系统的支援,并行计算可以在同一个行程中完成,在同一个行程中以多执行绪来完成,以多个行程来达成,甚至可以分成数个程式来执行。可以用单处理器的循序计算来实作,也可以采平行计算或分散式计算方式实做。

但以平行方式来运作并行程式,并不必然会增进执行效率。因为执行结果可能会因为平台特性而改变,也增加它在设计上的难度。

技术优点

  • 并行计算可以增加产出 - 让并行程式以平行方式执行,在某个特定时间内,可以让数个行程同时完成计算任务,增加了产出。
  • 输入/输出的反应时间加快 - 密集进行输入/输出(I/O)操作的应用程式,多数的时间,都在等待输入或输出操作完成。在等待的时间中,并行计算编程可以让另外的行程来运作。
  • 更适当的程式架构 - 某些计算问题或问题的领域,特别适合以并行计算来解决。

并行互动与通讯

并行计算中,不同计算单元之间,需要进行通讯以保持同步。这些通讯方式,在某些并行程式语言中,是被隐藏起来的(例如,利用future方式)。以外显方式来进行通讯,可分成两种主要方式:

经由改变共享记忆体位址内的资料内容,让不同的并行单元间进行通讯,如JavaC#都支援这个方式。使用这种通讯类型的并行程式,通常需要应用某种锁定的方式来达成执行绪间的同步,这些锁定技术包括mutexsemaphore,或monitor等。
透过讯息的交换,使不同的并行单元间同步,如ScalaErlangoccam

并行计算模型

并行性程式语言

并发性编程语言使用编程语言结构特性进行并发。这些结构涉及到多线程,分布式计算,消息传递,资源共享(包括内存共享)。有时候我们也称这些语言是面向并发的编程语言(COPL)。 如今很多常用的语言都拥有并发的特性,例如:Java和C#。这两种语言底层都是通过内存共享以及锁监听机制的并发模型来实现(尽管消息传递模型如今也是基于内存共享模型实现的)。在消息传递的并发模型世界中,Erlang最具代表性并被广泛使用至今。

很多并发性编程语言更多的是被用作研究(例如:Pict)而非生产用途。尽管如此,在最近20年,还是有很多语言例如 Erlang,Limbo和Occam被用于生产工业。类似这些并发性编程语言还包括:

相关条目

引用