GMP 调度时存在哪些阻塞操作?
GMP 调度时存在哪些阻塞操作?
提示
题眼: 背会即可。
GMP 中常见的阻塞场景主要包括:
- 系统调用阻塞,比如文件 I/O、网络 I/O。
- Channel 阻塞,比如读空通道、写满通道。
- 休眠阻塞,比如
time.Sleep。 - 同步原语阻塞,比如互斥锁、条件变量、等待组等。
- 主动让出执行权,比如调用
runtime.Gosched()。 - 垃圾回收相关暂停,比如短暂的 STW。
重要
参考答案:
GMP 里的阻塞大体可以分成两类。第一类是业务代码层面的阻塞,比如系统调用、网络 I/O、通道读写、锁竞争、Sleep 这些。第二类是运行时层面的阻塞,比如主动调用 Gosched 让出执行权,或者垃圾回收阶段发生短暂的 STW。
这些阻塞并不一定都会让整个程序停下来。Go 运行时会尽量通过 GMP 的解绑、重绑和调度机制,把影响控制在局部,让其他 goroutine 还能继续运行。
