运行时:并发调度

本文深入探讨了Go语言的并发模型,重点介绍了goroutine、PMG模型以及其背后的调度机制。goroutine采用多对多模型,适合IO密集型任务,但对CPU密集型任务调度效率较低。文章详细阐述了P对象(处理器)、M对象(线程)和G对象(goroutine)的角色,强调了它们之间的协作以及如何通过本地队列和全局队列来平衡任务执行。此外,还讨论了公平性、执行次序、性能优化建议以及栈内存管理,特别是连续栈的动态扩容和收缩机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

严格来说 goroutine 不能从字面层来翻译称之为协程,它实际上是一套相对完整的虚拟机。

goroutine 模型

Go 语言的 goroutine 模型相对来说设计的不错,goroutine 模型使用的是多对多模型。多对多模型被一些操作系统一些语言 Rust、Java 抛弃,而改用一对一模型,因为一对一模型性能高,但是对于海量的并发操作未必是最优秀的。

Go 语言更适合 IO 密集型,对 CPU 密集型来说它对运行时调度不是很合理,它对 CPU 密集计算上不是很好,但是在 IO 密集上做的很好。

PMG 模型

调度器最根本的任务就是让多个 goroutine 执行。第一确保 goroutine 能执行,第二确保 goroutine 尽可能快执行,第三确保多个 goroutine 之间公平性。

我们抛开硬件只说基本架构,goroutine 本身是基于并发设计的。如果它是虚拟机的话,它首先需要处理器,处理器决定了同时可以运行任务的数量。其次需要并发任务。最后需要具体执行机构,进程的执行机构是线程,在这里把线程抽象出线程。因为运行时是单进程,所以不需要额外的任务调度,三种机构基本可以完成。

我们用一个示意图,PMG 模型代表处理器来控制并发,线程负责具体执行ÿ

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值