首页 > 其他分享 >go gmp

go gmp

时间:2023-06-01 09:59:33浏览次数:47  
标签:协程 队列 本地 go 全局 gmp runnext

M G P

M:machine 系统线程,执行实体,通过系统调用clone来创建

G:groutine 任务和上下文

P: 虚拟处理器,M需要获得P才能执行否则休眠

go的调度本质上是一个生产消费的流程

生产端

M负责调度循环消费task

队列分runnext+本地队列+全局队列来区分优先级,也避免锁

本地队列使用的数据结构是数组,内存是连续的连续性好

全局队列使用的数据结构是链表,无需扩展

1. runnext为空

协程任务G会赋值给runnext

2. runnext不为空,local 队列不满

协程任务G会赋值给runnext,原本在runnext的task被踢出后放入本地队列

3. runnext不为空,local 队列满了

协程任务G会赋值给runnext,原本在runnext的G被踢出后 与local队列的一半G 放入全局队列

消费端

1. schdule会每执行60次去全局队列取G,如果队列有值schedule去执行代码

2. 如果全局队列为空或者%60 != 0,会去runnext+本地队列取

3. 如果runnext+本地队列没值,反复去本地-》全局队列取值

4. 如果没有值去netpoll取网络任务

5. 如果没有去其他的T取可执行任务

6. 如果没有执行休眠流程,检查所有的队列+netpoll 还是没有就休眠

 

标签:协程,队列,本地,go,全局,gmp,runnext
From: https://www.cnblogs.com/isnotnull/p/17427155.html

相关文章

  • 博学谷学习记录】超强总结,用心分享 | mongodb基础用法
    【博学谷IT技术支持】数据库连接后端数据库连接语法:mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]mongodb://是固定搭配,后边是可选参数用户名加密码,host是要连接服务器的地址,portx是指定的端口,默认27017da......
  • go中的并发学习
    代码源自于https://github.com/lotusirous/go-concurrency-patterns自此对各个示例代码进行调试。1-boringpackagemainimport( "fmt" "math/rand" "time")funcboring(msgstring){ fori:=0;;i++{ fmt.Println(msg,i) time.Sleep(time.D......
  • golang vscode开发环境配置
    1.下载go安装包并安装官网下载地址2.下载vscode并安装官网下载地址3.安装vscodego语言开发扩展(插件)4.切换国内下载源,cmd输入如下代码goenv-wGO111MODULE=ongoenv-wGOPROXY=https://goproxy.cn,direct5.安装vscodego开发工具包windows下vscodeCtrl+Shift+P找......
  • mongocxx c++ 14标准,进行多表联合查询
     #include<mongocxx/client.hpp>#include<mongocxx/instance.hpp>#include<mongocxx/uri.hpp>#include<bsoncxx/builder/stream/document.hpp>#include<bsoncxx/json.hpp>#include<bsoncxx/types.hpp>usingbsoncxx::builder::s......
  • mongodb安装
    一、YUM安装MongoDB1、添加一个yum源创建一个/etc/yum.repos.d/mongodb-org-5.0.repo文件[mongodb-org-5.0]name=MongoDBRepositorybaseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/5.0/x86_64/gpgcheck=1enabled=1gpgkey=https://www.mongodb.or......
  • 如何使用Go中的Weighted实现资源管理
    1.简介本文将介绍Go语言中的Weighted并发原语,包括Weighted的基本使用方法、实现原理、使用注意事项等内容。能够更好地理解和应用Weighted来实现资源的管理,从而提高程序的稳定性。2.问题引入在微服务架构中,我们的服务节点负责接收其他节点的请求,并提供相应的功能和数......
  • 如何使用Go中的Weighted实现资源管理
    1.简介本文将介绍Go语言中的Weighted并发原语,包括Weighted的基本使用方法、实现原理、使用注意事项等内容。能够更好地理解和应用Weighted来实现资源的管理,从而提高程序的稳定性。2.问题引入在微服务架构中,我们的服务节点负责接收其他节点的请求,并提供相应的功能和数......
  • go语言select
    go语言select使用funcmain(){ ch1:=make(chanint,1) ch2:=make(chanint,1) gofunc(){ time.Sleep(1*time.Second) ch1<-1 }() gofunc(){ time.Sleep(2*time.Second) ch2<-1 }() select{ case<-ch1: fmt.Println("ch......
  • 高性能 Go 的 6 个技巧 — Go 高级主题
    本文旨在讨论6个提示,这些提示可以帮助诊断和修复Go应用程序中的性能问题。基准测试:在Go中编写有效的基准测试对于了解代码性能至关重要。可以通过将文件命名为“_test.go”,并使用testing包的Benchmark函数来创建基准测试。以下是一个示例:funcfibonacci(nint)int{ ifn<=......
  • golang之recover
    recover是什么golang的recover是一个内置函数,用于在发生panic时恢复程序的控制流。当程序发生panic时,程序会停止执行当前的函数,并向上层函数传递panic,直到被recover函数捕获。recover函数必须在defer语句中调用,否则无法捕获panic。如果没有发生panic或者没有被recover函数捕获,程序......