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执行。