首先从CPU的角度来理解并发和并行:
对于单核的CPU,如果同时处理多个任务,必然需要依据调度原则进行分时处理,而在宏观上,对于使用者来说,这些
任务被这一个CPU同时(同一个时间段)完成了。这就是并发,concurrency。
对于多核CPU,多个任务可分别运行在各自的CPU核上,这些任务是物理上同时的(同时在被执行),这就是并行,
parallelism。
从软件的角度来看:
并发处理:
一个应用程序(进程)在一段时间内,处理多个任务的过程。
这里的处理多个任务,在物理形式上通常表现为通过多线程,分别处理多个任务。在单核处理器上,多线程是交替
执行的(例如根据时间片调度),在多核处理器上,线程被分配到不同的CPU核,从CPU核的角度来看,这些线程活动是
并行的,但是在某个CPU核上来看,它在执行的多个线程也是交替(分时)执行的。因为通常情况下,线程数远多于CPU
的核数,因此每个CPU核通常会分时运行多个线程。
并行处理:
最典型的并行处理是Fork/Join框架,将大的任务拆分成多个不相关的小任务,最后再汇总结果。
从软件的角度看,并行处理意味着多个任务同时在多个线程中运行。虽然这些线程在实际的CPU上,未必是独占CPU
核运行的(即,在物理层面上,这些线程也许是并发分时执行的,只不过软件层面不关心罢了)。
综上:
可以简单地把并发,理解成一个人同时做多种事情;并行则理解成多个人同时做一个事情(可拆分)。
对于单核的CPU,如果同时处理多个任务,必然需要依据调度原则进行分时处理,而在宏观上,对于使用者来说,这些
任务被这一个CPU同时(同一个时间段)完成了。这就是并发,concurrency。
对于多核CPU,多个任务可分别运行在各自的CPU核上,这些任务是物理上同时的(同时在被执行),这就是并行,
parallelism。
从软件的角度来看:
并发处理:
一个应用程序(进程)在一段时间内,处理多个任务的过程。
这里的处理多个任务,在物理形式上通常表现为通过多线程,分别处理多个任务。在单核处理器上,多线程是交替
执行的(例如根据时间片调度),在多核处理器上,线程被分配到不同的CPU核,从CPU核的角度来看,这些线程活动是
并行的,但是在某个CPU核上来看,它在执行的多个线程也是交替(分时)执行的。因为通常情况下,线程数远多于CPU
的核数,因此每个CPU核通常会分时运行多个线程。
并行处理:
最典型的并行处理是Fork/Join框架,将大的任务拆分成多个不相关的小任务,最后再汇总结果。
从软件的角度看,并行处理意味着多个任务同时在多个线程中运行。虽然这些线程在实际的CPU上,未必是独占CPU
核运行的(即,在物理层面上,这些线程也许是并发分时执行的,只不过软件层面不关心罢了)。
综上:
可以简单地把并发,理解成一个人同时做多种事情;并行则理解成多个人同时做一个事情(可拆分)。