关于go:Go题库5Go的GMP模型

2次阅读

共计 995 个字符,预计需要花费 3 分钟才能阅读完成。

面试企业 深服气,百度,小米,哔哩哔哩,好将来,跟谁学,学而思,网易,腾讯,知乎,高德,字节,,新浪,虾皮,Aibee。

题目解析 GOLANG ROADMAP 社区

答案(溪尾)

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 种类型的队列:

  • 本地队列:本地的队列是无锁的,没有数据竞争问题,处理速度比拟高。
  • 全局队列:是用来均衡不同的 P 的工作数量,所有的 M 共享 P 的全局队列。

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

  • 被动开释(active release):典型的例子是,执行 G 工作时,产生了零碎调用(system call),这时 M 会处于阻塞(Block)状态。调度器会设置一个超时工夫,来开释 P。
  • 被动开释(passive release):如果零碎调用产生,监控程序须要扫描处于阻塞状态的 P /M。这时,超时之后,P 资源会回收,程序被安顿给队列中的其余 G 工作。
正文完
 0