Gorutine 的9种状态

关于go协程的代码存于src/runtime/runtime2.go中
,这里存储了关于go协程GMP调度的相关结构体,包括 G,M和P对应的结构体以及全局调度器schedule。

github地址:https://github.com/golang/go/blob/master/src/runtime/runtime2.go

iota

iota是go语言的常量计数器,只能在常量的表达式中使用。 iota在const关键字出现时将被重置为0。const中每新增一行常量声明将使iota计数一次(iota可理解为const语句块中的行索引)。 使用iota能简化定义,在定义枚举时很有用

G的状态

const(
    _Gidle = iota // 0 
    // 没有执行代码,没有栈的所有权,存储在运行队列中
    _Grunnable // 1 
    // 可以执行代码,拥有栈的所有权,被赋予了内核线程 M 和处理器 P
    _Grunning // 2 
    // 正在执行系统调用,拥有栈的所有权,没有执行用户代码,
    // 被赋予了内核线程 M 但是不在运行队列上
    _Gsyscall // 3 
    // 由于运行时而被阻塞,没有执行用户代码并且不在运行队列上,
    // 但是可能存在于 Channel 的等待队列上
    _Gwaiting // 4  
    //_Gmoribund_unused 当前未使用,但在 gdb 中硬编码脚本
     _Gmoribund_unused // 5
    // 表示当前goroutine没有被使用,没有执行代码,可能有分配的栈
    _Gdead // 6  
    //_Genqueue_unused当前未使用
    _Genqueue_unused // 7
    // 栈正在被拷贝,没有执行代码,不在运行队列上
    _Gcopystack // 8 
    // 由于抢占而被阻塞,没有执行用户代码并且不在运行队列上,等待唤醒
    _Gpreempted // 9 
    // GC 正在扫描栈空间,没有执行代码,可以与其他状态同时存在
    	_Gscan          = 0x1000
    	_Gscanrunnable  = _Gscan + _Grunnable  // 0x1001
		_Gscanrunning   = _Gscan + _Grunning   // 0x1002
		_Gscansyscall   = _Gscan + _Gsyscall   // 0x1003
		_Gscanwaiting   = _Gscan + _Gwaiting   // 0x1004
		_Gscanpreempted = _Gscan + _Gpreempted // 0x1009
    
    )
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值