【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)
  • 抢占调度(解决公平性问题)
相关推荐
纨妙10 分钟前
python打卡day59
开发语言·python
neoooo13 分钟前
别慌,Java只有值传递——一次搞懂“为啥我改了它还不变”!
java·后端·spring
wuxuanok16 分钟前
Web后端开发-请求响应
java·开发语言·笔记·学习
用户77853718369617 分钟前
一力破万法:从0实现一个http代理池
后端·爬虫
Sally璐璐36 分钟前
IPSAN 共享存储详解:架构、优化与落地实践指南
开发语言·php
拖孩44 分钟前
微信群太多,管理麻烦?那试试接入AI助手吧~
前端·后端·微信
像风一样的男人@1 小时前
python --货车装厢问题
开发语言·python
Humbunklung1 小时前
Rust枚举:让数据类型告别单调乏味
开发语言·后端·rust
诗句藏于尽头1 小时前
内网使用rustdesk搭建远程桌面详细版
笔记
蜡笔小电芯1 小时前
【C语言】指针与回调机制学习笔记
c语言·笔记·学习