前言
软件的运行依赖硬件基础设施。编程技术也因为硬件的不断发展而更新。通过了解计算机硬件发展,可以知道一些编程语言的设计目标发展方向。
过去半个世纪中,摩尔定律 一直指导半导体与科技产业的发展。英特尔一直遵循摩尔定律,一般每隔两年左右就会发布新成果。不过现在有一些专家指出 计算机已经达到摩尔定律的物理极限。
科技的不断进步,晶体管制作不断缩小,但任何物质都有物理极限。当单个物体接近物理极限时,一般会选择了多个并行运算,从而达到提升效率的目的。
摩尔定律:摩尔定律是由 1965 年英特尔联合创始人戈登•摩尔,他指出在微芯片上的晶体管数量大约每两年翻一番,且晶片运算性能也将随之增倍。
并发与并行
并发 并行 经常被用来描述程序,编程。比如某系统具有并发性,某编程语言可以支持并行计算等等。它们属于系统的属性。
A system is said to be concurrent if it can support two or more actions in progress at the same time. A system is said to be parallel if it can support two or more actions executing simultaneously.
The Art of Concurrency
借用 并发艺术 定义:“ 如果一个系统能够同时支持两个或多个进行中操作,则称该系统具有并发性。如果系统可以支持同时执行的两个或多个操作,则称该系统为并行系统。”
例如现代操作系统,都可以同时支持多个应用同时 进行中 ,说明它具有并发性。而要实现多个操作 同时执行,需要多核 CPU 的硬件支持。
不同硬件环境下系统系统并发的实现有所不同。
单核单 CPU,系统通过任务切换来支持执行多个任务。
多个 CPU 可以实现 并行 操作,让任务在 同一物理时刻 下执行。
简单来理解,可以将 并行 看成是实现 系统并发 的方式之一。
并行计算
不管是多核编程,分布式编程,微服务其实都在阐述一个东西,那就是 并行计算 。并行计算是通过增加 处理元素,从而到达缩短运行时间,提升运行效率的作用。比如通过增加 CPU 内核来增强计算能力。分布式里面通过增加服务器来提升吞吐量等等。
并行计算效率有对应的指导理论 阿姆达尔定律。
阿姆达尔定律:阿姆达尔定律通常用于并行计算中以预测使用多个处理器时的理论速度。
例如,如果一个程序使用单个线程需要 20 个小时才能完成。现在并行处理,但是该程序其中一个小时部分无法并行化,那么仅剩下的 19 个小时(p = 0.95)的执行时间可以并行化,无论添加多少线程用于该程序的并行执行,最短执行时间不会低于一小时。因此,理论上的并行加速最高为单线程性能的 20 倍。
并发模型
我们首先需要知道的内存共享。
内存共享 是计算机中让进程互相传递数据有效的方式。注意在异步并发访问时存在 争用问题 ,可使用 锁,信号量 和监视器 之类的机制来避免这个问题。
并发模型设计中,要区分组件与线程设计基于 共享状态 还是 独立状态。状态通常是一些数据,和对象。状态共享可能会出现争用问题。
独立状态下,不会出现并发争用问题,它们通过交换不可变对象和互相发送对象(或数据)的副本来进行通信。
并行工人模型
这种模型比较容易理解,Boss 接受请求分发给工人处理,工人处理整个请求。java.util.concurrent 很多设计都是基于此模型设计。
此模型优点,操作相对简单,只需要根据业务实际的情况增减 worker 即可。例如一个爬虫应用中,设定不同数量的 worker 数量,观察那种情况下用时最短,以确定最优 worker 数量。
模型缺点,共享状态下问题会变得复杂,我们要去考虑线程的争用,死锁等问题。另外,它在处理任务执行时顺序不固定,有执行顺序要求的场景下,并不适合。
流水线模型
流水线模型,顾名思义,这种模型处理任务就像流水线工人分段加工。这种模型无共享状态。
这种模型的系统通常设计为使用非阻塞 IO。例如从网络读取文件处理,文件下载不会等待,完成之后交由下一个任务处理。
这种并发模型的系统也称响应式系统(Reactive)或事件驱动系统。Vertx 其就是这种模型的最佳例子。
https://vertx.io
Actors 模型
在 Actor 模型中,每个工人都称为Actor。Actor 可以直接彼此发送消息。消息是异步发送和处理的。
该模型的一些优点,没有共享状态。