MPG线程模型简介
概述
go语言中的MPG线程模型对两级线程模型进行了一定程度的改进,使它能够更加灵活的进行线程之间的调度。
它由3个主要模块构成,如下图:

MPG的3个主要模块以及功能,我们通过下表所示。
| 模块 | 功能说明 |
|---|---|
| Machine | 一个Machine对应一个内核线程,相当于内核线程在go语言中的映射 |
| Processor | 一个Processor表示执行go代码片段的所必需的上下文环境,可以理解为用户代码逻辑的处理器 |
| Goroutine | 是对go语言中代码片段的封装,其实是一种轻量级的用户线程 |
为了更加形象,下面的介绍中我们会用M、P、G分别指代Machine、Processor和Goroutine。从图4-4可以看出,每一个
M都会与一个内核线程绑定,在运行时一个M同时只绑定一个P,而P和G的关系则是一对多。在运行过程中,M和内核线程之间
对应关系不会变化,在M的生命周期内,它只会与一个内核线程绑定,而M和P以及P和G之间的关系都是动态可变的。
在实际的运行过程中,M和P的组合才能够为G提供有效的运行环境,而多个可执行G将会顺序排成一个队列挂在某个P上面,
等待调度和执行,如图所示。

上图中,M和P共同构成了一个基本的运行环境,此时G0中的代码片段处于正在运行的状态,而右边的G队列处于待执行状态。
当没有足够的M来和P组合为G提供运行环境时,Go语言会创建新的M。在很多时候M的数量可能会比P要多。在单个go语言进程中,
P的最大数量决定了程序的并发规模,且P的最大数量是由程序决定的。可以通过修改环境变量GOMAXPROCS和调用函数runtime.GOMAXPROCS
来设定P的最大值。
M和P会适时的组合和断开,以保证待执行G队列能够得到及时运行。比如说图4-5中的G0此时因为网络I/O而阻塞了M,那么P就会携带剩余的
G投入到其他M中。这个新的M(M1)可能是新创建的,也可能是从调度器空闲M列表中获取的,这取决于此时的调度器空闲M列表中是否存在M,
这样的机制设计也是为了避免M过多创建。运行机制如图所示

