description: 第一难,金蝉遭贬;正如即将踏入面试场的我们,就像金蝉一样,要不断的面临各种困难,因此呢,我们有这一段开始
一、何为调度器?
从总体上来说,调度器是对一种goroutine的管理宗旨。
它就像什么呢?就像当年悟空打上天庭的时候,托塔李天王派人去抓悟空,
那么这个托塔李天王他就正如调度器一样,合理的去利用手上的这些天兵天将去抓住孙悟空。
因此呢,托塔李天王在其中起到好几种作用。
第1步,他要把他的思维连接到每一个物理上的天兵上的这些资源。
第2步,要分配好,哪些天兵先去抓,哪些天兵做哪些安排。
第3步,让天兵去执行这些操作。
对应到我们这个调度器里面。
第1点,调度器它需要一连接到系统的资源。这里有一个小小的说法,我们知道很多语言包括我们的go语言,
他从刚开始只能支持一小部分的系统,到可以支持大部分系统。
这个事件上,主要是由于他们需要一些系统上的指令集的支持。
所以go语言在对各类系统上支持是逐步从小慢慢的变大的。
第2点,调度器需要像托塔李天王一样做到分配Goroutine的执行顺序,用来保证goroutine能够快速地被完成。
第3点,由它去执行goroutine。这里值得简单阐述一点,goroutine它并不是一个物理上的单元,
它是一个逻辑单元。 我们在免费课中有讲到计算机系统里的物理单元只有进程和线程。
goroutine它属于一种协程,所以它是一种逻辑上的结构体,并不是物理上的结构体,
这个在面试中很常见的,面试官会问到,因此呢,小伙伴们要清晰地注意到这一点。
二、调度器的组成
调度器它主要分为两部分组成,第1部分数据结构、第2部分算法。
在数据结构上,他是把具体的问题进行抽象,就像java语言里面的我们把一个具体的物体抽象成类,
或者是像go语言里面的,我们把具体的物体出让成struct,即结构体。
然后呢,我们需要一些算法,比如说我们在学生期间数据结构书里面常会学到的,
先来先服务FCFS算法、先进先出FIFO算法之类的等等。
在我们go语言调度器里面,它用到了SRTF算法,也就是最短剩余时间优先算法。
SRTF算法和SJF最短作业优先算法等,这些都是启发式的贪心类的算法。
所以实质上,调度器它是由结构体加一些基本逻辑进行实现的。
按照这些逻辑,大家也可以认为是,在我们的日常开发过程中的一些业务逻辑之类等等,
只不过它这个业务逻辑它针对了系统的各类调用,并不是像我们针对真实的业务。
三、调度器的历史版本
我们其实知道很多计算机语言它的早期基本上是由c/c++来实现的,为什么呢?
因为最基础跑得最快的语言就是c/c++,像java语言或者是python语言,他们早期底层都是用c/c++写的。
go语言,在早期也是用c/c++写的,但实际上到后期go语言的大部分都从c/c++转换到了go语言。
具体的迭代版本变更,我们可以从PPT中,很明显的感觉到。
Go语言它从1.4版本就逐步的变为几乎全部的go代码。所以呢,我们这里有个很明显的时间分界点。
大约在2013年11月份之前,go语言版本中使用c/c++语言写的调度器。
但是,2020年开始,我们都开始使用go语言本身去写这些调度器。
在2013年11月份之前,go语言版本根据迭代周期,
分为单线程调度器、多线程调度器、GMP调度器以及伪争抢调度器。
在2013年11月之后的go语言版本中,实现了真争抢调度器,以及未来可能要实现的NUMA调度器。
NUMA调度器,它实际上是一个社区版的设计图,它还未成为真正的一个调度器。
我们将在后面的小节中,给大家诠释什么叫NUMA调度器,它是一个非常的符合硬件底层的调度器。
这其中有一个小小的知识点。当我们从1.1.2版本也就是GMP调度器开始,它是一个非常有特色的转折点。
所以,在GMP调度器的时候我们会着重了提到他有哪些转折点。