go高级进阶:goroutine的创建、休眠与恢复


本文摘自网络,作者,侵删。

goroutine切换

goroutine在go代码中无处不在,go程序会根据不同的情况去调度不同的goroutine,一个goroutine在某个时刻要么在运行,要么在等待,或者死亡。
goroutine的切换一般会在以下几种情况下发生:

  1. 基于信号抢占式的调度,一个goroutine如果运行很长,会被踢掉
  2. 发生系统调用,系统调用会陷入内核,开销不小,暂时解除当前goroutine
  3. 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再去调度...

阅读剩余部分

相关阅读 >>

Golang slice 的一些事

Go的值类型和引用类型2——内存分配规则

Golang核心编程

手撸Golang 行为型设计模式 中介者模式

手撸Golang 架构设计原则 合成复用原则

Golang怎么判断数组是否为空

Golang select

型模式

Golang通用链接池的实现

杂七杂八的一些备忘

更多相关阅读请进入《Go》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...

    正在狠努力加载,请稍候...