首页 > 其他分享 >Golang GMP原理(1)

Golang GMP原理(1)

时间:2023-04-28 14:23:07浏览次数:31  
标签:协程 队列 并行 调度 Golang 线程 内核 原理 GMP

Golang GMP原理(1)

概念梳理

线程

线程一般指内核级线程,核心如下:

  1. 操作系统的最小调度单元
  2. 创建 销毁 调度由内核完成,cpu要完成内核态与用户态的转换
  3. 可充分利用多核,实现并行

协程

协程线程对应
image

协程,又称为用户级线程,核心点如下:

  1. 与线程存在映射关系,为M:1
  2. 创建、销毁、调度在用户态完成,对内核透明,所以更轻
  3. 从属同一个内核级线程,无法并行;一个协程阻塞会导致从属同一线程的所有协程无法执行。

Goroutine

Goroutine是特殊的协程

image

  1. 与线程存在映射关系,为M:N
  2. 创建、销毁、调度在用户态完成,对内核透明,足够轻便
  3. 可利用多个线程实现并行
  4. 通过调度器实现和线程间的动态绑定和调度
  5. 栈空间可动态扩缩。

对比

模型 弱依赖内核 可并行 可应对阻塞 栈可动态扩缩
线程 × ×
协程 × × ×
goroutine

GMP模型

g

  1. g是goroutine,是对协程的抽象
  2. g有自己的运行栈、状态、以及执行的任务函数(用户通过go func指定)
  3. g需要绑定到p才能执行,在g的视角中,p是它的cpu

p

  1. p是调度器,联系g与m
  2. p的数量决定了g最大并行数量,可由用户通过GOMAXPROCS进行设定(超过CPU核数无意义)

m

  1. m是machine 是go中线程的抽象
  2. m不直接执行g,而是先和p绑定,由其实现代理
  3. 借由p的存在,m无需和g绑死,也无需记录g的状态信息,因此g在全生命周期中可实现跨m执行

gmp

image

  1. m是线程的抽象 g是goroutine p'是调度器
  2. m调度g前 需要和p绑定
  3. 全局有多个m和p 同时并行的g最大数量等于p的数量
  4. g的存放队列有三类:P的本地队列;全局队列;和wait队列(图中未展示,为io阻塞就绪态goroutine队列)
  5. m调度g时,优先取p本地队列,其次取全局队列,最后取wait队列;这样的好处是,取本地队列时,可以接近于无锁化,减少全局锁竞争;
  6. 为防止不同p的闲忙差异过大,设立work-stealing机制,本地队列为空的p可以尝试从其他p本地队列偷取一半的g补充到自身队列.

标签:协程,队列,并行,调度,Golang,线程,内核,原理,GMP
From: https://www.cnblogs.com/lakefront/p/17362011.html

相关文章

  • 【图文详解】一文全面彻底搞懂HBase、LevelDB、RocksDB等NoSQL背后的存储原理:LSM-tree
    LSM树广泛用于数据存储,例如RocksDB、ApacheAsterixDB、Bigtable、HBase、LevelDB、ApacheAccumulo、SQLite4、Tarantool、WiredTiger、ApacheCassandra、InfluxDB和ScyllaDB等。在这篇文章中,我们将深入探讨LogStructuredMergeTree,又名LSM树:许多高度可扩展的NoSQL分......
  • golang常用的http请求操作
    之前用python写各种网络请求的时候写的非常顺手,但是当打算用golang写的时候才发现相对来说还是python的那种方式用的更加顺手,习惯golang的用法之后也就差别不大了,下面主要整理了常用的通过golang发起的GET请求以及POST请求的代码例子golang发起GET请求基本的GET请求//基本的GE......
  • (四) DOS的原理和相关指令
    目录DOS介绍常见的DOS命令创建删除文件夹列出当前目录内容切换目录列出字文件夹清屏DOS介绍DOS:DiskOpreatingSystem磁盘操作系统常见的DOS命令创建删除文件夹mdG:\\tmp#创建一个叫tmp的文件夹rdG:\tmp#删除G盘tmp文件夹列出当前目录内容dird:\abc#列......
  • redis之持久化方案,主从复制,哨兵高可用,集群原理及搭建,缓存优化
    目录redis之持久化方案,主从复制,哨兵高可用,集群原理及搭建,缓存优化昨日内容回顾今日内容详细1持久化方案1.1RDB1.2aof方案1.3混合持久化2主从复制原理和方案3哨兵高可用4集群原理及搭建4.1集群搭建4.2集群扩容4.3集群缩容5缓存优化5.1redis缓存更新策略5.2缓存穿透击......
  • Golang每日一库之bcrypt
    本文官方文档:https://pkg.go.dev/golang.org/x/crypto/bcrypt前言之前讲过JWTTokenhttps://www.cnblogs.com/zichliang/p/17303759.htmlJWT呢是信息是经过数字签名的,因此可以被验证和信任。然后今天就来说说密码学,我们在做鉴权做用户处理时会把密码存储到数据库中,但是......
  • 在Golang中使用Testify mock框架
    1.前言2.实现代码3.Mock和测试4.Mock无参方法5.Mock带参数的方法6.Mock带参数的方法,但是参数具体内容非测试重点7.Mock带参数的方法,并校验实际参数8.Mockery9.参考1.前言我使用golang已经有一段时间了,但直到最近我才终于明白如何在golang测试中进行对象......
  • Redis——cluster集群原理
    摘要在redis3.0之前,redis使用的哨兵架构,它借助sentinel工具来监控master节点的状态;如果master节点异常,则会做主从切换,将一台slave作为master。当master挂掉的时候,sentinel会选举出来一个master,选举的时候是没有办法去访问Redis的,会存在访问瞬断的情况;若是在电商网站大......
  • Golang单元测试
    1.前言2.先决条件3.创建单元测试的示例程序4.创建单元测试5.使用gotest运行测试6.Table-driven的单元测试7.测试覆盖率8.Go基准测试9.为代码写示例10.总结11.参考文档1.前言原文:HowToWriteUnitTestsinGoAuthor:TobiBalogun译者:philoenglis......
  • golang1.6版本json包解析嵌套指针的问题小记
    指针的指针问题本地跑的好好的,测试环境跑的好好,预发布环境(准线上环境),跪了。起因就是:1a:=&struct{s:""}2json.Unmarshal([]byte{},&a)3fmt.Println(a.s)//报错行第一行代码进行&取地址,获得指针变量。第二行代码,进行json解析的时候,传入了&a, 指针的指针,a到了jso......
  • Golang 并发&同步的详细原理和使用技巧
    Golang并发概要说明并发模型Golang的并发模型属于一种很典型的CSP(communicatingsequentialprocesses)并发模型,其核心是不要通过共享内存来通信,而应该通过通信来共享内存。具体实现,就是通过goroutine来实现并发,然后并发的goroutine之间通过Channel来进行通信;为此,Gola......