Dra-M Dra-M
首页
技术
冥思
哲学
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

莫小龙

保持理智,相信未来。
首页
技术
冥思
哲学
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • Java

  • Golang

    • GitLab私服+Go Modules踩坑经验(SSH自定义端口)
    • 【代码片段】我使用的Gin中间处理器(自定义异常处理、日志打印、traceId、跨域配置)
    • 【Java转Go】如何理解Go中的值类型、引用类型、nil
    • 【Java转Go】如何理解面向对象,怎么把Golang用成面向对象的样子
    • Golang 调度器 GMP 原理与调度全分析
    • Go中GMP有哪些状态?
    • 一文搞懂go gc垃圾回收原理
    • Go什么时候发生阻塞?阻塞时,调度器会怎么做?
    • Go netpoller 原生网络模型之源码全面揭秘
    • Goroutine 泄露 - 被遗忘的发送者
    • go map 设计与实现
    • go slice 设计与实现
    • 小白也能看懂的context包详解:从入门到精通
    • go interface 设计与实现
    • 深入理解 go chan
    • go chan 设计与实现
    • 深入理解 go Mutex
    • 深入理解 go sync.Map - 基本原理
    • go sync.Map 设计与实现
    • 深入理解 go sync.Once
    • 深入理解 go reflect - 反射基本原理
    • 深入理解 go reflect - 要不要传指针
  • 编程思想

  • 微服务

  • 中间件

  • Python

  • 运维

  • 技术
  • Golang
迹寒编程
2023-06-05

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运行。

#Golang#GMP
上次更新: 10/23/2024
一文搞懂go gc垃圾回收原理
Go netpoller 原生网络模型之源码全面揭秘

← 一文搞懂go gc垃圾回收原理 Go netpoller 原生网络模型之源码全面揭秘→

最近更新
01
mosquito配置ws协议
10-23
02
Pip包的离线下载和安装
10-23
03
stable diffusion 相关收藏
02-24
更多文章>
Theme by Vdoing | Copyright © 2019-2024 Dra-M
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式