并发与并行,进程与线程的解析
无论是那种语言,在编程中都会遇到并发,并行问题,进而牵扯到线程,进程。之前一直有所疑惑,现在进行一些梳理。
并发,并行的一个比喻
知乎上看到一个形象的比喻
你吃饭吃到一半,电话来了,你一直到吃完了以后才去接,这就说明你不支持并发也不支持并行。
你吃饭吃到一半,电话来了,你停了下来接了电话,接完后继续吃饭,这说明你支持并发。
你吃饭吃到一半,电话来了,你一边打电话一边吃饭,这说明你支持并行。
可以从这个例子看出,并发,并行的根本区别,是同时
线程,进程
进程就好比工厂的车间,它代表CPU所能处理的单个任务。任一时刻,CPU总是运行一个进程,其他进程处于非运行状态。
一个车间里,可以有很多工人。他们协同完成一个任务。线程就好比车间里的工人。一个进程可以包括多个线程。
CPU同时刻只能执行一个进程,多核CPU当然就可以同时刻执行多个进程
Java中的并发与并行
如上并行的关键在于同时,比如机器,我们知道是有多核CPU的,但是比如JVM启动后是占用一个进程的,而线程是共享的进程资源,那么多核CPU就浪费了?并不是。
在windows和linux里,Java线程与操作系统的线程映射关系是这样的一对一。所以说线程可以利用多核CPU。