, 没有栈的所有权, 存储在运行队列中
_Grunning 可以执行代码, 拥有栈的所有权, 被赋予了内核线程 M 和处理器 P
_Gsyscall 正在执行系统调用, 拥有栈的所有权, 没有执行用户代码...可运行: 表示当前Goroutine在等待某个M执行其指令, 如果当前程序中有非常多都Goroutine, 每个Goroutine就可能会等待更多都时间....灰色的协程表示状态为等待中, 即没有执行代码, 没有栈的所有权, 等待在运行队列中. 当Go程序中执行到go表达式时, 协程会被添加到运行队列的队尾....线程需要频繁加锁去获取等待执行的协程. 因此当拥有多核的机器时, 当时的goroutine的性能并不理想.
系统调用
?
为什么我们不舍弃上下文(P), 将运行队列直接挂载到线程....需要注意的是, 如果协程调用网络I/O, 会从线程中脱离出来并放入运行时集成的网络poller中, 当poller表示网络的读写操作完成后, 这个协程会回到上下文环境并完成后续工作.
窃取工作
?