协程的相关概念

为了理解协程,需要与线程和进程进行对比

进程

进程是操作系统级别的概念,操作系统分配资源的单位。
在 OS 中,操作系统分配内存,文件描述符以及硬件设备时,当进程通过相应的系统接口申请到资源后,会纳入到进程级别的空间中,进程中间所有的线程共享操作系统分配的所有资源。
不同进程之间的通信需要调用系统的接口,无论是单机上的多进程通信如管道,Unix Socket, 又或者跨机间的通信如 socket, RPC 等。

由于进程比较重量级,所以进程的切换开销比较大(栈,寄存器,文件句柄等资源)。

线程

线程在各个系统上实现的不同,可以将其理解为 CPU 执行的指令流,一个单线程的进程只有一个执行流。
在 Windows 上线程的实现如教科书一般的标准,有其入口函数,优先级等参数,但是 Linux 并无一般的线程概念,只有 task, 为了实现多线程,Linux 创建多个 task, 这些 task 之间通过系统接口实现内存共享和资源共享,从而表现得如同多线程。不知道现在还是不是这样,我看的书有一段历史了

线程的粒度较进程较小,线程切换的开销也比较小。

协程

进程和线程都有操作系统的参与创建,也就是线程和进程都属于系统内核态中的实体,他们之间的切换都要有内核的参与,因此其开销始终是比较大的。

协程又叫微线程,纤程,属于用户态的轻量级线程,其调度完全由用户控制。协程拥有自己的上下文和栈。协程间的切换不需要内核参与,切换速度非常快。

在目前各种语言中,golang 对协程的支持最为全面,因此常用与高并发相关的开发。