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

✍个人博客:Pandaconda-CSDN博客

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

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

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

148. GMP 调度流程

在 GMP 调度模型下,Go 程序的执行流程可以简单地描述为以下几个步骤:

  1. 初始化:在程序启动时,运行时会初始化一个 G(Goroutine)调度器和一组 M(Machine)线程。调度器用于调度 Goroutine 的执行,M 线程用于执行 Goroutine。
  2. Goroutine 创建和调度:当程序启动时,会创建一个主 Goroutine,然后程序可以创建更多的 Goroutine。每个 Goroutine 都有一个 G 对象,其中包含了 Goroutine 的状态和执行栈。当一个 Goroutine 被创建时,它会被加入到一个本地队列中等待调度。
  3. M 的绑定:在 GMP 调度模型中,每个 M 线程都会绑定一个 P(Processor),P 负责调度 Goroutine 的执行。当一个 M 线程启动时,它会尝试获取一个 P 来绑定,如果当前没有可用的 P,它就会等待直到有一个可用的 P。
  4. P 的调度:P 会不断从全局队列和本地队列中获取 Goroutine 并将其调度到绑定的 M 线程上执行。如果一个 Goroutine 阻塞或者需要等待 I/O 操作时,P 会将其从 M 上回收,并将 M 设置为闲置状态。在此期间,P 会从全局队列和其他 M 的本地队列中获取更多的 Goroutine 并将其调度到闲置的 M 上执行。
  5. 阻塞和唤醒:当一个 Goroutine 阻塞或者需要等待 I/O 操作时,它会被回收并从本地队列中移除。当阻塞或等待结束时,它会重新加入到本地队列中等待调度。
  6. 关闭和退出:当程序结束时,所有的 Goroutine 都会被终止并回收。此外,程序也可以使用 channel 等机制来通知 Goroutine 退出并回收资源。
    总的来说,GMP 调度模型是 Go 语言运行时的核心机制,它通过多线程和协作调度等技术实现了高效的并发编程,支持多核 CPU 的并行执行。

149. Go 调度原理?

goroutine 调度的本质就是将 Goroutine (G)按照一定算法放到 CPU 上去执行。

CPU 感知不到 Goroutine,只知道内核线程,所以需要 Go 调度器将协程调度到内核线程上面去,然后操作系统调度器将内核线程放到 CPU 上去执行。

M 是对内核级线程的封装,所以 Go 调度器的工作就是将 G 分配到 M。

Go 调度器的实现不是一蹴而就的,它的调度模型与算法也是几经演化,从最初的 GM 模型、到 GMP 模型,从不支持抢占,到支持协作式抢占,再到支持基于信号的异步抢占,经历了不断地优化与打磨。

150. Go 调度器设计思想

  • 线程复用(work stealing 机制和 hand off 机制)
  • 利用并行(利用多核 CPU)
  • 抢占调度(解决公平性问题)
相关推荐
小码哥_常3 小时前
一套自己部署的 IM,客户端是同一份 Flutter
前端·后端
JIAOZHANZHISHIKU4 小时前
机器人外壳粘接性价比怎么选?3M VHB 胶带与结构胶解决方案
经验分享·机器人·工业胶粘剂·3m胶粘剂
紧跟先前的步伐6 小时前
Go AI Agent 实战 24|工具系统工程化收尾与阶段验收
人工智能·ai·golang·1024程序员节
学长毕设6 小时前
基于SpringBoot的实验室资产管理系统
java·spring boot·后端
C^h6 小时前
c++ string
开发语言·c++
sbjdhjd6 小时前
网工进阶笔记:H3CSE 园区网全栈技术与协议汇总
网络·笔记·云计算·ssh·网络工程·vlan·aaa
raindayinrain6 小时前
c++高性能--原子操作,无锁编程,操作顺序
开发语言·c++·性能优化
学逆向的6 小时前
C++ 合并命名空间
开发语言·c++·网络安全
Zhao-Jichao6 小时前
VS2026 打包 C++ 程序生成 EXE,借助 Installer Project 扩展工具
开发语言·c++
日日大王学编程7 小时前
#Feed 流项目复盘:Redis 时间线缓存与 Outbox 消息可靠性设计
golang·1024程序员节