【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)
  • 抢占调度(解决公平性问题)
相关推荐
感谢地心引力4 分钟前
【Matlab】最新版2025a发布,深色模式、Copilot编程助手上线!
开发语言·windows·matlab·copilot
天宫风子10 分钟前
抽象代数小述(二之前)
经验分享·笔记·算法·生活·抽象代数
岑梓铭19 分钟前
考研408《计算机组成原理》复习笔记,第二章(2)数值数据的表示(浮点数篇)
笔记·考研·408·计算机组成原理
Java程序员-小白34 分钟前
使用java -jar命令指定VM参数-D运行jar包报错问题
java·开发语言·jar
霖001 小时前
PCIe数据采集系统
数据结构·经验分享·单片机·嵌入式硬件·fpga开发·信号处理
ClearViper31 小时前
Java的多线程笔记
java·开发语言·笔记
敷啊敷衍1 小时前
深入探索 C++ 中的 string 类:从基础到实践
开发语言·数据结构·c++
学地理的小胖砸2 小时前
【Python 面向对象】
开发语言·python
神经毒素2 小时前
WEB安全--Java安全--LazyMap_CC1利用链
java·开发语言·网络·安全·web安全
酷炫码神2 小时前
C#语法基础
开发语言·c#