《七周七并发模型》读书笔记-概述
并发还是并行
- 并发程序:含有多个逻辑上的独立执行块,它们可以独立并行执行,也可以串行执行。
- 并行程序:跟串行程序相对,它比串行程序快的原因:可以同时执行整个任务的多个部分。并行程序可能有多个独立执行块,也可能只有一个。
从另一个角度来理解并发和并行:
- 并发:是问题域中的概念,程序需要被设计成能够处理多个同时(或几乎同时的)发生的事件。
- 并行:是方法域中的概念,将问题的多个部分同时执行,来加速解决问题。
引用Rob Pike
(Go语言之父)的经典论述:
- 并发:是同一时间处理(dealing with)多件事情的能力。
- 并行:是同一时间做(doing)多件事情的能力。
实际案例:
- 并发:王老师在听同学朗读的时候,她可以暂停同学的朗读,然后回答其它同学的问题。(这是
并发
但是不是并行
,因为仅有王老师一个人,某一时刻只能做一件事情) - 并行:如果王老师还有一位助教小红,王老师听同学朗读,小红回答其它同学的问题,这是并发(同时处理多件事情),也是并行(同时做多件事情)。
个人理解:
- 并发:比如一个人做晚餐,用电饭锅开始煮饭后,开始热锅炒菜,锅在预热的时候,再去烧一壶水,这是并发,同时在处理多件事情 。
- 并行:比如两个人做晚餐,一个人在炒菜,一个人在煲汤,或者一个人在炒青菜,另一个人在煎鱼,这是并行,同时有多个人在做事情。
并发与并行易混淆的原因:
传统的
线程与锁
模型不支持并行。如果要用线程与锁模型写一个并行程序,只能写一个并发的程序,同时运行在多核机器上。
并发:天生带有不确定性,它会随着事件时序的改变而给出不同的结果。
并行:可以是确定的,如将数组中的每个数都加倍,把数组分成两部分,分别交给一个核处理,这种做法运行结果是确定的。用支持并行的语言写出并行程序,从而排除不确定性。
并行架构
并行不等同于多核
现代计算机在不同层次上都使用了并行技术,单核机器运行速度越来越快的原因也是在于在位级和指令级上使用了并行技术。
并行架构有四个层级:
- 位级(bit-level)并行。
- 指令级(instruction-level)并行。
- 数据级(data-level)并行。
- 任务级(task-level)并行。
位级并行
为什么32位的计算机运行速度比8位更快?因为并行。
两个32位数的加法,8位计算机要进行多次8位计算,而32位计算机可以一步完成。
指令级并行
现代CPU的并行度很高,其中使用的技术包括流水线、乱序执行和猜测执行等。
流水线,乱序执行,猜测执行具体含义?待补充。
数据级并行
数据级并行也称为单指令多数据(SIMD)架构,可以并行地在大量数据上施加同一操作,图形处理器(GPU)就是强大的数据并行处理器(比如,如增加图片的亮度,就需要增加每个像素点的亮度)。
任务级并行
任务级并行最明显的特征是其内存模型:共享内存模型或分布式内存模型。
共享内存模型
对于共享内存模型,每个处理器都能够访问整个内存,处理器之间的通信主要通过内存进行。
分布式内存模型
对于分布式内存模型,每个处理器都有自己的内存,处理器之间的通信主要通过网络进行。
两种内存模型比较
- 共享内存模型因为通信过程相对简单,所以用共享内存模型编程更加容易。
- 如果要开发高可用系统,规避硬件故障对系统的影响,这个时候只能选用分布式内存模型。
并发:不只是多核
使用并发的目的,不仅仅是为了利用多核处理器的优势,正确使用并发,还能获得诸如及时响应、高效、简单、容错性高等优点。
使用并发还有基于如下因素考虑:
- 世界是并发的,为了与其有效交互,软件也应是并发的。
- 为了处理分布式问题。
- 增强软件的容错性,并发代码的关键是独立性和故障检测。独立性是出了故障的任务不会影响到其它任务,故障检测指的是当一个任务出现故障时,能够通知负责处理故障的任务来执行。
- 世界是复杂多变的,使用并发程序来处理现实问题相对串行程序更简单。