首页 > 其他分享 >golang GMP机制

golang GMP机制

时间:2024-06-01 13:55:35浏览次数:13  
标签:协程 队列 创建 调度 golang 机制 GMP 全局

GMP是Golang底层实现的一种调度协程的方案,目的是提高并发处理且降低切换成本。

G M P分别是底层实现中的三个数据结构。

g代表goroutine,指被调度的协程对象。
m代表线程,它是操作系统级别的线程,用来执行程序中的协程。
p代表processer,是CPU的抽象。

默认情况下,go程序会为每个CPU创建一个P(通过GOMAXPROCS调整),并在程序启动时创建多个M,M的数量往往略大于P的数量。
M被调度到P上执行G。G被维护在两个列表中,一个是全局队列,一个是P的本地队列。

整个调度过程 Golang提供了runtime包用来实现对协程管理的跟踪和查看。

g创建

g创建时,首先看能否放置在m本地的队列中,如果发现已经到达了256个,则会放置到全局队列中,此时会将本地中一半的g放置到全局队列。

g调度
调度器在调度g时,先从local 队列中查找,然后再去全局队列中找。有时候会从系统调用或者网络轮询中调度。
G0 是M的第一个routine,负责系统调用和网络轮询。

标签:协程,队列,创建,调度,golang,机制,GMP,全局
From: https://www.cnblogs.com/zongzw/p/18225933

相关文章

  • 10.Golang中的数组
    1、Array(数组)的介绍数组是指一系列同一类型数据的集合。数组中包含的每个数据被称为数组元素(element),这种类型可以是任意的原始类型,比如int、string等,也可以是用户自定义的类型。一个数组包含的元素个数被称为数组的长度。在Golang中数组是一个长度固定的数据类型,数组的长......
  • 11.Golang中的切片
    1、为什么要使用切片因为数组的长度是固定的并且数组长度属于类型的一部分,所以数组有很多的局限性。例如:packagemainfuncarraySum(x[4]int)int{sum:=0for_,v:=rangex{ sum=sum+v}returnsum}funcmain(){a:=[4]int{1,......
  • TCP的重传机制
    TCP是一个可靠的传输协议,解决了IP层的丢包、乱序、重复等问题。这其中,TCP的重传机制起到重要的作用。序列号和确认号之前我们在讲解TCP三次握手时,提到过TCP包头结构,其中有序列号和确认号,而TCP实现可靠传输的方式之一,就是是通过序列号和确认应答。序列号(SequenceNumber):......
  • golang: 一个闭包的有趣使用
    来源https://colobu.com/gotips/001.html示例packagemainimport"time"funcTimeTrack()func(){ pre:=time.Now() returnfunc(){ println(time.Since(pre).Milliseconds()) }}funcmain(){ deferTimeTrack()() time.Sleep(1024*time.Millis......
  • golang中的数组和切片
    packagemainimport( "fmt" "time")funcmain(){ x:=[...]int{1,2,3}//数组的声明中可以使用...来代替具体的数字 y:=x//数组的赋值是全拷贝方式,所以对新数组的修改不影响原始数组 y[0]=4 //z:=append(x,2)//数组不可以使用app......
  • golang函数使用基础
    函数介绍有其他语言基础的话就没啥介绍的,基本语法:funcfunctionName(形参列别)(返回值列表){执行语句return返回值列表}例子:funcgetSum(n1int,n2int)int{varresint=n1+n2 returnres}包实际就创建不同的文件夹,存放程序文件。Go的每一个文......
  • 黑客团伙利用Python、Golang和Rust恶意软件袭击印国防部门;OpenAI揭秘,AI模型如何被用于
    巴黑客团伙利用Python、Golang和Rust恶意软件袭击印度国防部门!与巴基斯坦有联系的TransparentTribe组织已被确认与一系列新的攻击有关,这些攻击使用Python、Golang和Rust编写的跨平台恶意软件,针对印度政府、国防和航空航天部门。“这一系列活动从2023年底持续到2024年4月......
  • 长序列中Transformers的高级注意力机制总结
    在处理长序列时,Transformers面临着注意力分散和噪音增加等挑战。随着序列长度的增长,每个词元必须与更多词元竞争注意力得分,这会导致注意力分数被稀释。这种稀释可能导致不那么集中和相关的上下文表示,特别是影响彼此距离较远的词元。并且较长的序列更有可能包含不相关或不太相关的......
  • Golang GRPC 环境 问题
    生成文件执行protoc--go_out=.--go_opt=paths=source_relative--go-grpc_out=.--go-grpc_opt=paths=source_relativeservice.proto 报下列错处理方法1.'protoc-gen-go'不是内部或外部命令,也不是可运行的程序或批处理文件。a.检查gopath目录(%GOPATH%\)的bin文件夹,是否有......
  • golang import 导入的四种方式
     1标准导入:import"package_name" 2导入别名:import(alias"package_name") 3匿名导入:import(_"package_name") 4点导入:import(."package_name") 下面做详细解释:Go语言最常见的导入方式是标准导入,格式如下:import&qu......