go语言学习笔记:goroutine调度
1. go语言中协程怎么调度? 怎么保证公平且高效的调度? C语言中协程都是在进程中自行控制协程的调入和调出。
------应该是这样的,go语言把系统调用都进行了封装,因为系统调用肯定会阻塞,所以它可以在系统调用的时候进行协程的重新调度。
------具体的说是这样的,当协程进行系统调用的时候,它把自己的上下文(协程列表和一些context之类的东西)给另外的一个新线程,然后自己仍然使用当前的线程执行系统调用。系统调用只是线程的栈变成了内核态而已,CPU一样在跑,线程一样在运行。 这么一来协程看起来不会阻塞,因为总有线程带着它运行(当然协程多了会有排队)。

2. go语言中使用协程,但是我们系统确实以线程为调度单位,那怎么解决充分利用CPU的问题呢? 有可能我创建了很多协程,导致一个线程跑到100%,我怎么确认我是否需要再启动一个线程呢?
------这显然是受到C语言中协程的影响。 go中的协程数和上下文数是可以自行设定的。 也就是说具体有多少个线程在跑是go调度器和参数来控制的,并不需要开发者过多操心。
3. 为什么go语言要实现协程调度器?
a. 线程切换开销比较大。
b. OS 的调度,程序不可控。而 Go GC 需要停止所有的线程,使内存达到一致状态。

浙公网安备 33010602011771号