之前写java锁的时候有说等我看完了阿里的《码出高效》-并发与多线程就来更新,最近忙的没顾上的我大半夜来更新啦(纯记录,内容全部来阿里《码出高效》,不用于盈利,侵删)。
并发与并行
并发是指在某个时间段内,多任务交替处理的能力。所谓不患寡而患不均,每个CPU不可能只顾着执行某个进程,让其他线程一直处于等待状态。所以,CPU把可执行的时间均匀地分成若干份,每个进程执行一段时间后,记录当前的工作状态,释放相关的执行资源并进入等待状态,让其他进程抢占CPU资源。并行是指同时处理多任务的能力,目前,CPU已经发展为多核,可以同时执行多个互不依赖的指令及执行块。并发与并行两个概念非常容易混淆,他们的核心区别在于进程是否同时执行。以KTV唱歌为例,并行指的是有多少人可以使用话筒同时唱歌,并发指的是同一个话筒被多个人轮流使用。
并发与并行的目标都是尽可能地执行完所有任务。以一声坐诊为例,某个科室有两个专家同时出诊,这就是两个并行任务;其中一个医生,时而问诊,时而查看化验单,然后继续问诊,突然又中断去处理病人的咨询,这就是并发。在并发环境下,由于程序的封闭性被打破,出现了一下特点:
并发程序之间有相互制约的关系。直接制约提现为一个程序需要另一个程序的计算结果;间接制约体现为多个程序竞争共享资源,如处理器、缓冲区等。
并发程序的执行过程是断断续续的。程序需要记忆现场指令及执行点。
当并发数设置合理并且CPU拥有足够的处理能力时,并发会提高程序的运行效率。