并发和并行,同步和异步,这几个名词往往令人糊涂,它们也曾让我困惑好一段时间。在查阅了一些文章,并结合个人的思考和理解以后,我得出了以下结论:
任务的定义
无论是并发、并行也好,还是同步、异步也好,其实都离不开任务这个概念。然而,任务的概念却很难具体定义。一个任务对应一个cpu算术运算?一个函数?还是一串函数的执行?并且,一个任务往往是可再分的,所以很多时候一个任务的多个步骤又可以看作不同的任务,而具体如何定义,没有标准规则。所以并发与否取决于你如何界定一个任务。同时,由于任务定义的模糊性,同步和异步的界定并不清晰。
并行和并发
并发:在一个时间段内,有多个任务被处理。
并行:在任一时刻,有多个任务被处理。
上述的并行是一种绝对的并行,实际上即使是多核cpu也不能保证某几个任务在所有时刻都是被同时被执行的。然而我们仍然讨论并行,是因为我们忽略了主要任务之外的其它任务的执行。
并发不等于多线程
很多时候,我们都会把并发和多线程画上等号,但并发不一定是多线程的。最直观的例子就是单线程的分时操作系统,它是依靠在不同任务之间快速切换来达到并发处理的效果的。(JavaScript的执行模型也是单线程的,但它依靠异步来完成并发)
同步和异步
同步:多个任务之间是顺序执行的,并且前一任务完成之前,后一任务无法或者不能进行,也就是说&#