Go高级看这一篇就够了

引言

走完进阶后的一个最大感受是能把调度做好很难,跟现实中高级工程师一样,站在工程的角度看待设计、处理问题和调度资源。

这里只是搬过来,详细的描述请移步到他们的公众号或者博客,谢谢。
【go程序是怎么跑起来的】
【饶神公众号关于调度的十个系列】

铺垫

  • 【官方】

  • 【 码农桃花源】

  • 【飞雪无情】

  • 【曹春晖】

  • 【go应该看的书】

  • 【go 夜读栏目】

  • 三个角度区别goroutine和线程:内存消耗、创建与销毀、切换

  • M:N 模型
    Go高级看这一篇就够了_第1张图片

  • 什么是scheduler
    Go高级看这一篇就够了_第2张图片

  • 为什么需要scheduler以及它是怎么做到的
    目标:For scheduling goroutines onto kernel threads.
    核心思想是:

1.reuse threads;
2.限制同时运行(不包含阻塞)的线程数为 N,N 等于 CPU 的核心数目;
3.线程私有的 runqueues,并且可以从其他线程 stealing goroutine 来运行,线程阻塞后,可以将 runqueues 传递给其他线程。

核心内容主要包括:

1、GPM 的初始化

Go高级看这一篇就够了_第3张图片

2、M 是怎样一步步找工作

3、用户栈和 g0 栈的切换

Go高级看这一篇就够了_第4张图片

4、schedule 的调度循环是怎样运转的

Go高级看这一篇就够了_第5张图片

5、监控线程( sysmon)做了什么

  • 抢占处于系统调用的 P,让其他 m 接管它,以运行其他的 goroutine。

  • 将运行时间过长的 goroutine 调度出去,给其他 goroutine 运行的机会。

6、宏观状态转换

  • G:
    Go高级看这一篇就够了_第6张图片
  • P:
    Go高级看这一篇就够了_第7张图片
  • M:
    Go高级看这一篇就够了_第8张图片

小结

他的系列文章中看的最明白的是1和10,因为中间的编译分析大多没看懂。基本思想理解了,主要是想参看源码是怎么从代码的角度去实现这种思想的。

【欧神出版对go源码的解读】

【曹神出版从plan9对源码】

你可能感兴趣的:(Go)