1、CPU、CPU内核:

CPU:是中央处理器的简称,是计算机的运算和控制中心、是信息处理、程序运行的最终执行单元。
CPU内核 是CPU内的核心芯片,内核是CPU的计算引擎,由单晶硅制成,用来完成所有的计算、接受/存储命令、处理数据等,是数字处理核心。核心(Die)又称为内核,是CPU最重要的组成部分。

2、单核CPU、多核CPU、多CPU:

单核CPU:就是系统只有一个CPU,内核只有一个。
多核CPU:就是系统只有一个CPU,但是有多个内核,就是在一个处理器内部集成了多个内核。
多CPU:就是系统上存在多个CPU,又称为多路CPU。
所谓的6核12线程,6核指的是物理核心,通过超线程技术,用一个物理核模拟两个虚拟核,每个核两个线程,总数为8线程。在操作系统看来是12个核,但实际上还是6个核。超线程技术可以实现单个物理核的线程级并行运算。但性能不如两个物理核。

3、并发、并行:

并发:是指系统具有处理多个任务的能力,大白话就是多个任务都在系统上运行,但是同一时刻只有一个任务在运行。系统会自己进行任务的快速轮换执行,看起来像是在同时运行。这个任务可以是进程,也可以是线程。
并行:是指系统具有同时运行多个任务的能力,大白话就是当系统有多个cpu(或多核CPU)时多个任务在此系统上可以同时运行。同一时刻可以有多个任务运行,前提是任务数要小等于CPU数,当大于CPU数时,程序表现为并发运行。

4、CPU密集型任务、IO密集型任务:

CPU密集型任务:又称计算密集型任务,要进行大量的计算,消耗CPU资源。如计算圆周率、加密解密、数据压缩&解压缩、音视频处理等。
此时需要大量的计算,如果是多核CPU,使用多任务并发(也可以并行),可以充分发挥CPU性能。但是当任务过多时,花在任务上下文切换上的时间也会增加,反而会降低CPU处理性能。
因此合理的设置任务数量很重要,一般而言同时进行的任务要小等于CPU核心数为佳。
因此在单核CPU下,CPU密集型任务使用并发不能提高效率,反而因为任务切换而降低效率,但是此时并发可以其他任务执行,避免系统由于只执行单一任务,导致用户无法使用系统。
由于主要消耗CPU资源,因此,代码运行效率至关重要。要选用性能好效率高的语言,如C、C++。Python这样的脚本语言运行效率很低,完全不适合计算密集型任务。

IO密集型任务:大量任务在网络IO、磁盘IO等读写操作上,由于CPU速度要快的多,此时CPU属于等待空闲状态。如Web应用、网络通信、读写数据库等。
对于IO密集型任务,对CPU消耗很小,因此任务越多,CPU效率越高,但也有一个限度。
对于IO密集型任务,适合选用开发效率高的语言 如Python。
无论在单核或多核CPU下,使用并发处理IO密集型任务,都是可以提高效率的,它可以在其他任务等待时,让系统处理其他任务,这样可以有效提高处理效率。也方便了人机交互。

5、进程:

进程(process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,也就是系统进行资源管理的最小单元,是操作系统结构的基础。
在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。
程序是指令、数据及其组织形式的描述,进程是程序的实体。
每一个进程都有它自己的地址空间,一般情况下,包括文本区域、数据区域和堆栈。
文本区域存储处理器执行的代码;数据区域存储变量和进程执行期间使用的动态分配的内存;堆栈区域存储着活动过程调用的指令和本地变量。

6、线程:

线程 (thread)有时被称为轻量级进程(Lightweight Process,LWP),是操作系统能够进行运算调度的最小单位,是程序执行流的最小单元。
一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。
多个线程相对独立,有自己的上下文,切换受系统控制
另外,线程是进程中的一个实体,是进程的执行单元,是被系统独立调度和分派的基本单位。
线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,每个线程都运行在同一进程的上下文中,它可与同属一个进程的其它线程共享进程所拥有的全部资源。

7、协程:

协程 (coroutine)与子例程(子例程是某个主程序的一部分代码,该代码执行特定的任务并且与主程序中的其他代码相对独立。子例程又被称为子程序、过程、方法、函数等。在主程序中可以调用子例程来执行。)一样,协程 是比线程更小的执行单元,可以认为是更加轻量级的线程。
正如一个进程可以拥有多个线程一样,一个线程也可以拥有多个协程。
协程不是进程或线程,其执行过程更类似于子例程,或者说不带返回值的函数调用。
一个程序可以包含多个协程,可以对比与一个进程包含多个线程,
因而下面我们来比较协程和线程。我们知道多个线程相对独立,有自己的上下文,切换受系统控制;
而协程也相对独立,有自己的上下文,但是其切换由自己控制,由当前协程切换到其他协程由当前协程来控制。

8、进程、线程、协程的关系:

粒度大小:进程 > 线程 > 协程
一个系统可以运行多个进程
一个进程内可以有多个线程
一个线程内可以有多个协程

系统创建好进程后,实际上就启动执行了该进程的执行主线程,主执行线程以函数地址形式,即程序入口函数比如说main()函数等,将程序的启动点提供给系统。主执行线程终止了,进程也就随之终止。
一个进程可由多个称为线程的执行单元组成,每个线程都运行在同一进程的上下文中,共享同样的代码和全局数据。每一个进程至少有一个主执行线程,它无需由用户去主动创建,是由系统自动创建的。
用户根据需要在应用程序中创建其它线程,多个线程并发地运行于同一个进程中。一个进程中的所有线程都在该进程的虚拟地址空间中,共同使用这些虚拟地址空间、全局变量和系统资源。

一般认为,操作系统可以并发执行多个进程/线程,当进程数 <= CPU核心数时 多进程是并行执行;当进程数 > CPU核心数时 多进程是并发执行。
线程并发执行:同一个进程里的多线程可以并发执行,不同进程里的多线程也可以并发执行,但多个线程并发都地运行于自己的进程中。注意每个进程只有一个线程的时,多进程 和 多线程是基本一样的。
线程是它存在于进程中,是程序的实际执行者。一个进程至少包含一个主线程,也可以有更多的子线程。主线程由系统自动创建,用户可以自行创建其他线程,
协程是一种程序组件,是比线程还小的执行单元,它存在于线程,比线程粒度更小 更灵活。
协程和线程的区别:线程的切换是系统控制的;协程的切换需要程序员调度,避免了无意义的调度,可以提高性能。但是协程也失去了标准线程使用多CPU的能力。但是在处理IO密集型时会提高效率。