Pixiv - KiraraShss
GMP调度模型
436 字
2 分钟
GMP调度模型
GMP简介
GMP是Go(1.1之后)运行时为了实现高并发、高性能而设计的一套核心调度模型。分别的含义如下:
- G(goroutine):也就是go中的协程,利用
go func()来实现。 - M(machine):操作系统的内核级线程。
- P(processor):逻辑处理器。
这套模型的核心目标,是将用户态的轻量级协程(G)高效地映射到操作系统地内核线程(M)上执行,同时通过引入逻辑处理器(P)来解决多核环境下的资源竞争和负载均衡问题。
G
G就是Goroutine,它是Go并发的基本单元,本质是一个轻量级的协程。
特点
- 初始栈很小,只有2KB,创建的成本极低并且可以根据需要动态伸缩。所以一个Go程序可以轻松运行百万个Goroutine。
- 切换成本极低(微秒级)。
- 状态:
- 就绪(Runnable)
- 运行(Running)
- 等待(Waiting,如I/O阻塞)
M
P
GMP调度流程
Note
整个调度过程可以概括为M找P,P给G。
- 创建G:当使用go func()启动一个协程时,新的G会优先被放入当前P的本地队列中。如果本地队列满了,才会放入全局队列。
- M绑定P:操作系统线程M启动后,会尝试获取一个空闲的P。只有拿到P,M才能开始工作。
- 执行循环:
- M绑定P后,会从P的本地队列中取出G来执行。这是最高效的路径,因为减少了锁竞争。
- 如果本地队列空了,会尝试从全局队列中获取G,或者通过网络轮询器检查是否有就绪的网络IO事件。
内容
支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!
相关文章 智能推荐
1
Firefly 代码块示例
文章示例 在Firefly中使用表达性代码的代码块在 Markdown 中的外观。
2
Firefly 布局系统详解
博客指南 深入了解 Firefly 的布局系统,包括侧边栏布局(左侧/双侧)和文章列表布局(列表/网格),以及自适应网格列数。
3
Firefly 一款清新美观的 Astro 博客主题模板
文章示例 Firefly 是一款基于 Astro 框架和 Fuwari 模板开发的清新美观且现代化个人博客主题模板,专为技术爱好者和内容创作者设计。该主题融合了现代 Web 技术栈,提供了丰富的功能模块和高度可定制的界面,让您能够轻松打造出专业且美观的个人博客网站。
4
Firefly 简单使用指南
博客指南 如何使用 Firefly 博客模板。
5
KaTeX 数学公式示例
文章示例 展示 Firefly 主题对 KaTeX 数学公式的支持,包括行内公式、块级公式和复杂数学符号。
随机文章 随机推荐