golang协程的调度原理

2023-03-29 23:32:1802:29 65
所属专辑:编程那些事儿
声音简介

Golang 的协程调度器采用了 M:N 的线程模型,即将 M 个 Goroutine 分配到 N 个系统线程上运行,从而实现了高并发和高效率的目标。在 Golang 中,Goroutine 是一种轻量级的线程,它只需要极少的内存,就可以启动成千上万个 Goroutine,而且切换 Goroutine 的开销非常小,因此可以实现高并发的应用程序。


Golang 的协程调度器主要由以下几个部分组成:


调度器: Golang 的调度器负责将 Goroutine 分配到系统线程上,并在系统线程之间进行调度,以实现高效的协程切换。

系统线程: Golang 的系统线程是由操作系统提供的,每个系统线程都可以运行多个 Goroutine,通过调度器的协作,实现高效的协程调度。

Goroutine: Golang 的 Goroutine 是轻量级的协程,它可以被分配到系统线程上运行,并可以在任意时刻进行切换。

Golang 的协程调度器使用了一个称为 G-P-M 模型的实现,其中:


G: Goroutine 的缩写,代表一个 Goroutine,保存 Goroutine 的执行状态,包括程序计数器、栈指针等信息。

P: Processor 的缩写,代表一个逻辑处理器,负责管理一组 Goroutine 队列和调度器状态,每个逻辑处理器对应一个系统线程。

M: Machine 的缩写,代表一个系统线程,负责执行 Goroutine,M 和 P 之间是一对一的关系。

当一个 Goroutine 启动时,它会被分配到一个逻辑处理器 P 上运行,如果这个 Goroutine 在运行时发生了阻塞,那么它会被从逻辑处理器 P 上移除,并且逻辑处理器 P 会去寻找其他可以运行的 Goroutine 来填补空缺。如果所有的 Goroutine 都在阻塞状态下,那么逻辑处理器 P 就会被阻塞,直到有新的 Goroutine 可以运行。这种方式可以有效地避免 Goroutine 的饥饿现象,保证每个 Goroutine 都能得到充分的调度。


总的来说,Golang 的协程调度器通过 M:N 的线程模型和 G-P-M 模型的实现,有效地实现了高效的协程调度和切换,从而实现了高并发和高效率的目标。



用户评论

表情0/300
喵,没有找到相关结果~
暂时没有评论,下载喜马拉雅与主播互动
猜你喜欢
沟通协调

加油!

by:谷威1

劳动关系协调员

劳动关系考试相关问答题

by:风轻云淡已潸然

2024调肤师课程

调肤师课程➕13572369203

by:260家洗脸吧的女老板

《劳动关系协调师》二级

本专辑是国家职业资格《劳动关系协调师》二级教材中的所有“开篇案例”、“延伸阅读”和“案例分析”的内容(非精讲和解析)。需要听精讲请移步隔壁我的其他章节专辑。成人...

by:仗剑天涯HR

《劳动关系协调师》一级

本专辑是国家职业资格《劳动关系协调师》一级级教材中的所有“开篇案例”、“延伸阅读”和“案例分析”的内容(非精讲和解析),需要听精讲请移步隔壁我的章节专辑。成人学...

by:仗剑天涯HR

2级劳动关系协调师丨精讲

基础知识第一节职业道德第二节劳动保障法律与政策第三节劳动经济学第四节劳动关系第五节人力资源管理第六节其他基础知识专业能力第一节劳...

by:大凡田