《七周七并发模型》笔记

第1章:概述

并发和并行的区别:

  • concurrence 并发是同一时间应对(dealing with)多件事情的能力;(逻辑时间上同时执行的执行块,单核多线程,每个线程分别占有CPU一段时间,然后切换到另外一个线程,看起来像是同时执行)

  • parallel 并行是同一时间动手做(doing)多件事情的能力。(物理时间上的同时执行的执行块,多核多线程,每个线程独占一个CPU同时执行)

并行架构

  • 位级(bit-level)并行:32位计算机比8位的快,32位计算机可以并行的处理4个字节。

  • 指令级(instruction-level)并行:CPU流水线、乱序执行、猜测执行等。

  • 数据级(data)并行:“单指令多数据”,SIMD,在大量数据上施加同一个操作。如图像处理上增加每一个像素的亮度。

  • 任务级(task-level)并行:多处理。

七个模型:

  • 线程与锁:线程与锁模型有很多众所周知的不足,但仍是其他模型技术的基础,也是很多并发软件开发的首选。

  • 函数式编程:函数式编程日渐重要的原因之一,是其对并发编程和并行编程模型提供了良好的支持。函数式编程消除了可变状态,所以从根本上是线程安全的的,而且一部并行执行。

  • Clojure之道——分离标志与状态:编程语言Clojure是一种指令式编程和函数编程的的混搭方案,在两种编程方式上取得了微妙的平衡来发挥两者的优势。

  • actor: actor 模型是一种实用性很广的并发编程模型,适用于共享内存模型和分布式内存模型,也适合解决地理分布型问题,能提供强大的容错性。

  • 通信顺序进程(Communicating Sequential Process, CSP):表面上看,CSP模型与actor模型很相似,两者都基于消息传递。不过CSP模型侧重于传递信息的通道,而actor模型侧重于通道两端的实体,使用CSP模型的代码会带有明显不同的风格。

  • 数据级并行:每个笔记本电脑里都藏着一台超级计算机 —— GPU。GPU利用数据级并行,不仅可以快速进行数据处理,也可以用于更广阔的领域。如果要进行有限元分析、流体力学计算或其他的大量数字计算,GPU的性能将是不二选择。

  • Lambda 架构:大数据是到达到了离不开并行,现在我们只需要增加计算资源,就能具有处理TB级数据的能力。Lambda架构综合了MapReduce和流式处理的特点,是一种可以处理多种大数据问题的架构。

第2章 线程与锁

  • 竞态条件和死锁

  • CPU的乱序执行:
    a) 编译器的静态优化可以打乱代码执行顺序;
    b) JVM的动态优化也会打乱代码的执行顺序;
    c) 硬件可以通过乱序执行来优化其性能。

  • 内存可见性:一个线程的修改对另外一个线程可能不可见。基本原则是,如果读线程和写线程不进行同步,就不能保证可见性。

哲学家进餐问题:
为每一支筷子设定编号,每次拿筷子时,先拿编号小的,再拿编号大的,这样,不管如何拿,总是有一个人能进餐,进餐结束后让另一个人拿到筷子进餐。