Electronic Joint Business

Solution for E-Business

parallel

并行程序中的同步与通讯

在任何程序中,总会有些执行阶段要等待操作系统或者其他进程完成 I/O 操作或者同步操作。这时候,程序就无法处理其它工作,因为实际上是操作系统或者其它进程占用了宝贵的 CPU 时间。这就是滥用文件读/写操作的程序会如此之慢的原因。1

这时候进程不得不等待操作系统服务例程将 CPU 从其他进程那里释放出来。这种等待也被称为进程处于阻塞状态。诸如 EDA 这类串行计算,整个算法作为单个任务被执行,如果该进程在等待任一种阻塞操作,整个算法就会完全停顿。在处于阻塞状态的这段时间里,另一个进程占用了 CPU 的所有权,所以算法根本没办法进行。

并行程序提供了一种手段,能在同一计算中调用另一个进程以提高 CPU 利用率,当一个进程被阻塞的时候(如等待 I/O 操作或者同步操作),另一个进程则继续处理共同工作的其它部分。这种情况在单 CPU 或者多 CPU 机器上皆可发生。

反之,对于串行程序(即非并行算法)来说,而无论有多少可用的 CPU ,在任何情况下都只能用到单个 CPU。除非有编译器将源程序从串行转成并行,不过能实现这一目标的实属特例。 因此如果想同时利用多个 CPU ,编码时要手工运用某种并行技术。(在源代码中采用特殊指令,如 OpenMP)。

并行程序能将工作划分为较小的部分,因此多个进程可以一起工作并互相协作以便能在更短的时间内计算出同样的结果。这时,在等待 I/O 设备完成操作的同时,并行程序能可以继续处理另一部分工作。此外,并行程序还可以同时使用系统所有可用的 CPU。

>>> 阅读全文

 

, , , , , , ,

Axum, 一切为了并行 (三)

[b]域与状态共享[/b]

消息传递是种优秀的沟通机制,但它要消息中的数据必须可以被深拷贝或者不可变。但有时代理间共享数据会让程序更有效率,也更简单,当然,要提供一种安全的方式。

这就是设计出域的目的。域存在的目的是允许一组代理安全的共享状态,同时将该状态与其他人等隔离开来。

[b]在代理间共享状态[/b]

象普通类,域可以包含字段与方法,但更重要的,域定义可以包含代理的定义,在域内定义的代理可以存取域的字段。如

>>> 阅读全文

 

,

Axum, 一切为了并行 (二)

[b]代理编程[/b]

上面的斐波那契数列的例子只是展示了一个微不足道的构建数据流网的例子。这类网络适合那些“数据流入,数据流出”的场景,但它不能指定数据如何在网络中传播,也不允许不同类型的数据流入或者流出网络。

代理与通道给了我们创建复杂数据流网所需的一切。

通过通道沟通的两个代理是种弱关系:它不需要知道或关系另一个代理是如何实现的。它们之间的“契约”只由通道指定。借用OOP中的概念,通道扮演了接口的角色,而代理则是实现了该接口的类。

使用通道时,你向输入端口发送数据,从输出端口接受数据,这里,输入端口扮演了目标,而输出端口扮演了源头。而实现通道时,输入端口则是源头,输出端口则是目标。这有点难以理解,想想家里的水处理机,如果水是数据的话,考虑水的流向,你把水倒入入水口(水相对于你是流出),从出水口接水(水相对于你是流入),而处理机内部而言,水则是从进水口流入,从出水口流出。

>>> 阅读全文

 

, , , ,

Axum, 一切为了并行 (一)

编写并行程序并不容易,首先要将方案切割为许多并行任务(Task)。较为简单的方案,如计算每只股票的年收益率,很容易实施并行,因为任务之间彼此独立。但另外一些方案则十分复杂,任务之间彼此依赖且要相互协作,比如网络游戏。

Axum试图提供一种更为自然的方式来安排组件之间的协作问题。换句话说,如果将方案按照交互式组件建模,在Axum中编码会更为直接了当,而且你可能可以不被许多常见的并发问题所困扰。

并行的另一个目的是为了提速。经常,程序的反应速度总被象I/O或者用户输入这样的慢速组件所拖累。比如email客户端通过慢速的网络下载邮件的时候,程序还应该能继续响应用户的动作。

Axum的目标之一就是程序不需要再担心并发问题,理论上,你的程序将变得快速而且响应及时。为此,Axum不允许自由的共享和变更线程的状态,而只允许“有节制地”存取共享的状态,这解决了许多并发问题。

从”Hello,World”开始

>>> 阅读全文

 

, , ,