golang的goroutine调度模型

本文介绍了Golang的goroutine调度模型,强调其轻量级特性及与线程的区别。内容涵盖goroutine的启动、全局与本地队列的工作原理,以及M(线程)、P(上下文)和G(协程)之间的交互。详细讨论了调度时间片分配、子goroutine创建时的时间限制,以确保资源公平分配。
摘要由CSDN通过智能技术生成

golang的goroutine调度模型

进程:一个在内存中运行的程序

线程:进程中的一个控制单元,一个进程至少由一个线程,也可以由多个线程,主要由CPU进行调度。

形象理解:进程就是一个生产某样产品的工厂,线程就是工厂里面的生产车间。

golang的goroutine是一个轻量化的线程。一个go主线程就可以轻轻松松起成千上万个goroutine。主要特点:

  1. 有独立的占空间
  2. 共享程序的堆空间
  3. 调度由用户掌控

golang的gouroutine的调度模型为MPG模型

  • M:操作系统的主线程(物理线程,由CPU调度)
  • P:协程执行所需要的上下文
  • 协程

golang起一个goroutine很简单,只需要一个关键字go就可以轻松起一个goroutine

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GYdaqagH-1663260806647)(C:\Users\fei\AppData\Roaming\Typora\typora-user-images\image-20220916001557361.png)]

  1. golang起的goroutine会放在一个全局队列中,全局队列遵循先进先出的原则
  2. M(线程)则从全局队列中获取goroutine,每个M(线程)获取goroutine的时候,会进行加锁操作,获取goroutine完成后再释放锁,以此保证安全
  3. P(上下文)负责管理一个本地队列,M(线程)一次性从全局队列中获
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值