😥 整理不易,此资源只针对正式星主开放,
还请入驻星球后再来观看。

GOLANG ROADMAP

阅读模式

  • 沉浸
  • 自动
  • 日常
首页
Go友会
  • 城市
  • 校园
Go学院
  • Go小课
  • Go小考
  • Go实战
  • 精品课
Go求职
  • 求职辅导🔥
  • Offer收割社群
  • 企业题库
  • 面试宝典
Go宝典
  • 在线宝典
  • B站精选
  • 推荐图书
  • 每日博文
Go仓库
实验区
  • Go周边
  • Go下载
  • Go月刊
消息
更多
  • 用户中心

    • 我的信息
    • 推广返利
  • 玩转星球

    • 星球介绍
    • 角色体系
    • 星主权益
  • 支持与服务

    • 联系星主
    • 成长记录
    • 常见问题
    • 吐槽专区
  • 合作交流

    • 渠道合作
    • 课程入驻
    • 友情链接
author-avatar

GOLANG ROADMAP


首页
Go友会
  • 城市
  • 校园
Go学院
  • Go小课
  • Go小考
  • Go实战
  • 精品课
Go求职
  • 求职辅导🔥
  • Offer收割社群
  • 企业题库
  • 面试宝典
Go宝典
  • 在线宝典
  • B站精选
  • 推荐图书
  • 每日博文
Go仓库
实验区
  • Go周边
  • Go下载
  • Go月刊
消息
更多
  • 用户中心

    • 我的信息
    • 推广返利
  • 玩转星球

    • 星球介绍
    • 角色体系
    • 星主权益
  • 支持与服务

    • 联系星主
    • 成长记录
    • 常见问题
    • 吐槽专区
  • 合作交流

    • 渠道合作
    • 课程入驻
    • 友情链接
  • Go真实面试题汇总系列

    • 《调度模型篇》
  • 宝典内容

    • 5.Go的GMP模型?
    • 22. 讲一讲 GMP 模型
    • 42. gmp当一个g堵塞时,g、m、p会发生什么
    • 63. golang并发模型
    • 64. golang gmp模型,全局队列中的G会不会饥饿,为什么?P的数量是多少?能修改吗?M的数量是多少?
    • 67. 服务器能开多少个M由什么决定
    • 68. 服务器能开多少个P由什么决定
    • 69. M和P是怎么样的关系
    • 70. 同时启动了一万个G,如何调度?
    • 99. P和M的数量一定是1:1吗?如果一个G阻塞了会怎么样?
    • 112. 看你会golang,讲下go的协程模型?(GPM模型)
    • 121. GMP中,M的数量怎么控制,P呢?
    • 129. 知道go的抢占式调度吗?goroutine泄漏?
    • 162. 为什么 GPM 模型会更快
    • 165. golang怎么操作内核线程
    • 174. 为什么P的local queue可无锁访问,任务窃取的时候要加锁吗?
    • 199. GPM调度模型
    • 224. 一个协程挂起换入另外一个协程是什么过程?
    • 229. go语言中的GMP、defer、匿名defer函数、defer执行流程
    • 234. 协程底层怎么实现?
    • 235. go的调度
    • 282. GMP并发模型 goroutine切换的时候上下文环境放在哪里
    • 285. golang的MPG模型,goroutine和线程的区别
    • 344. golang调度能不能不要p
    • 353. 介绍go语言的gmp协程调度模
    • 396. Go如何调度,假设4核的cpu应该有几个线程或者说有几个M,那能有几个groutinue,groutinue数量的上限是多少?
    • 402. gmp模型中一定要有p吗
    • 403. 了解gmp模型的全局队列和本地队列吗
    • 428. go调度中阻塞都有那些方式
    • 434. gmp具体的调度策略

😥 整理不易,此资源只针对正式星主开放,
还请入驻星球后再来观看。

5.Go的GMP模型?


企业题库解析小组

题目序号:(3979,9,31,98,152,218,486,637,651,694,739,819,863,917,937,1216,1674,1865,2298,2708,3285,3303,3602,5117,5164,5443,5678,5654,6065,6370,6551、2360)

**题目来源:**深信服,百度,小米,哔哩哔哩,好未来,跟谁学,学而思,网易,腾讯,知乎,高德,字节,,新浪,虾皮,Aibee。

频次: 32

答案1:(溪尾)

G是Goroutine的缩写,相当于操作系统的进程控制块(process control block)。它包含:函数执行的指令和参数,任务对象,线程上下文切换,字段保护,和字段的寄存器。

M是一个线程,每个M都有一个线程的栈。如果没有给线程的栈分配内存,操作系统会给线程的栈分配默认的内存。当线程的栈制定,M.stack->G.stack, M的PC寄存器会执行G提供的函数。

P(处理器,Processor)是一个抽象的概念,不是物理上的CPU。当一个P有任务,需要创建或者唤醒一个系统线程去处理它队列中的任务。P决定同时执行的任务的数量,GOMAXPROCS限制系统线程执行用户层面的任务的数量。

GO调度器的调度过程,首先创建一个G对象,然后G被保存在P的本地队列或者全局队列(global queue)。这时P会唤醒一个M。P按照它的执行顺序继续执行任务。M寻找一个空闲的P,如果找得到,将G与自己绑定。然后M执行一个调度循环:调用G对象->执行->清理线程->继续寻找Goroutine。

在M的执行过程中,上下文切换随时发生。当切换发生,任务的执行现场需要被保护,这样在下一次调度执行可以进行现场恢复。M的栈保存在G对象中,只有现场恢复需要的寄存器(SP,PC等),需要被保存到G对象。

如果G对象还没有被执行,M可以将G重新放到P的调度队列,等待下一次的调度执行。当调度执行时,M可以通过G的vdsoSP, vdsoPC 寄存器进行现场恢复。

P队列 P有2种类型的队列:

  1. 本地队列:本地的队列是无锁的,没有数据竞争问题,处理速度比较高。
  2. 全局队列:是用来平衡不同的P的任务数量,所有的M共享P的全局队列。

线程清理 G的调度是为了实现P/M的绑定,所以线程清理就是释放P上的G,让其他的G能够被调度。

  1. 主动释放(active release):典型的例子是,执行G任务时,发生了系统调用(system call),这时M会处于阻塞(Block)状态。调度器会设置一个超时时间,来释放P。
  2. 被动释放(passive release):如果系统调用发生,监控程序需要扫描处于阻塞状态的P/M。 这时,超时之后,P资源会回收,程序被安排给队列中的其他G任务。