Goroutine原理

作者: SunFrost | 来源:发表于2016-11-22 13:11 被阅读301次

    Goroutine

    两篇很好的文章:

    http://morsmachine.dk/go-scheduler

    http://www.nyankosama.com/2015/04/03/java-goroutine/

    goroutine和传统的coroutine有所区别,goroutine不主动让出控制权,而是在有blocking call的情况下由scheduler取走控制权,例如io或者channel  send。所以如果在goroutine中加入一个spin lock,它就会一直占用cpu不会让出。

    几个概念:

    M: OS的native thread

    P: 代表调度的一个context,在runtime的代码中被称为processor

    G: goroutine

    每一个goroutine都被加入到某个context(P)的run queue上,context在当前groutine被阻塞时会被移到一个新创建(或已有的线程池中的一个)的系统线程上。而阻塞的syscall继续在当前线程上运行,调用阻塞syscall的goroutine会被设为waiting状态,并将控制权交给scheduler继续调度,syscall的返回状态通过channel进行同步。

    go已将将所有system call都wrap到了标准库中,在针对这些system call进行调用时会主动标记goroutine为阻塞状态并保存现场,交由scheduler执行。

    相关文章

      网友评论

        本文标题:Goroutine原理

        本文链接:https://www.haomeiwen.com/subject/debppttx.html