【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)
  • 抢占调度(解决公平性问题)
相关推荐
程序员爱钓鱼几秒前
GoHTML解析利器:github.com/PuerkitoBio/goquery实战指南
后端·google·go
golang学习记12 分钟前
从“大泥球“到模块化单体:Spring Modulith + IntelliJ IDEA 拯救你的代码
后端·intellij idea
颜酱18 分钟前
一步步实现字符串计算器:从「转整数」到「带括号与优化」
javascript·后端·算法
离开地球表面_9923 分钟前
金三银四程序员跳槽指南:从简历到面试再到 Offer 的全流程准备
前端·后端·面试
UrbanJazzerati23 分钟前
Scrapling入门指南:零基础也能学会的网页抓取神器
后端·面试
张洪权24 分钟前
mysql + nest.js 加锁 搞并发问题
后端
比尔盖茨的大脑25 分钟前
事件循环底层原理:从 V8 引擎到浏览器实现
前端·javascript·面试
郡杰25 分钟前
MyBatisPlus
后端
beata27 分钟前
Java基础-18:Java开发中的常用设计模式:深入解析与实战应用
java·后端
Qlly32 分钟前
DDD 架构为什么适合 MCP Server 开发?
人工智能·后端·架构