美文网首页
GO协程调度

GO协程调度

作者: 心似南风 | 来源:发表于2020-09-13 10:19 被阅读0次

调度模型---MPG

image.png
  • M(工作线程,它由系统调度): 一般比P个数多,做一些其他处理(如:runtime包的内置其他任务需要处理,当某个G发生系统调度产生阻塞时,多出来的M会接管剩余的本地G队列),必须持有P才可以执行代码.
  • P(处理器,包含运行go代码的必要资源和调度goroutine的能力): 一般小于等于cpu核数, 除了调度本地的runqueues还会周期性的调用全局的global runqueue
  • G(协程,由go关键字创建的): 分为两个全局的G队列(global runqueue) 和每个P自己维护的G队列(runqueues)GO1.1之前只有全局的G队列,多个处理器P通过互斥锁调度,严重影响了并发执行效率. 引入局部runqueues后,每个处理器P访问自己的runqueuues时不需要加锁,大大提高了效率.

调度策略

  • 队列轮转:
    每个处理器P调度自己维护的队列中的G到M中执行,执行结束则继续调度下一个,另外会定期检查global runqueue中待运行的G并调度到M执行,全局的global runqueue主要来自从系统调用恢复的G.周期性检测防止G的得不到调度机会.
  • 系统调用
    当某个M所持有的P所调度的G,发生系统调用时,工作线程将会阻塞,即M将会阻塞,所以M个数要比P多,当发生阻塞时,在冗余的M中挑选一个接管P调度剩下的G,即做工作交接.当G系统调度结束后,如果有空闲的P,原M则会获取一个P,继续执行G,否则将G放入全局的global runqueue,并将M放入到缓存池.
  • 工作量窃取
    即某个处理器P没有需要调度的协程时,将从其他处理器中偷取一半的协程
  • 抢占式调度
    避免某个协程长时间执行,而阻碍其他协程被调度的机制.在GO1.14之前如果协程没有函数调用会无限的占用执行权.如
go func() {
    for {
        // 无函数调用
    }
}

直到GO1.14,调度器引入了基于信号的抢占机制,这个问题才得以解决.

相关文章

  • Go调度相关

    go 调度go routinue在线程中进行调度 GPM的概念: G(Goroutine): 即Go协程,每个go...

  • Openresty协程调度对比Go协程调度

    在web编程领域,Openresty与Go均有十分优秀的处理能力,在面对高并发的web编程,两者一般都是首选的技术...

  • 2021/04/07GO语句的执行规则

    1.理解协程是如何被调度的 java中的线程和系统线程的调度关系为1:1go中协程和系统线程的调度关系为M:N,这...

  • misc.

    1. linux常用命令 top 2. go的协程与线程的区别 线程是操作系统的调度单元 协程是由go的runti...

  • go协程学习笔记

    协程本质: go协程本质上还是用线程来运行代码,只是在多线程上增加了调度器,通过调度器让每一个线程可以执行多个协程...

  • go 学习笔记1

    关注点 go 的协程(routine)是通过调度器,调度,每个调度器绑定到一个线程(thread)上 引用类型 ...

  • 关于Coroutine\Channel的几点注意

    通道,类似于go语言的chan,支持多生产者协程和多消费者协程。底层自动实现了协程的切换和调度。 实现原理 通道与...

  • 21. Go 协程

    21. Go 协程 Go 协程是什么? Go 协程是与其他函数或方法一起并发运行的函数或方法。Go 协程可以看作是...

  • [Android] 深入理解Kotlin协程

    Kotlin协程 协程由程序自己创建和调度,不需要操作系统调度,所以协程比线程更加轻量。相比于线程的切换,协程切换...

  • Goroutine快速入门

    Go协程四大特点有独立的栈空间共享程序堆空间调度由用户控制协程是轻量级的线程 主线程和协程同时执行 如果主线程退出...

网友评论

      本文标题:GO协程调度

      本文链接:https://www.haomeiwen.com/subject/fdbwektx.html