并行计算&并发计算

1. 概念

    wikipedia上,二者的定义如下:

Parallel computing(并行计算) is a type of computation in which many calculations are carried out simultaneously, operating on the principle that large problems can often be divided into smaller ones, which are then solved at the same time.

Concurrent computing(并发计算) is a form of computing in which several computations are executing during overlapping time periods—concurrently—instead of sequentially (one completing before the next starts). This is a property of a system—this may be an individual program, a computer, or a network—and there is a separate execution point or "thread of control" for each computation ("process"). 

    浓缩一下:

  • 并行计算是一种将一个问题拆分成多个小问题同时执行的计算方式。

  • 并发计算是一种能够处理多个同时发生的事件的计算形式。

    举几个例子:

  1. 上学时,我们边看电视边写作业,此时,我们的眼睛会不断在电视屏幕和作业本上来回切换,这个过程就是并发,没有并行。

  2. 放学做值日,如果定义清扫完整个班级的地面是一个执行任务,那么1个学生独立完成整个任务就是串行,要是4个学生分工,同时清扫,就是并行,由于整体是一个执行任务,那么不算是并发。

  3. 由单纯扫地变为大扫除,分别定义擦玻璃,扫地,打水等多个执行任务,每类任务又有多个同学共同承担,同时去执行,那么这个过程既包括并发也包括并行。

    这样看来,并行计算与并发计算之间并没有必然联系。“并发是问题域中的概念——程序需要被设计成能够处理多个同时(或者几乎同时)发生的事件;而并行则是方法域中的概念——通过将问题中的多个部分并行执行,来加速解决问题。”

    自己的理解就说这么多,回到计算机领域说说并行架构和并发程序。

注:余下转载自并发编程网 – ifeve.com(http://ifeve.com/)。

本文链接地址: 《七周七并发模型》第一章概述(http://ifeve.com/concurrency-modle-seven-week-1/)。

2. 并行架构

1) 位级(bit-level)并行

    为什么32位计算机比8位计算机运行速度更快?因为并行。对于两个32位数的加法,8位计算机必须进行多次8位计算,而32位计算机可以一步完成,即并行地处理32位数的4字节。计算机的发展经历了8位、16位、32位,现在正处于64位时代。然而由位升级带来的性能改 善是存在瓶颈的,这也正是短期内我们无法步入128位时代的原因。

2) 指令级(instruction-level)并行

    现代CPU的并行度很高,其中使用的技术包括流水线、乱序执行和猜测执行等。程序员通常可以不关心处理器内部并行的细节,因为尽管处理器内部的并行度很高,但是经过精心设计,从外部看上去所有处理都像是串行的。而这种“看上去像串行”的设计逐渐变得不适用。处理器的设计者们为单核提升速度变得越来越困难。进入多核时代,我们必须面对的情况是:无论是表面上还是实质上,指令都不再串行执行了。

3) 数据级(data-level)并行

    并行地在大量数据上施加同一操作。这并不适合解决所有问题,但在适合的场景却可以大展身手。 图像处理就是一种适合进行数据级并行的场景。比如,为了增加图片亮度就需要增加每一个像素的亮度。现代GPU(图形处理器)也因图像处理的特点而演化成了极其强大的数据并行处理器。

4) 任务级(task-level)并行

    终于来到了大家所默认的并行形式——多处理器。从程序员的角度来看,多处理器架构最明显的分类特征是其内存模型(共享内存模型或分布式内存模型)。对于共享内存的多处理器系统,每个处理器都能访问整个内存,处理器之间的通信主要通过内存进行。


    对于分布式内存的多处理器系统,每个处理器都有自己的内存,处理器之间的通信主要通过网络进行。


    通过内存通信比通过网络通信更简单更快速,所以用共享内存编程往往更容易。然而,当处理器个数逐渐增多,共享内存就会遭遇性能瓶颈——此时不得不转向分布式内存。如果要开发一个容错系统,就要使用多台计算机以规避硬件故障对系统的影响,此时也必须借助于分布式内存。

3. 并发——不只是多核

    使用并发的目的,不仅仅是为了让程序并行运行从而发挥多核的优势。若正确使用并发,程序还将获得以下优点:及时响应、高效、容错、简单。

并发的世界,并发的软件

    世界是并发的,为了与其有效地交互,软件也应是并发的。

    一部手机可以同时播放音乐、上网浏览、响应触屏动作。我们在IDE中输入代码时,IDE正在后台悄悄检查代码语法。一架飞机上的系统也同时兼顾了好几件事情:监控传感器、在仪表盘上显示信息、执行指令、操纵飞行装置调整飞行姿态。

    并发是系统及时响应的关键。比如,当文件下载可以在后台进行时,用户就不必一直盯着鼠标沙漏而烦心了。再比如,Web服务器可以并发地处理多个连接请求,一个慢请求不会影响服务器对其他请求的响应。 

分布式的世界,分布式的软件 

    有时,我们要解决地理分布型问题。软件在非同步运行的多台计算机上分布式地运行,其本质是并发。

    此外,分布式软件还具有容错性。我们可以将服务器一半部署在欧洲,另一半部署在美国,这样如果一个区域停电就不会造成软件整体不可用。下面就介绍容错性。

不可预测的世界,容错性强的软件

    软件有bug,程序会崩溃。即使存在完美的没有bug的程序,运行程序的硬件也可能出现故障。

    为了增强软件的容错性,并发代码的关键是独立性和故障检测。独立性是指一个故障不会影响到故障任务以外的其他任务。故障检测是指当一个任务失败时(原因可能是任务崩溃、失去响应或硬件故障),需要通知负责故障处理的其他任务来处理。

    串行程序的容错性远不如并发程序。

复杂的世界,简单的软件

    如果曾经花费数小时纠结在一个难以诊断的多线程bug上,那你可能很难接受这个结论,但在选对编程语言和工具的情况下,比起串行的等价解决方案,一个并发的解决方案会更简洁清晰。

    在处理现实世界的并发问题时,这个结论可以得到印证。用串行方案解决一个并发问题往往需要付出额外的代价,而且解决方案会晦涩难懂。如果解决方案有着与问题类似的并发结构,就会简单许多:我们不需要创建一个复杂的线程来处理问题中的多个任务,只需要用多个简单的线程分别处理不同的任务即可。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值