当M对应的内核线程被唤醒时,M将会尝试为G0捕获一个P上下文,可能是从调度器的空闲P列表中获取,如果获取不成功,
M会把G0放入到调度器的可执行G队列中,等待其他P的查找。为了保证G的均衡执行,非空闲的P运行完自身的可执行G队列后,
会周期性从调度器的可执行G队列中获取待执行的G,甚至从其他的P的可执行G队列中掠夺G。
MPG线程模型简介的更多相关文章
- Leader-Follower线程模型简介
参考58沈剑大神架构师之路上的文章,谈谈Leader-Follower线程模型: 上图就是L/F多线程模型的状态变迁点,共6个关键点: (1)线程有3种状态:领导leading,处理processin ...
- 曹工说Tomcat:200个http-nio-8080-exec线程全都被第三方服务拖住了,这可如何是好(上:线程模型解析)
前言 这两年,tomcat慢慢在新项目里不怎么接触了,因为都被spring boot之类的框架封装进了内部,成了内置server,不用像过去那样打个war包,再放到tomcat里部署了. 但是,内部的 ...
- JS线程模型&Web Worker
js线程模型 客户端javascript是单线程,浏览器无法同时运行两个事件处理程序 设计为单线程的理论是,客户端的javascript函数必须不能运行太长时间,否则会导致web浏览器无法对用户输入做 ...
- jvm-垃圾回收gc简介+jvm内存模型简介
gc是jvm自动执行的,自动清除jvm内存垃圾,无须人为干涉,虽然方便了程序员的开发,但同时增加了开发人员对内存的不可控性. 1.jvm内存模型简介 jvm是在计算机系统上又虚拟出来的一个伪计算机系统 ...
- Netty In Action中文版 - 第十五章:选择正确的线程模型
http://blog.csdn.net/abc_key/article/details/38419469 本章介绍 线程模型(thread-model) 事件循环(EventLoop) 并发(Con ...
- 死磕 java线程系列之线程模型
问题 (1)线程类型有哪些? (2)线程模型有哪些? (3)各语言使用的是哪种线程模型? 简介 在Java中,我们平时所说的并发编程.多线程.共享资源等概念都是与线程相关的,这里所说的线程实际上应该叫 ...
- 你不得不知的Golang线程模型 [转载]
原著:翟陆续(加多) 资深Java , 著Java并发编程之美 一.前言 本节我们来探讨Go的线程模型,首先我们先来回顾下常见的三种线程模型,然后在介绍Go中独特的线程模型. 二.三种线程模型 线程的 ...
- Linux 网络 I/O 模型简介(图文)(转载)
Linux 网络 I/O 模型简介(图文)(转载) 转载:http://blog.csdn.net/anxpp/article/details/51503329 1.介绍 Linux 的内核将所有外部 ...
- 看我是如何处理自定义线程模型---java
看过我之前文章的园友可能知道我是做游戏开发,我的很多思路和出发点是按照游戏思路来处理的,所以和web的话可能会有冲突,不相符合. 来说说为啥我要自定义线程模型呢? 按照我做的mmorpg或者mmoar ...
- HBase的Write Ahead Log (WAL) —— 整体架构、线程模型
解决的问题 HBase的Write Ahead Log (WAL)提供了一种高并发.持久化的日志保存与回放机制.每一个业务数据的写入操作(PUT / DELETE)执行前,都会记账在WAL中. 如果出 ...
随机推荐
- [转帖]一文浅析Nginx线程池!
https://zhuanlan.zhihu.com/p/616500765 Nginx通过使用多路复用IO(如Linux的epoll.FreeBSD的kqueue等)技术很好的解决了c10k ...
- vue混入mixin
<div id="app"> --{{nick11}} </div> <script> // 全局混入 不需要注册 var m1 = Vue.m ...
- go中string是如何实现的呢
go中string是如何实现的呢 前言 实现 go语言中的string是不可变的 []byte转string string转[]byte 字符串的拼接 +方式进行拼接 fmt 拼接 Join 拼接 b ...
- Walrus 0.5发布:重构交互流程,打造开箱即用的部署体验
开源应用管理平台 Walrus 0.5 已于近日正式发布! Walrus 0.4 引入了全新应用模型,极大程度减少了重复的配置工作,并为研发团队屏蔽了云原生及基础设施的复杂度.Walrus 0.5 在 ...
- 19.12 Boost Asio 获取远程进程
远程进程遍历功能实现原理与远程目录传输完全一致,唯一的区别在于远程进程枚举中使用EnumProcess函数枚举当前系统下所有活动进程,枚举结束后函数返回一个PROCESSENTRY32类型的容器,其中 ...
- Java注解之获取注解内部数据的原因分析
我们都知道从JDK1.5开始,注解开始被支持使用,当我们在使用注解的时候感觉比配置文件用起来更加简便和清爽.配置文件是通过解析配置文件的内容获取到数据,那么为什么仅仅在类.方法或者属性上添加注解被注解 ...
- spring框架中RESTFUL接口相关注解
1.说明 springboot 是国内最常用的web框架,因为它的http server功能是最重要的.本文列举了一些现在通用的restful形式的接口所需要的注解 2.@RequestMapping ...
- AIX6.1修改时区/修改时间
环境 AIX6.1 修改时间 格式:date -n mmddHHMMYY #mm表示月分,dd表示日期,HH表示小时,MM表示分钟,YY表示年份. 例子:date -n 1204171622 #修 ...
- SpringSecurity 的登录流程
用过SpringSecurity的小伙伴,都知道 Authentication 这个接口,我们在任何地方通过这个接口来获取到用户登录的信息,而我们用的频繁的一个它的一个实现类就是 Username ...
- Linux输出转换命令 xargs
一.基本用法 xargs命令的作用,是将标准输入转为命令行参数. 原因:大多数命令都不接受标准输入作为参数,只能直接在命令行输入参数,这导致无法用管道命令传递参数 如下面 echo 不接受标准输出做参 ...