并发与并行:搬砖劈柴帮你轻松理解这两个概念
并发与并行:搬砖劈柴帮你轻松理解这两个概念
并发和并行是计算机科学中两个容易混淆的概念。本文通过一个简单的类比,帮助读者轻松理解这两个概念的区别。
批处理:顺序执行
假设现在有两个任务:搬砖和劈柴,完成每个任务都需要10分钟。
如果你选择一个人先搬砖,再劈柴,按照这样的顺序执行,这就是批处理的概念。也就是说,一个任务一个任务地执行。完成这两个任务需要20分钟。
并发:交替执行
然而,你还有另一种选择方式:先搬砖5分钟,再劈柴5分钟,这样交替执行。这种方式就是并发。完成这两个任务的时间还是20分钟!
如果你交替干活的速度足够快,宏观上看起来就像是这两个任务在同时执行,搬砖和劈柴同时干完。但从微观上看,它们还是在交替执行,因为做任务的始终只有你一个人。
类比到程序中,人就是CPU,搬砖和劈柴就是两个线程。CPU交替执行这两个线程,如果不考虑CPU切换的时间,那么在宏观上看起来就像这两个线程在同时执行。但从微观的角度来看,它们还是在交替执行。自始至终只有一个CPU在做事,所以完成两件事情的总时间20分钟是不会变的。
并行:同时执行
你一个人忙不过来,朋友A决定过来帮你。你负责搬砖,A负责劈柴,这样两个任务就同时进行,完成两个任务需要的时间只需要10分钟了。实实在在是两个人在做事。
类比到程序中,就是多核系统。你代表一个CPU,A代表一个CPU,两个CPU同时执行各自的线程,这样的方式就是并行。
并行与并发的区别
并行和并发,并不只是一个CPU和多个CPU的区别。实际情况下是很复杂的。
两个线程之间可能会存在互相依赖。假设现在搬砖和劈柴为了安全,是需要带上手套的,但是手套只有一副。没有办法做到真正的并行。尽管是两个人,但是手套只有一副,此时他们一人是并发的形式进行推进的。
在程序中,两个线程需要拿到锁才能继续执行,所以高性能的程序就要尽可能地避免锁。
只有在多核,且线程之间没有依赖的时候才是真正的并行。线程数量多余核数,就会出现并发和并行共存的情况。