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

相关推荐
Aric_Jones29 分钟前
lua入门语法,包含安装,注释,变量,循环等
java·开发语言·git·elasticsearch·junit·lua
Akiiiira29 分钟前
【日撸 Java 三百行】Day 12(顺序表(二))
java·开发语言
EndingCoder38 分钟前
2025年JavaScript性能优化全攻略
开发语言·javascript·性能优化
码上淘金5 小时前
【Python】Python常用控制结构详解:条件判断、遍历与循环控制
开发语言·python
Brilliant Nemo5 小时前
四、SpringMVC实战:构建高效表述层框架
开发语言·python
懵逼的小黑子6 小时前
Django 项目的 models 目录中,__init__.py 文件的作用
后端·python·django
格林威7 小时前
Baumer工业相机堡盟工业相机的工业视觉中为什么偏爱“黑白相机”
开发语言·c++·人工智能·数码相机·计算机视觉
song_ly0017 小时前
深入理解软件测试覆盖率:从概念到实践
笔记·学习·测试
小林学习编程7 小时前
SpringBoot校园失物招领信息平台
java·spring boot·后端
橙子199110167 小时前
在 Kotlin 中什么是委托属性,简要说说其使用场景和原理
android·开发语言·kotlin