解释GMP模型含义

  • M结构是Machine,系统线程,它由操作系统管理,goroutine就是跑在M之上的;M是一个很大的结构,里面维护小对象内存cache(mcache)、当前执行的goroutine、随机数发生器等等非常多的信息
  • P结构是Processor,处理器,它的主要用途就是用来执行goroutine,它维护了一个goroutine队列,即runqueue。Processor的让我们从N:1调度到M:N调度的重要部分。
  • G是goroutine实现的核心结构,它包含了栈,指令指针,以及其他对调度goroutine很重要的信息,例如其阻塞的channel。

Processor的数量是在启动时被设置为环境变量GOMAXPROCS的值,或者通过运行时调度函数GOMAXPROCS()进行设置。Processor数量固定意味着任意时刻只有GOMAXPROCS个线程在运行着go代码

场景分析

我们分别用三角形,矩形和圆形表示Machine Processor和Goroutine。

正常情况下

所有的goroutine运行在同一个M系统线程中,每一个M系统线程维护一个Processor,任何时刻,一个Processor中只有一个goroutine,其他goroutine在runqueue中等待。一个goroutine运行完自己的时间片后,让出上下文,回到runqueue中。 多核处理器的场景下,为了运行goroutines,每个M系统线程会持有一个Processor。

如果两个M都在一个CPU上运行,这就是并发;如果两个M在不同的CPU上运行,这就是并行。在正常情况下,scheduler(调度器)会按照上面的流程进行调度,当一个G(goroutine)的时间片结束后将P(Processor)分配给下一个G,但是线程会发生阻塞等情况,看一下goroutine对线程阻塞等的处理。

线程阻塞

当正在运行的goroutine(G0)阻塞的时候,例如进行系统调用,会再创建一个系统线程(M1),当前的M0线程放弃了它的Processor(P),P转到新的线程中去运行。

runqueue执行完成

当其中一个Processor的runqueue为空,没有goroutine可以调度,它会从另外一个上下文偷取一半的goroutine。

首先创建一个G对象,G对象保存到P本地队列或者是全局队列。P此时去唤醒一个M。P继续执行它的执行序。M寻找是否有空闲的P,如果有则将该G对象移动到它本身。接下来M执行一个调度循环(调用G对象->执行->清理线程→继续找新的Goroutine执行)。
M执行过程中,随时会发生上下文切换。当发生上线文切换时,需要对执行现场进行保护,以便下次被调度执行时进行现场恢复。Go调度器M的栈保存在G对象上,只需要将M所需要的寄存器(SP、PC等)保存到G对象上就可以实现现场保护。当这些寄存器数据被保护起来,就随时可以做上下文切换了,在中断之前把现场保存起来。如果此时G任务还没有执行完,M可以将任务重新丢到P的任务队列,等待下一次被调度执行。当再次被调度执行时,M通过访问G的vdsoSP、vdsoPC寄存器进行现场恢复(从上次中断位置继续执行)。

了解更多

Golang GMP调度模型相关推荐

  1. golang——GMP调度模型详解

    目录 一.Golang调度器由来 存在问题: 3种协程和线程的关系 二.Golang对协程的处理 协程和goroutine关系 Go的GMP调度模型 P 和 M 何时会被创建 P和M的个数 调度器的设 ...

  2. Golang GMP调度模型详解

    文章目录 前言 1. Goroutine调度器的基本概念 2. GMP 数据结构 2.1 G 2.2 M 2.3 P 3. M缓冲池 4. 调度策略 4.1 work stealing机制 4.2 h ...

  3. Golang知识点二、GMP调度模型

    GMP调度模型 1. 调度器由来   调度器分为进程调度器和线程调度器. 1.1. 单进程时代   单进程系统存在一定问题:1. 单一执行流程.计算机只能一个任务一个任务处理 2. 进程阻塞所带来的C ...

  4. golang之gmp调度模型

    原始调度模型 我们把线程分为内核级线程和用户态线程,内核级的线程在切换线程时,开销比较大,需要系统调用,但是,用户态线程不是这样,用户态的线程之间的切换不需要系统调用,从而把切换的开销比较小. gol ...

  5. Go 语言编程 — 并发 — GMP 调度模型

    目录 文章目录 目录 并发和并行 如何交互?CSP 通信模型 如何调度?GMP 调度模型 用户级线程模型(多对一) 内核级线程模型(一对一) 两级线程模型(多对多) GMP 线程模型 Go Runti ...

  6. 聊一聊Go中的GMP调度模型

    调度模型的由来 早期操作系统是单进程的,那么执行进程只能是顺序执行的 顺序执行,效率比较低 当前进程的阻塞会带来CPU浪费,因为CPU没办法处理后面待处理的进程 后来出现了多进程操作系统,多进程处理下 ...

  7. Go面试必问——GMP调度模型详解

    来源:http://www.topgoer.com/并发编程/GMP原理与调度.html 文章目录 GMP 原理与调度 Golang "调度器" 的由来? (1) 单进程时代不需要 ...

  8. GMP调度模型入门教程

    本文主体分为2大部分,先介绍了GMP的由来,再介绍了GMP的调度模型,剖析了GMP的工作过程,适合初学GMP的读者. GMP调度器的由来 单进程操作系统不需要调度器 单进程操作系统中每个进程是串行运行 ...

  9. Golang的调度模型

    Golang中的内存模型 The Go memory model specifies the conditions under which reads of a variable in one gor ...

最新文章

  1. 【数据挖掘笔记二】认识数据
  2. CTFshow php特性 web134
  3. android项目模块导入eclipse编译报错,android中studio导入eclipse项目报错怎么办
  4. JQuery UI 拖拽排序
  5. 测试对bug如何分析和定位
  6. Objective-C学习笔记-使用NSString与NSData读写文件
  7. 使用Jquery插件bTabs实现多页签打开效果
  8. 从C语言开始的语言革命
  9. AndroidStudio安卓原生开发_android按钮防止短时间内连续点击_在android_java中都能使用---Android原生开发工作笔记131
  10. Bailian2811 熄灯问题【暴力】
  11. 值得拥有的手绘风格画图工具
  12. echarts使用记录(二)legend翻页,事件,数据集,设置y轴最大/小值,让series图形从右侧出往左移动...
  13. 微波遥感SNAP(四)——检测地表沉降(2)相位解缠与地理编码
  14. cc2530设计性实验代码三
  15. linux 对整个文件 url解码,linux shell实现 URL 编码/解码方法
  16. 将cpp文件封装成 so 文件并调用
  17. 职称计算机辅导软件,职称计算机辅导:WindowsXP辅助工具
  18. 学术写作 系列1 HOW TO WRITE AN INTRODUCTION
  19. Sprite Kit教程
  20. 基于业务描述语言BDL的需求方法论

热门文章

  1. 小米笔记本pro总是无故死机解决办法
  2. E. Product Oriented Recurrence(codeforces R566 div2)
  3. oracle的groupby聚合函数效率,Oracle内容概述
  4. RESET - 把一个运行时参数值恢复为缺省值
  5. CSRF(Cross-site request forgery)跨站请求伪造详解(好文章,美团技术团队)
  6. java web.xml位置_java – websphere ibm-web-bnd.xml是否有新的架构位置?
  7. 混合表象下单粒子格林函数计算
  8. android短视频列表自动播放,小程序实现多视频连续播放
  9. 2018年度托福考情分析——阅读篇
  10. 如何快速获取ListView的打气筒对象