七周七并发模型 第一章笔记

date
Jul 6, 2022
slug
七周七并发模型 第一章笔记
status
Published
tags
读书笔记
summary
七周七并发模型 第一章笔记
type
Post

第一章 概述

并发和并行
并发是问题域中的概念——程序需要被设计成能够同时(或者几乎同时)发生的事件。
并行则是方法域中的概念——通过将问题中的多个部分并行执行,来加速解决问题。
并发是同一时间应对(dealing with)多件事情的能力
并行是同一时间动手做(doing)多件事情的能力
并行和并发经常被混淆的原因之一是,传统的“线程与锁”模型并没有显式支持并行。如果要用线程与锁模型为多核进行开发,唯一的选择是写一个并发的程序,并行的运行在多核上。
并发程序的执行通常是不确定的,会随着事件时序的改变而给出不同的结果。对于真正的并发程序,不确定性是其固有属性。
并行程序可能是确定的。
并行架构
人们通常认为并行等同于多核,但现代计算机在不同的层次上都使用了并行技术。单核运行速度仍能每年不断提升的原因是:单核包含的晶体管数量越来越多,而单核在位级和指令级两个层次上都能并行使用这些集体管资源
  • 位级并行:同样位数的加法运算,计算机的位数越高,所需要的计算次数也越少
  • 指令级并行:CPU的并行技术(流水线、乱序执行和猜测执行)。现在面临的问题是,无论是表面上还是实质上,指令都不再串行执行了
  • 数据级并行:也称“单指令多数据”,SIMD架构,可以并行的在大量数据上施加同一操作。只在适合的场景可以大展身手,比如现代GPU在图像处理方面
  • 任务级并行:即多处理器架构,它最明显的分类特征是其内存模型(共享内存模型或者分布式内存模型)
    • 共享内存:每个处理器都能访问整个内存,处理器之间的通信主要通过内存进行
    • 分布式内存:每个处理器都有自己的内存,处理器之间的通信主要通过网络进行
    • 共享内存比分布式内存更简单快速容易,但随着处理器个数逐渐增多,共享内存就会遭遇性能瓶颈(是系统总线带宽的问题吗?),就不得不转向分布式内存。如果要开发一个容错系统,就要考虑到硬件故障的影响,此时也必须借助分布式内存
为了增强软件的容错性,并发代码的关键是独立性和故障检测。独立性是指一个故障不会影响到故障任务以外的其他任务。故障检测是指当一个任务失败时,需要通知负责故障处理的其他任务来处理
我们不需要创建一个复杂的线程来处理问题中的多个任务,只需要用多个简单的线程处理不同的任务即可
七个模型
  • 线程与锁:其他模型的技术基础,也是很多并发软件开发的首选
  • 函数式编程:消除的可变状态,所以从根本上是线程安全,而且易于并发执行
  • Clojure之道:分离标识与状态
  • actor:适用性很广,适用于共享内存模型和分布式内存模型,也适合解决地理分布型问题,能提供强大的容错性
  • 通信顺序进程(Communicating Sequential Process, CSP)。表面上看,CSP模型和actor模型很相似,都基于消息传递。但CSP模型侧重于传递信息的通道,而actor模型侧重于通道两端的实体。
  • 数据级并行:GPU
  • Lambda架构:综合了MapReduce和流式处理的特点,是一种可以处理多种大数据问题的架构
 

© 李工 2021 - 2025