进程:是系统进行资源分配的基本单位,进程是线程的容器。打开unity的程序就是开始了一个进程,每个进程都有自己的独立内存空间,不同进程通过进程间通信来通信。由于进程比较重量,占据独立的内存,所以上下文进程间的切换开销(栈、寄存器、虚拟内存、文件句柄等)比较大。
进程一般由程序、数据集合和进程控制块三部分组成。程序用于描述进程要完成的功能,是控制进程执行的指令集;数据集合是程序在执行时所需要的数据和工作区;程序控制块(Program Control Block,简称PCB),包含进程的描述信息和控制信息,是进程存在的唯一标志。
线程: 是操作系统能够进行资源调度的最小单位(即CPU调度和分派的基本单位),是进程中实际运作的单位。一个进程可以有一个或多个线程,各个线程之间共享程序的内存空间。线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的公共资源。线程间通信主要通过共享内存,上下文切换很快,资源开销较少。
注意1:属于同一进程的多个线程之间的切换不会引起进程的切换,只有属于不同进程的线程之间的切换才会引起进程的切换。
注意2:CPU时间片是直接分配给线程的,线程拿到CPU时间片就能执行了,CPU时间片不是先分给进程然后再由进程分给进程下的线程的。所有的进程并行,线程并行都是看起来是并行,其实都是CPU片轮换使用。线程分到了CPU时间片,就可以认为这个线程所属的进程在运行,这样就看起来是进程并行。
协程: 具有多返回点的方法,把时间分片,协程也是运行在Unity主线程里的,是主线程的一部分,Unity只有主线程有些运算不希望放在同一帧里取运算,在同一帧里会卡顿,就可以用协程把他分散不同的帧里运算,这样就可以有一个流畅的体验。将协程代码中由yield return 语句分割的部分分配到每一帧执行。
返回值IEnumerator是一个迭代器,通过yield分割的代码片段存到容器里,通过movenext()方法分布执行
协程不是异步执行的,只是在生命周期中每帧执行(Update之后LateUpdate之前)。
进程和CPU的关系
-
调度: 操作系统通过调度程序将CPU时间分配给各个进程。调度程序决定哪个进程在什么时候使用CPU。
-
并发: 虽然在单核CPU上每次只能有一个进程运行,但通过快速的上下文切换,操作系统可以让多个进程看起来像是同时运行的。这种机制称为并发。
-
并行: 在多核CPU上,可以真正实现多个进程同时运行,每个核心可以同时执行一个进程,这称为并行。