跳至主要內容

线程和协程

Mr.Lexon大约 2 分钟networking

线程和协程

什么是线程

线程是操作操作系统能够进行运算调度的最小单位。线程被包含在进程之中,是进程中的实际运作单位,一个进程内可以包含多个线程,线程是资源调度的最小单位。

什么是协程

因为Web服务和网路服务本身是 IO 密集型服务,处理的任务大多是和网络连接或读写相关的高耗时任务,因为IO本身是异步服务,所以在高并发场景下,大量 IO 等待会导致多线程被频繁挂起和切换,非常消耗系统资源,同时多线程访问共享资源存在竞争问题。如果将其升级为多进程,就会存在频繁调度切换问题以及每个进程资源不共享问题。所以在线程的基础上进一步切分,协程就诞生了,一个线程也可以拥有多个协程,因此协程又称微线程和纤程。

对比开销

线程是被内核所调度,线程被调度切换到另一个线程上下文的时候,需要保存一个用户线程的状态到内存,恢复另一个线程状态到寄存器,然后更新调度器的数据结构,这几步操作设计用户态到内核态转换,开销比较多。 协程的调度完全由用户控制,协程拥有自己的寄存器上下文和栈,协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈,直接操作用户空间栈,完全没有内核切换的开销。

使用场景

个人理解,在实践中,需要常驻服务的应用需要线程作为载体,以保证服务的可靠性以及服务的稳定性,在需要高频次读写以及高频次访问或请求的业务场景则使用协程。

上次编辑于:
贡献者: Lexon