Go底层剖析
文章平均质量分 90
stackfuture
这个作者很懒,什么都没留下…
展开
-
Go并发调度进阶-循环调度,不是你理解的死循环
Go并发调度进阶3. 循环调度所有的GMP初始化工作都已经完成了,是时候启动运行时调度器了。我们已经知道,当所有准备工作都完成后, 最后一个开始执行的调用就是runtime.mstart了。mstart主要功能:确定执行栈的边界启动mstart1设置退出线程标记osStack=true调用mexit(osStack)退出线程再来看下mstart1:如果当前m并非m0,那么要求绑定p开始调用schedule()开始调度所以我们可以看到调度循环schedule无法返回,因此最后一个mexit目前还不会被执行,因原创 2022-01-09 12:21:51 · 464 阅读 · 0 评论 -
Go并发调度进阶-GMP初始化,最难啃的有时候耐心看完还是很简单的
Go并发调度进阶2. GMP初始化1. M的初始化M 只有自旋和非自旋两种状态。自旋的时候,会努力找工作;找不到的时候会进入非自旋状态,之后会休眠,直到有工作需要处理时,被其他工作线程唤醒,又进入自旋状态。// src/runtime/proc.gofunc mcommoninit(mp *m, id int64) { _g_ := getg() ... lock(&sched.l原创 2022-01-07 16:11:12 · 322 阅读 · 0 评论 -
Go并发调度-调度器设计理念从何而来?为何如此高效?
Go并发调度进阶1. 调度器的基本设计原则和概念我们首先了解一下调度器的设计原则及一些基本概念来建立对调度器较为宏观的认识。理解调度器涉及的主要概念包括以下三个:G: Goroutine,即我们在 Go 程序中使用 go 关键字创建的执行体;M: Machine,或 worker thread,即传统意义上进程的线程;P: Processor,即一种人为抽象的、用于执行 Go 代码的处理器。只有当 M 与一个 P 关联后才能执行 Go 代码。除非 M 发生阻塞或在进行系统调用时间过长时,没有与之关联的 P。原创 2021-12-30 14:56:21 · 238 阅读 · 0 评论