并发
在一个CPU上,创建多个任务,在很短的时间内,让CPU来回切换任务执行它们。让用户看起来这些任务像是在同时执行,但是对于计算机来说,这些任务实际上还是一个接一个地顺序执行的。
它强调一个CPU可以在同一时刻,接受很多个任务,但在执行的过程中还是一个一个任务地执行。
并行
在多个CPU上,创建多个任务,让每一个CPU都分到需要自己单独计算的任务。每个任务不被CPUs争抢,同时进行。用户看起来这些任务在同时进行,对于计算机而言,这些任务也是同时进行的。
它强调好多个CPU可以在同一时刻,分别处理自己手上的任务,但在执行的过程中这些任务是同时计算的。
进程
cpu在切换程序的时候,需要保存上一个程序的状态(就是我们常说的context上下文),不能直接从程序A切换到程序B。进程就是用来划分不同的程序运行时所需要的资源。
进程是一个程序运行时候的所需要的基本资源单位。
线程
cpu切换多个进程的时候,每个进程有不同的运行时所需要的资源,来回保存的过程中会花费不少的时间,进程一旦多起来,cpu调度会消耗一大堆资源。
线程本身几乎不占资源,同一个进程中的每个线程之间共享资源,对内核来说,无需来回保存不同进程的上下文,节省了切换上下文时的CPU资源。
对于同一个程序来说,如果需要并发计算,创建很多进程和创建了很多线程,后者可以节省切换上下文所需要使用的CPU资源。
协程
协程是轻量级的线程,它们实现的功能差不多。两者最大的差别是进行切换操作的对象不同,线程、进程由操作系统负责切换;协程由用户程序自己进行切换(即Go routine负责切换)。在协程之间的切换不需要涉及任何系统调用或任何阻塞调用。