知识卡片

协程不是线程

普通读书笔记卡 · 1480

内容

协程由 Go 运行时调度,线程由操作系统调度。协程创建和切换更轻,但最终仍要映射到线程运行;理解这层关系,才能解释阻塞、并行和调度延迟。

参考来源

- 位置:《Go语言底层原理剖析》第14章《协程初探》14.3节《线程与协程》 - 结论依据:原文明确"协程是用户态的。协程的管理依赖Go语言运行时的调度器",并从调度方式、切换速度(线程1~2微秒、协程约0.2微秒)、调度策略(协程协作式为主,Go 1.14后可抢占)、栈大小(线程2MB固定、协程2KB可扩容)四方面逐条对比协程与线程的差异,因此可以推出"协程由运行时调度、线程由操作系统调度,二者是不同层级的调度对象"的结论。 - 原始内容:协程是用户态的。协程的管理依赖Go语言运行时的调度器。同时,Go语言中的协程是从属于某一个线程的,协程与线程的对应关系为M:N……协程的速度要快于线程,其原因在于协程切换不用经过操作系统用户态与内核态的切换……线程切换的速度大约为1~2微秒,Go语言中协程切换的速度比它快数倍,为0.2微秒左右。