goroutine的调度是出现在什么情况下,调度时做了什么

参考解析

题目来源:京东

答案:

Go调度器会在以下三种情况对goroutine进行调度:

  1. goroutine执行某个操作因条件不满足需要等待而发生的调度。

  2. goroutine主动调用Gosched()让出CPU而发生的调度。

  3. goroutine运行时间太长或长时间处于系统调用中,被调度器剥夺运行权而发生的调度。

调度器一般做以下事:

  • 协程调度。因为系统内核不能再决定协程的切换,那么协程的切换时间点则是由程序内部的调度器决定的。
  • 垃圾回收。垃圾回收的必要条件是内存位于一致状态,这就需要暂停所有的线程,如果交给系统去做,那么会暂停所有的线程使其一致。程序自身的调度器知道什么时候内存位于一致状态,那么就没有必要暂停所有运行的协程。