Go什么时候发生阻塞?阻塞时调度器会怎么做。

  • 用于原子、互斥量或通道操作导致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运行。
相关推荐
老华带你飞9 分钟前
旅游|基于Java旅游信息系统(源码+数据库+文档)
java·开发语言·数据库·vue.js·spring boot·旅游
真正的醒悟11 分钟前
202503-经验之道
服务器·网络·php
释怀°Believe13 分钟前
javaweb
数据库·sql·oracle
Clarence Liu15 分钟前
redis学习 (1) 基础入门
数据库·redis·学习
天生励志12331 分钟前
Redis 安装部署
数据库·redis·缓存
北半球的夜31 分钟前
emoji 表情符号保存问题
数据库·oracle
db_cy_206244 分钟前
Git对服务器配置文件进行版本控制
运维·服务器·git
qq_251616191 小时前
ubuntu nginx文件服务器
linux·服务器·网络
清风6666661 小时前
基于单片机的智能家居多参数环境监测与联动报警系统设计
数据库·单片机·毕业设计·智能家居·课程设计·期末大作业
晚风吹长发1 小时前
初步了解Linux中文件描述符-fd
linux·运维·服务器·c++·开发·文件