【Golang 面试题】每日 3 题(四十三)

✍个人博客:Pandaconda-CSDN博客

📣专栏地址:http://t.csdnimg.cn/UWz06

📚专栏简介:在这个专栏中,我将会分享 Golang 面试中常见的面试题给大家~

❤️如果有收获的话,欢迎点赞👍收藏📁,您的支持就是我创作的最大动力💪

127. goroutine 状态怎么流转的?


128. goroutine 怎么运行的?

goroutine 本身只是一个数据结构,真正让 goroutine 运行起来的是调度器。Go 实现了一个用户态的调度器(GMP 模型),这个调度器充分利用现代计算机的多核特性,同时让多个 goroutine 运行,同时 goroutine 设计的很轻量级,调度和上下文切换的代价都比较小。

129. goroutine 的调用时机

  • 新起一个协程和协程执行完毕
  • 会阻塞的系统调用,比如文件 io、网络 io
  • channel、mutex 等阻塞操作
  • time.sleep
  • 垃圾回收之后
  • 主动调用 runtime.Gosched()
  • 运行过久或系统调用过久等等

每个 M 开始执行 P 的本地队列中的 G 时,goroutine 会被设置成 running 状态

如果某个 M 把本地队列中的 G 都执行完成之后,然后就会去全局队列中拿 G,这里需要注意,每次去全局队列拿 G 的时候,都需要上锁,避免同样的任务被多次拿。

如果全局队列都被拿完了,而当前 M 也没有更多的 G 可以执行的时候,它就会去其他 P 的本地队列中拿任务,这个机制被称之为 work stealing 机制,每次会拿走一半的任务,向下取整,比如另一个 P 中有 3 个任务,那一半就是一个任务。

当全局队列为空,M 也没办法从其他的 P 中拿任务的时候,就会让自身进入自旋状态,等待有新的 G 进来。最多只会有 GOMAXPROCS 个 M 在自旋状态,过多 M 的自旋会浪费 CPU 资源。

相关推荐
考虑考虑2 小时前
JDK26中的Map.ofLazy
java·后端·java ee
云浪4 小时前
Go 并发实战:从零实现一个高并发安全的任务调度器
javascript·后端·go
苏三的开发日记4 小时前
Docker 启动顺序优化(CentOS / Ubuntu)
后端
敲代码的玉米C4 小时前
并排 diff、提交标签:砚的 Git 阅读体验又补了一轮
go
敲代码的玉米C4 小时前
给编辑器补拖拽:标签挪过去,状态也得跟过去
go
敲代码的玉米C4 小时前
写到这里,砚还要继续照着 IDE 加功能吗
go
敲代码的玉米C5 小时前
把终端拖进编辑区,别把正在跑的 shell 弄丢了
go
敲代码的玉米C5 小时前
给砚加一个「所有改动」页,提交前少来回点几次
go
cao23335 小时前
关于 y0 y1 yn 变量名冲突说法的指正
笔记
高频因子挖掘机6 小时前
同一交易日出现重复 K 线:去重前先确认时间、来源和粒度
后端·github·api