协程又称为微线程,是一种用户级的轻量级线程。协程拥有自己的寄存器上下文和栈。协程在调度切换的时候会保存寄存器上下文和栈,当该协程切换回来重新执行的时候将恢复原先保存的寄存器上下文和栈。

并发编程中,协程与线程类似,每一个协程表示一个执行单元,有自己的本地数据,与其他协程共享全局数据和其他资源。

协程需要由用户自己编写调度逻辑,因此对于cpu,协程是其实是单线程的,cpu没有调度、切换上下文的开销。

进程、线程和协程的异同点

进程、线程和协程都是程序执行的单位。

进程(Process)

进程是操作系统进行资源分配和调度的基本单位,是一个正在执行的程序的实例。

每个进程拥有独立的地址空间,进程间的信息交换需要通过进程间通信(IPC)机制。

进程拥有独立的资源集,如文件描述符、子进程、内存等。

由操作系统的调度器进行调度,进程间的切换开销较大。

进程是系统资源分配的最小单位,一个进程崩溃不会直接影响到其他进程。

线程(Thread)

线程是程序执行的最小单位,是操作系统能够进行运算调度的最小单位。

同一进程内的线程共享进程的地址空间和资源。

线程可以拥有自己的堆栈,但共享其他资源,如全局变量、文件等。

线程比进程更轻量,上下文切换的开销小。

线程可以提高程序的并发性,因为多个线程可以并行执行。

 

协程(Coroutine)

协程是一种程序组件,它允许挂起和恢复执行,主要用于非抢占式多任务处理。

协程通常在线程的上下文中执行,共享线程的地址空间和资源。

协程通常不拥有资源,它们共享创建它们的线程或进程的资源。

协程的调度是由程序控制的,而不是由操作系统控制,因此上下文切换的开销非常小。

协程适用于I/O密集型任务,可以简化异步编程模型。

异同点总结:

资源分配:进程拥有独立的资源,线程共享进程资源,协程通常不拥有资源。

调度:进程由操作系统调度,线程由操作系统或线程库调度,协程由程序自身调度。

开销:进程切换开销最大,线程次之,协程开销最小。

独立性:进程间独立性最强,线程次之,协程依赖于创建它的线程或进程。

适用场景:进程适用于重量级任务,线程适用于需要并发执行的程序,协程适用于I/O密集型和协作式多任务。