go 源码分析 goroutine 概览与调度

goroutine

以后都在 github 更新,请戳 Goroutine–概览与调度

目录

相关位置文件

概览

调度

为什么

触发时机

更多资料

相关位置文件

  • src/runtime/runtime2.go
  • src/runtime/proc.go
  • src/plugin/plugin_dlopen.go

概览

如果你对 MPG 在Go协程调度中代表什么并且是如何工作的 感到疑惑, 请先参考 更多资料 中的 scheduling-in-go-part1scheduling-in-go-part3

根据上述文章以及 Go 源码中的注释

M

操作系统线程, ‘M’ 是 machine 的简写, 这个线程其实是被操作系统调度的, 并且操作系统仍然负责把线程调度到某个核心上运行

P

逻辑处理器, 执行 Go 代码的时候, 必须要获得的资源. M 必须拥有与之相关联的 P 才能执行 Go 代码. 但是 M 不论在是否存在与之对应的 P 的时候, 都能被阻塞住或者卡在系统调用中

G

一个 Goroutine 就是一个 协程, 但是这是 Go, 所以我们把字母 “C”(Coroutine) 替换成 “G”(Goroutine), 你可以把 Goroutine 当成应用级别的线程, 他们和系统级别的线程在很多地方都非常相似, 只是说操作系统的线程是在 CPU 核心上进行上下文切换(切入切出), 而 Goroutine 是在 M 上进行上下文切换(切入切出)

mpg

图片来自 scheduling-in-go-part2

# GOSSAFUNC=main GOOS=linux GOARCH=amd64 go build -gcflags "-S" simple.go
# GOSSAFUNC=main go_dev build -gcflags "-S" num_cpu.go
# GODEBUG=schedtrace=DURATION,gctrace=1 go_dev run num_cpu.go
# GODEBUG=schedtrace=DURATION go_dev run num_cpu.go
find . -name '*.go' -exec grep -nHr 'inittask' {
   } \;

bootstrap 流程的一部分会在默认的 M(M0) 上运行一个 G, 这个 G 会执行 runtime.mstart, runtime.mstart 最终会进入 schedule 函数, schedule 函数会把 G1 调度到当前的 M(M0) 上运行, G1 会进入 runtime/proc.gomain 函数,

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值