go语言学习笔记:goroutine调度

1. go语言中协程怎么调度? 怎么保证公平且高效的调度?  C语言中协程都是在进程中自行控制协程的调入和调出。

      ------应该是这样的,go语言把系统调用都进行了封装,因为系统调用肯定会阻塞,所以它可以在系统调用的时候进行协程的重新调度。

      ------具体的说是这样的,当协程进行系统调用的时候,它把自己的上下文(协程列表和一些context之类的东西)给另外的一个新线程,然后自己仍然使用当前的线程执行系统调用。系统调用只是线程的栈变成了内核态而已,CPU一样在跑,线程一样在运行。  这么一来协程看起来不会阻塞,因为总有线程带着它运行(当然协程多了会有排队)。

2. go语言中使用协程,但是我们系统确实以线程为调度单位,那怎么解决充分利用CPU的问题呢? 有可能我创建了很多协程,导致一个线程跑到100%,我怎么确认我是否需要再启动一个线程呢?

       ------这显然是受到C语言中协程的影响。 go中的协程数和上下文数是可以自行设定的。 也就是说具体有多少个线程在跑是go调度器和参数来控制的,并不需要开发者过多操心。

3. 为什么go语言要实现协程调度器?

    a. 线程切换开销比较大。

    b. OS 的调度,程序不可控。而 Go GC 需要停止所有的线程,使内存达到一致状态。

posted @ 2017-12-12 16:44  你的KPI完成了吗  阅读(80)  评论(0)    收藏  举报