【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 资源。

相关推荐
三品吉他手会点灯1 分钟前
STM32F103 学习笔记-24-I2C-读写EEPROM(第4节)-STM32的I2C通讯过程
笔记·stm32·学习
多彩电脑5 分钟前
向AIDE(安卓设备上的Android Studio)导入aar库
android·java·开发语言·androidx
Qres8216 分钟前
nodejs安装记录
后端·nodejs
江屿风15 分钟前
C++图论基础单源最短路-常规版dijkstra算法/堆优化版dijkstra算法/bellman-ford 算法/spfa 算法流食般投喂
开发语言·c++·笔记·算法·图论
摇滚侠17 分钟前
MyBatis 入门到项目实战 MyBatis 逆向工程 62
java·开发语言·mybatis
颖火虫盟主18 分钟前
Linux USB 探测→枚举→RNDIS 驱动匹配 全流程笔记
linux·运维·笔记
IT_陈寒19 分钟前
Vue的响应式让我原地裂开,你们也有这情况吗
前端·人工智能·后端
ch.ju21 分钟前
Java Programming Chapter 4——Multi-level inheritance
java·开发语言
长葡萄的叶子22 分钟前
Transformer:让机器读懂上下文的艺术
笔记·transformer
相醉为友23 分钟前
Trae IDE WSL2/SSH 环境网络故障排查笔记
ide·笔记·ssh