进程
进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础
线程
- 线程有时也被叫做轻量级进程,是程序执行流的最小单元。一个标准的线程由线程ID、当前指令指针(PC)、寄存器集合和堆栈组成。
- 线程是进程中的一个实体,是被系统独立调度和分派的基本单位。线程自己不拥有系统资,只拥有一点在运行过程中必不可少的资源,但他可以与同属一个进程的其他线程共享进程所拥有的全部资源
- 线程拥有自己独立的栈和共享堆,共享堆但不共享栈。线程的切换一般也由操作系统完成。
- 线程具有五种状态:初始化、可运行、运行中、阻塞、销毁
协程
协程是一种比线程更加轻量级的一种函数。一个线程可以拥有多个协程。协程不是被操作系统内核所管理的,而是完全由程序所控制的,即在用户状态所执行。这样的好处是:性能大幅度提升,因为不会像切换线程那样消耗资源。
- 注:一个线程中的多个协程运行时是串行的。当一个协程运行时,其他协程一定是挂起的。
进程,线程,协程的对比
- 协程既不是进程也不是线程,协程仅是一个特殊的函数。协程,进程和线程不是一个维度的。
- 一个进程可以包含多个线程,一个线程可以包含多个协程。
- 协程与进程一样,也存在上下文切换问题。
- 进程的切换者是操作系统,切换时机是根据操作系统自己的策略进行的,用户是无感的。进程的切换内容包括页全局目录,切换内容被保存在内存中。进程切换过程采用的是“从用户态到内核态到用户态”的方式,切换效率低。
- 线程的切换者是操作系统,切换时机是根据系统自己的切换策略来执行的,用户是无感的。线程切换的内容包括内核栈和硬件上下文。线程切换内容被保存在内核栈中。线程切换过程采用的是“从用户态到内核态到用户态”的方式,切换效率中等。
- 协程的切换者是用户(编程者或应用程序),切换时机是用户自己的程序来决定的。协程的切换内容是硬件上下文,切换内容被保存在用户自己的变量(用户或堆栈中)。协程的切换过程只有用户态(即没有陷入内核态),因此切换效率高。