description: 第一难,金蝉遭贬;正如即将踏入面试场的我们,就像金蝉一样,要不断的面临各种困难,因此呢,我们有这一段开始

一、何为调度器?

  1. 从总体上来说,调度器是对一种goroutine的管理宗旨。
  2. 它就像什么呢?就像当年悟空打上天庭的时候,托塔李天王派人去抓悟空,
  3. 那么这个托塔李天王他就正如调度器一样,合理的去利用手上的这些天兵天将去抓住孙悟空。
  4. 因此呢,托塔李天王在其中起到好几种作用。
  5. 1步,他要把他的思维连接到每一个物理上的天兵上的这些资源。
  6. 2步,要分配好,哪些天兵先去抓,哪些天兵做哪些安排。
  7. 3步,让天兵去执行这些操作。
  8. 对应到我们这个调度器里面。
  9. 1点,调度器它需要一连接到系统的资源。这里有一个小小的说法,我们知道很多语言包括我们的go语言,
  10. 他从刚开始只能支持一小部分的系统,到可以支持大部分系统。
  11. 这个事件上,主要是由于他们需要一些系统上的指令集的支持。
  12. 所以go语言在对各类系统上支持是逐步从小慢慢的变大的。
  13. 2点,调度器需要像托塔李天王一样做到分配Goroutine的执行顺序,用来保证goroutine能够快速地被完成。
  14. 3点,由它去执行goroutine。这里值得简单阐述一点,goroutine它并不是一个物理上的单元,
  15. 它是一个逻辑单元。 我们在免费课中有讲到计算机系统里的物理单元只有进程和线程。
  16. goroutine它属于一种协程,所以它是一种逻辑上的结构体,并不是物理上的结构体,
  17. 这个在面试中很常见的,面试官会问到,因此呢,小伙伴们要清晰地注意到这一点。

二、调度器的组成

  1. 调度器它主要分为两部分组成,第1部分数据结构、第2部分算法。
  2. 在数据结构上,他是把具体的问题进行抽象,就像java语言里面的我们把一个具体的物体抽象成类,
  3. 或者是像go语言里面的,我们把具体的物体出让成struct,即结构体。
  4. 然后呢,我们需要一些算法,比如说我们在学生期间数据结构书里面常会学到的,
  5. 先来先服务FCFS算法、先进先出FIFO算法之类的等等。
  6. 在我们go语言调度器里面,它用到了SRTF算法,也就是最短剩余时间优先算法。
  7. SRTF算法和SJF最短作业优先算法等,这些都是启发式的贪心类的算法。
  8. 所以实质上,调度器它是由结构体加一些基本逻辑进行实现的。
  9. 按照这些逻辑,大家也可以认为是,在我们的日常开发过程中的一些业务逻辑之类等等,
  10. 只不过它这个业务逻辑它针对了系统的各类调用,并不是像我们针对真实的业务。

三、调度器的历史版本

  1. 我们其实知道很多计算机语言它的早期基本上是由c/c++来实现的,为什么呢?
  2. 因为最基础跑得最快的语言就是c/c++,像java语言或者是python语言,他们早期底层都是用c/c++写的。
  3. go语言,在早期也是用c/c++写的,但实际上到后期go语言的大部分都从c/c++转换到了go语言。
  4. 具体的迭代版本变更,我们可以从PPT中,很明显的感觉到。
  5. Go语言它从1.4版本就逐步的变为几乎全部的go代码。所以呢,我们这里有个很明显的时间分界点。
  6. 大约在201311月份之前,go语言版本中使用c/c++语言写的调度器。
  7. 但是,2020年开始,我们都开始使用go语言本身去写这些调度器。
  8. 201311月份之前,go语言版本根据迭代周期,
  9. 分为单线程调度器、多线程调度器、GMP调度器以及伪争抢调度器。
  10. 201311月之后的go语言版本中,实现了真争抢调度器,以及未来可能要实现的NUMA调度器。
  11. NUMA调度器,它实际上是一个社区版的设计图,它还未成为真正的一个调度器。
  12. 我们将在后面的小节中,给大家诠释什么叫NUMA调度器,它是一个非常的符合硬件底层的调度器。
  13. 这其中有一个小小的知识点。当我们从1.1.2版本也就是GMP调度器开始,它是一个非常有特色的转折点。
  14. 所以,在GMP调度器的时候我们会着重了提到他有哪些转折点。