美文网首页
Go GPM 模型

Go GPM 模型

作者: 晚歌歌 | 来源:发表于2022-03-08 16:46 被阅读0次

GPM 模型

golang 在系统调度的基础上实现了自己的 goroutine 调度器,即 GPM 模型。goroutine 相比线程更加轻量,GPM 调度器效率更高,因此 go 可以有很强的并发能力


image.png

G:goroutine
P:Processor,相当于 G 的CPU,数量等于 GOMAXPROC
M:执行 G 的线程
GPM 简单原理:

每个 P 都有一个局部队列,负责保存待执行的 G,当局部队列满了就放到全局队列中

每个 P 都有一个 M 绑定,正常情况下 M 从局部队列中获取 G 执行

M 可以从其他队列偷取 G 执行(work stealing),也可以从全局队列获取 G 执行

当 G 因系统调用(syscall)阻塞时会阻塞 M,此时 P 会和 M 解绑(hand off),并寻找新的空闲 M,若没有空闲 的M 就会新建一个 M

当 G 因 channel 或者 network I/O 阻塞时,不会阻塞 M,M 会寻找其他 runnable 的 G;当阻塞的 G 恢复后会重新进入 runnable 进入 P 队列等待执行

mcache(内存分配状态)位于 P,所以 G 可以跨M调度,不再存在跨 M 调度局部性差的问题

G 是抢占调度。不像操作系统按时间片调度线程那样,Go 调度器没有时间片概念,G 因阻塞和被抢占而暂停,并且 G只能在函数调用时有可能被抢占,极端情况下如果 G 一直做死循环就会霸占一个 P 和 M,Go 调度器也无能为力。

GODEBUG

使用 GODEBUG 可以查看 Go 调度器的实际过程:

#含义就是每1000ms,打印输出一次goroutine scheduler的状态
GODEBUG=schedtrace=1000 ./goutils 

#输出
gomaxprocs:P 的数量

idleprocs:空闲的 P

threads:总线程数

spinningthreads:自旋线程数

idlethreads:空闲线程数

runqueue:全局队列中 G 的数目

[2 3 3 2 1 1 2 1]:局部队列中 G 的数目

相关文章

  • Go GPM 模型

    GPM 模型 golang 在系统调度的基础上实现了自己的 goroutine 调度器,即 GPM 模型。goro...

  • 2019-03-20

    1. go的并发调度模型? go的并发调度模型可以简称为GPM模型,其中G代表goroutine,P代表gorou...

  • GPM模型

    Go 调度器模型我们通常叫做GPM 模型,包括 4 个重要结构: G:Goroutine,每个 Goroutine...

  • Go调度相关

    go 调度go routinue在线程中进行调度 GPM的概念: G(Goroutine): 即Go协程,每个go...

  • GPM调度模型

    目录 1.什么是进程调度2.并发与并行3.进程、线程与协程4.Golang的调度机制——GPM模型5.总结 1. ...

  • Golang GPM 模型剖析

    本文使用 golang 1.17 代码,如有任何问题,还望指出。 线程、内核线程和用户线程区别 线程:从内核角度来...

  • day08-go.GPM

    当别人到go为什么支持高并发,或者问为什么go本身对并发编程友好?以及go与Java对比的并发对比 正确回答: 在...

  • 为Arch Linux添加鼠标支持(gpm)

    gpm的安装 在Arch Linux中安装gpm$ pacman -S gpm 如果你正在使用触控板,需要安装一下...

  • centos6 最小化系统:安装图形桌面

    Gnome KDE Optional gpm

  • GO语言初级学习之代码案例08(生产者消费者模型)

    GO语言初级学习之代码案例08-生产者消费者模型 @(go语言 黑马)[GO语言] 条件变量模拟生产者消费者模型 ...

网友评论

      本文标题:Go GPM 模型

      本文链接:https://www.haomeiwen.com/subject/gtbarrtx.html