常见并发模型介绍
一, 线程与锁并发模型
线程和锁模型其实是对底层硬件运行过程的形式化。
线程与锁模型的优缺点
- 线程与锁模型的优点:适用面很广,一种对硬件工作方式的形式化,正确使用,效率很高。这个模型可以集成到大多数编程语言中。
- 线程与锁模型的缺点:线程与锁模型并没有为并行提供直接的支持(虽然可以通过改造成并发的模式,但同时引入了不确定的隐患)。只支持共享内存模型,如果要支持分布式内存模型,需要寻求其他帮助。
- 不易察觉的错误,如内存可见性,更糟糕的是我们可能会写一个包含多线程bug的程序,而且不会被测出来。假如一种可能被乱序执行的方式访问内存,并不意味这乱序执行真的发生。
- 可维护性差
二、actor模型
Actor模型是一种适用性非常好的通用并发编程模型。它可以应用于共享内存架构和分布式内存架构,适合解决分布型的问题。同时还提供很好的容错性。
Actor模型的优缺点
- actor模型的优点:适用于解决多种并发问题,actor可以同时运行,但不共享状态,关于并发,只需要多个actor之间的消息流即可,便于调试;天生的容错性,“let it crash”让代码更加简洁;分布式编程,可以解决任何规模的问题,地理分布式问题。
- actor模型的缺点:虽然比线程与锁模型更容易debug,但也会碰到actor模型独有的问题(eg:邮箱溢出);由于actor模型不共享状态,仅通过消息传递来进行交流,所以不太适合实施细粒度的并行。
大部分流行的语言都提供了一个actor库,特别是Akka库为java和其他运行在JVM的语言提供了对actor模型的支持。
三、函数式编程
它不适用可变状态,从而避免了线程与锁模型的许多缺陷。
函数式模型的优缺点
- 使用函数式编程的最大好处是我们可以确信程序是按照我们预想方式运行,比起命令式程序,函数式更加简单,更容易推理,便于测试。由于函数式大麦不使用可变状态,大部分存在线程和锁模型中的bug将销声匿迹。
- 缺点:很多人认为函数式代码比起等价的命令式代码效率较低。对于某些场景确实存在性能损失,大部分场景的性能损失时远低于预期的。而且用少许性能损失换取程序健壮性和拓展性的提升是值得的。
四、通讯顺序进程(CSP)
类似于Actor模型,但区别是:actor模型的重点在于参与交流的实体,而CSP模型的重点在于用于交流的通道。
与actor模型相比,CSP模型的最大优点是灵活性。使用actor模型时,负责通讯的媒介与执行单元是紧耦合的--每个actor都有一个信箱。而使用CSP模型,channel是第一对象,可以被独立地创建,写入和读出数据。
ClojureScript.
五、数据并行
数据并行是一种专用的编程模型,是一种并行编程技术,而不是并发编程技术。非常适用于处理大量数值数据,科学计算,仿真,神经网路等。 eg: OpenCL和OpenGL编程,GPU上运行。