1.概览

感谢查看我阅读《七周七并发模型》的读书笔记。所有读书笔记内容不一定完美无缺,甚至可能有时候会存在一些错误,请批判性地阅读。如果我的读书笔记能给你带来一些帮助,我会感到十分高兴的。

并发编程是时代的选择。编发编程复兴的主要驱动力来自于所谓的”多核危机“。一些编程语言比如Erlang、Haskell、Go、Scala、Clojure因为对并发编程提供了良好的支持,而受到广泛的关注。

2.并发和并行

这个我用自己的话来解释可能更加明白:

  • 并发:同一时间段内能够完成多样事情,这几件事情在某个时间点上只有一件事被处理。例如你的CPU只有1个核心,他可以并发的处理多任务。你提交了多个CPU任务,在一个时间段内他们都完成了。但是实际上CPU是按照时间片轮转去分配时间处理多个任务的。在某个时间点上,CPU只处理一个任务。

  • 并行:在同一个时间点上,同时执行多个任务。例如多核情况,某个时间点上,多个核心上的任务可以同时被处理。

相比传统的串行模式,并发和并行模式都更加的先进了。

2.1 并发和并行的不确定性

并发程序的执行随着事件时序的改变会给出不同的结果,执行结果通常不确定。这种不确定性是其与生俱来的特点
并行程序的结果可以是确定的。可以用支持并行的编程语言写出并行的程序而不引入不确定性
例如要将数组中的每个数都加倍,一种做法是将数组分为两部分并把他们交给不同的核处理,这种做法的运行结果是确定的。

3. 并行架构

并行通常被认为等同于多核。实际上现代计算机在不同层次上都使用了并行技术。即使在单核内部也包含不同层次的并行,例如位级和指令级并行。

3.1 位级(bit level)并行

同时处理的位数。例如一般来说32位的比8位计算机快,因为其同时可以处理32位。

3.2 指令级(instruction-level)并行

这方面CPU会采用诸如流水线、乱序执行和猜测执行等技术。

3.3 数据级(data)并行、

数据级并行也称为“单指令多数据”(SIMD)架构。可以并行地在大量数据上施加同一操作。不过值得注意的是,这病不适合解决所有问题,只在适合的场景应用。例如图像处理场景比较适合数据级并行,比如增加图片亮度就要增加每一个像素的亮度。GPU就是因为图像处理演化的强大的数据并行处理器。

3.4 任务级(task-level)并行

普遍程序员认为的并行形式正是这种。多处理器系统最明显的分类特征是内存模型,可以分为共享内存模型分布式内存模型。据图如下图所示


共享内存的多处理器系统,每个处理器都能访问整个内存,处理器之间的通信主要通过内存进行。


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

通过内存通信比通过网络通信更加简单快速,而且共享内存编程也更加容易。但是随着处理器个数增多,容易遭遇瓶颈,这是就要借助于分布式内存

4. 并发不仅仅是为了利用多核

并发除了发挥多核优势外还可以使得程序获得:及时响应、高效、容错、简单。

  1. 及时响应:想想手机可以同时听音乐看小说就懂了。兼顾更多的事情,有更高的效率。
  2. 容错:并发代码有独立性和故障检测(一个任务失败了,让负责故障处理的其他任务来处理) 3.解决的方案应对复杂的问题:采用并发的解决方案往往会更加简单清晰

5.本书的7个模型

这本书中主要精心挑选了7个模型(原来有这么多,以前只知道线程与锁,哈哈)来介绍并发与并行。

  1. 线程与锁:虽然有很多不足,仍然是其他模型的基础,也是很多并发软件开发的首选。
  2. 函数式编程:函数式编程消除了可变状态,所以从根本上是线程安全的,而且易于并发执行。
  3. Clojure之道:分离标识与状态:指令式编程和函数式编程混搭,在两种编程方式间取得微妙的平衡来发挥两者的优势。
  4. actor:actor模型是一种适用性很广的并发编程模型,适用于共享内存模型和分布式内存模型,也适合解决地理分布型问题,能提供强大的容错性。
  5. 通信顺序进程(Communicating Sequential Processes,CSP):表面上看,CSP模型与actor模型很相似,两者都基于消息传递。不过CSP模型侧重于传递信息的通道,而actor模型侧重于通道两端的实体,使用CSP模型的代码会带有明显不同的风格。
  6. 数据级并行:
  7. Lambda架构:该架构综合了MapReduce和流式处理的特点,是一种可以处理多种大数据问题的架构。

带着以下三个问题来看之后的章节:

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