首页 > 其他分享 >day7 golang GMP

day7 golang GMP

时间:2023-04-06 20:57:34浏览次数:40  
标签:LRQ 协程 g1 day7 绑定 阻塞 golang 线程 GMP

大名鼎鼎的GMP模型 需要自行学习的知识:进程、线程、协程、多线程、线程池、io多路复用,内核态用户态,,同步阻塞异步非阻塞等等相关知识

代码是在线程中运行的,协程也是,所以当协程阻塞的时候该线程也阻塞了,其他任务就无法调度了,该线程就死了。

如何解决,那就需要让协程自由的在线程中移动,当阻塞的时候把他扔一边,把其他协程绑定到该线程上让他继续干活。

等刚才阻塞的任务又活过来的时候,在把这个协程任务和线程绑定起来,继续干活。

理解了上面这些就可以简单看GMP模型了

G:goroutine  任务函数包装成go协程,也就是go协程,他存储了协程的执行栈信息、状态、任务函数等,初始栈大小2-4K

M:machine Thread,对系统线程抽象封装,所有代码最终都要在系统线程上运行

P:Processor 虚拟处理器,默认为cpu核心数,p的数量决定着最大可并行的G的数量;P有自己的队列长度LRQ长度256,这里放的是待执行的G;M和P绑定在一起,这样P队列中的G才能真正的在线程上执行

下面以topgoer.com里的图为例解释

 

1、通过go 关键字创建goroutine,把创建好的G1-Gn放到P的本地队列,如果LRQ满了超过256,则放到GRQ全局队列

2、P1和M1 绑定,M1从P1的LRQ中请求G,如果没有则从GRQ中请求,如果还没有就偷其他P中的G到自己的LRQ中,最后在M1上执行,执行完解绑,继续绑定拿G执行。

3、如果进入chanel 互斥锁阻塞,解绑,继续拿G绑定执行,如果g1被唤醒就把g1的任务放入唤醒的自己的LRQ中,如果队列满就把g1和LRQ中的一半仍到GRQ中

4、如果遇到同步阻塞,g1和m1都阻塞,那就把m1和p1解绑,p1在从休眠里面拿一个m和自己绑定(没有就创建),获取p1里的其他g继续在m上跑;如果m1阻塞结束,优先和p1绑定,如果没闲着的p,g1进GRQ,m1进休眠队列

 

标签:LRQ,协程,g1,day7,绑定,阻塞,golang,线程,GMP
From: https://www.cnblogs.com/dribs/p/17294123.html

相关文章

  • Golang之常用方法[总结]
    1.有一堆数字,如果除了一个数字以外,其他数字都出现了两次,那么如何找到出现一次的数字?nums:=[]int{1,5,1,6,5,3,6}i:=0for_,v:=rangenums{i^=v}fmt.Print(i)重点是异或的使用......
  • (转)使用 Golang 创建和读取 Excel 文件
    原文:https://juejin.cn/post/7117578016858849293摘要本文提出一种使用Golang进行Excel文件创建和读取的方案。首先对问题进行分析,引出方案的基本架构;然后分章节描述了Excelize基础库的基本用法,以及Excel数据在Golang中的表示和解析方式,并进一步提出了应对大规模数......
  • 运行 Golang 程序时让程序不会在运行结束后立即关闭命令行窗口
    在运行Golang程序时,为了让程序不会在运行结束后立即关闭命令行窗口,可以采用以下两种方法:使用fmt.Scanln()函数在程序的末尾添加一行fmt.Scanln()可以暂停程序运行,等待用户在命令行中输入任何字符,程序将等待用户输入,然后再继续执行直到程序结束。packagemainimport"fm......
  • golang pprof 监控系列(4) —— goroutine thread 统计原理
    golangpprof监控系列(4)——goroutinethread统计原理大家好,我是蓝胖子。在之前golangpprof监控系列文章里我分别介绍了gotrace以及gopprof工具对memory,block,mutex这些维度的统计原理,今天我们接着来介绍golangpprof工具对于goroutine和thread的统计原理。还记得在......
  • Golang 应用接入 Prometheus 监控
    前言Prometheus提供了官方版Golang库(https://github.com/prometheus/client_golang)用于采集并暴露监控数据,本文快速为你介绍如何使用官方版Golang库来暴露Golangruntime相关的数据,以及其它一些基本简单的示例,并使用Prometheus监控服务来采集指标展示数据。❝有关全面......
  • golang开发需要掌握的核心包以及中间件,涵盖项目的各个领域,值得收藏
    golang开发需要掌握的核心包以及中间件,涵盖项目的各个领域,值得收藏。常用包常用包 说明fmt 实现格式化的输入输出操作,其中的fmt.Printf()和fmt.Println()是开发者使用最为频繁的函数。io 实现了一系列非平台相关的IO相关接口和实现,比如提供了对os中系统相关的IO功能的封装。我们......
  • Golang基础-Select
    基本概念select是Go中的一个控制结构,类似于switch语句。select语句只能用于通道(channel)操作,每个case必须是一个通道操作,要么是发送要么是接收。select语句会监听所有指定的通道上的操作,一旦其中一个通道准备好就会执行相应的代码块。如果多个通道都准备好,那么sel......
  • Golang入门教程(一)GOPATH与工作空间(Windows)
    https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/01.2.md Windows环境:下面我就以mymath为例来讲述如何编写应用包:cd$GOPATH/srcmkdirmymath//我的环境:$GOPATH=c:\mygo新建文件sqrt.go,内容如下://$GOPATH/src/mymath/sqrt.go源码如......
  • 如何在ubuntu22下安装docker版的golang来编译go语言写的代码
    为了让我们的ubuntu22系统更干净清爽我们使用docker首先使用snapinstalldocker安装docker后即可使用docker了docker命令的使用方法1:将你的代码下载到用户目录(~)下面(例如~/github/xixi/...)2:使用cd命令进到你代码需要运行gobuild的文件夹3:然后使用下面命令即可给你的代码编译......
  • 大数库GMP测试
    大数库GMP测试在openEuler(推荐)或Ubuntu或Windows(不推荐)中完成下面任务用自己8位学号建两个文件夹xxxxxxxxsrc,xxxxxxxx,到GMP官网https://gmplib.org/下载最新代码到201x1xxxsrc,编译代码并把GMP库安装到201x1xxx文件夹。(5')基于GMP的大数库编写测试代码测试大数运算,计算2的N次......