并发编程复兴的主要动力来自于所谓的“多核危机”。 为了让代码运行得更快,单纯依靠更快的硬件已经无法满足要求,需要利用多核,发觉并行执行的潜力。

并发

程序含有多个逻辑上的独立执行块,可以独立地并行执行,也可以串行执行。 同一时间应对(dealing with)多件事情的能力。

并行

同时执行整个任务的多个部分。 同一时间动手做(doing)多件事情的能力。

共同点: 比传统的串行编程更优秀。

不同点: 并发: 程序的执行是不确定的,会随着事件时序的改变而给出不同的结果。不确定性是其与生俱来且伴随始终的属性。

并行: 可能是确定的。用支持并行的编程语言可以写出并行程序,而不引入不确定性。

并行架构

位级并行 - bit level

对于32位数相加,8位计算机需要进行多次8位计算,而32位计算机可以一步完成。

指令级并行 - instruction level

处理器内部并行 使用的技术:流水线、乱序执行、猜测执行等 但是经过精心设计,从外部看上去所有处理都像是串行的。 随着单核提升速度越来越难,需要解决无论是表面上还是实质上,指令不再串行执行。

数据级并行 - data

也可称为单指令多数据 并行地在大量数据上施加同一操作。 不适合所有问题,但是在合适的场景可以大显身手。 如图像处理

任务级执行 - task level

多处理器。 分类特征:内存模型 - 共享内存模型和分布式内存模型

共享内存模型

每个处理器都能访问这个呢村,处理器之前的通信主要通过内存进行

分布式内存模型

每个处理器都有自己IDE内存,处理器之间的通信主要通过网络。

最后介绍了七种模型

  • 线程与锁
  • 函数式
  • Clojure之道
  • actor
  • 数据级并行
  • Lambda架构

需要带以下问题

  • 这个模型适用于解决并发问题、并行问题,还是两者皆可
  • 这个额模型适用于哪种并行架构
  • 这个额模型是否有利于我们写出有容错性强的代码,或用于解决分布式问答题的代码?