Go进阶概览 -【5.1 协程与调度器】

5.1 协程与调度器

Go语言的协程是它的一大特性,通过协程可以快速实现并发,提高了开发者的工作效率。

本节我们将深入探讨协程的底层实现原理以及调度实现,我们将了解到并发到底是怎么实现的、多个协程是怎么配合的。

本节我们将以:服务员点餐的例子进行并行、并发、协程及调度器的讲解。

本节代码存放目录为 lesson13

协程的实现原理

什么是并行?

并行也就是一起执行,指的是多个任务在同一时间一起执行。

也就是说多个服务员同时为多个客户点餐,这显然效率是很高的,但是缺点就是需要的服务员数量比较多。


什么是并发?

并发就是多个任务在同一时间段内交替执行,比如说先执行一下任务A,再去执行一下任务B,之后回来继续执行任务A

也就是同一个服务员先为A点餐,在A考虑的过程中再去为B点餐,同理当B在思考下一个菜的时候服务员再去为A点餐。这种方式在服务员数量有限的情况下显然是效率最高的。


协程的实现方式

Go语言中协程使用的就是并发的方式,也就是多个任务在同一时间交替的执行。

一个服务员我们可以理解为一个系统线程,Go通过GMP模型提高了服务员的工作效率,使得服务员可以在很多个客户之间交替点餐。

我们可以理解为这个服务员的效率特别高,他可以马上记录下A的菜单,之后在A思考的过程中可以马上记录下B的菜单,在B思考的过程中又可以快速记录下C的菜单。


GMP模型及调度器

调度器

Go程序运行时,P会从它维护的队列中选择一个Goroutine,将其分配给M执行。

如果一个Goroutine阻塞了(例如等待 I/O 操作),P会将这个 Goroutine暂时挂起,并选择另一个Goroutine继续执行。

P之间可以通过工作窃取机制(Work Stealing)来共享任务,从而提高 CPU的利用率。

我们可以理解为,调度器就是餐厅经理,负责管理服务员的工作。经理根据顾客的需求和服务员的忙碌程度来分配任务。

如果某个服务员忙不过来,经理可以调派其他空闲的服务员来帮助完成工作。

如果某个顾客等待时间过长,经理会确保一个服务员优先处理这个顾客的需求。

需要注意的是,Go语言使用的是协作式调度,也就是说协程会主动让出。比如说A点完一个菜以后需要考虑,那么他会主动让服务员先去为别人点餐。


G(Goroutine)

G也就是协程,它是实现并发的核心单位,包含了程序的栈、程序计数器、指向当前函数的指针,以及一些调度信息。

当一个Goroutine被创建时,它会被分配到一个P上,准备执行。

我们可以理解为,G就是服务员的一个任务事项,比如:为A客户点餐,A客户坐在1号桌,他们有3个人,一共要点5个菜,现在已经点了3个了,A客户还需要思考3分钟。


M(Machine)

M代表的就是内核线程,它是Go程序运行时的实际执行载体,负责真正执行协程代码。

每个M对应一个内核线程,M负责执行P中的Goroutine

我们可以理解为,M就是一个服务员角

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Swxctx

您的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值