- 用于原子、互斥量或通道操作导致goroutine阻塞,调度器将把当前阻塞的goroutine从本地运行队列LRQ换 出,并重新调度其它goroutine;
- 由于网络请求和IO导致的阻塞, Go提供了网络轮询器(Netpoller)来处理,后台用epoll等技术实现IO多路复用。
- channel阻塞:当goroutine读写channel发生阻塞时,会调用gopark函数,该G脱离当前的M和P,调度器将 新的G放入当前M。
- 系统调用:当某个G由于系统调用陷入内核态,该P就会脱离当前M,此时P会更新自己的状态为Psyscall, M 与G相互绑定,进行系统调用。结束以后,若该P状态还是Psyscall,则直接关联该M和G,否则使用闲置的处 理器处理该G。
- 系统监控:当某个G在P上运行的时间超过10ms时候,或者P处于Psyscall状态过长等情况就会调用retake函 数,触发新的调度。
- 主动让出:由于是协作式调度,该G会主动让出当前的P (通过GoSched),更新状态为Grunnable,该P会 调度队列中的G运行。
Go什么时候发生阻塞?阻塞时调度器会怎么做。
JH30732024-03-05 22:14
相关推荐
福建佰胜张工9 小时前
SMC 薄型气爪 MHF2-16D1 深度解析:平行开闭、低剖面结构在自动化装配中的选型与落地念何架构之路9 小时前
go-grpc设计思想catoop9 小时前
API Key 设计与安全生成方案:结构拆解、数据库设计与 Java 实现Web极客码9 小时前
我用 Claude 分析 Redis 哨兵日志,实现跨机房数据不一致自动对齐库库的数据库笔记9 小时前
国产信创数据库的MySQL兼容性深度对比解析microrain10 小时前
SagooIoT 的缓存换后端只改一行配置,文件后端连 Redis 都不需要xuefeiniao10 小时前
PHP2Shell漏洞修复姚远Oracle ACE10 小时前
为什么无法连接到 PostgreSQL?ss27310 小时前
AI时代首先数据库-PostgreSQL实战笔记 | 22 PostgreSQL实例与集群