go学习

Goroutine原理

2016-11-22  本文已影响301人  SunFrost

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

上一篇 下一篇

猜你喜欢

热点阅读