本文摘自网络,作者,侵删。
goroutine切换
goroutine在go代码中无处不在,go程序会根据不同的情况去调度不同的goroutine,一个goroutine在某个时刻要么在运行,要么在等待,或者死亡。
goroutine的切换一般会在以下几种情况下发生:
- 基于信号抢占式的调度,一个goroutine如果运行很长,会被踢掉
- 发生系统调用,系统调用会陷入内核,开销不小,暂时解除当前goroutine
- channel阻塞,当从channel读不到或者写不进的时候,会切换goroutine
关于go的调度可以阅读golang 如何调度你的程序的
管理员-g0
go程序中,每个M都会绑定一个叫g0的初代goroutine,它在M的创建的时候创建,g0的主要工作就是goroutine的调度、垃圾回收等。g0和我们常规的goroutine的任务不同,g0的栈是在主线程栈上分配的,并且它的栈空间有64k,m0是runtime创建第一个线程,然后m0关联一个本地的p,就可以运行g0了。在g0的栈上不断的调度goroutine来执行,当有新的goroutine关联p准备运行发现没有m的时候,就会去创建一个m,m再关联一个g0,g0再去调度...
相关阅读 >>
更多相关阅读请进入《Go》频道 >>

Go语言101
一个与时俱进的Go编程知识库。