参考答案
结论:Go采用GMP调度模型,协程(G)在用户态切换,线程(M)上下文切换发生在内核态。一定会发生线程上下文切换的场景:1) 协程执行阻塞式系统调用(如文件读写、阻塞socket、time.Sleep进入内核),M陷入内核导致线程切换;2) 系统调用返回后P与M解绑,若需其他M运行则触发线程调度;3) 当M被操作系统抢占(如调度超时)或主动让出CPU进入内核。原理:仅用户态协程切换无线程切换,但凡进入内核态syscall必伴随线程上下文保存恢复。非阻塞网络IO通过netpoll避免切换。