golang调度器

概述

go通过goroutine实现用户态的执行流切换,goroutine有几个好处

  • 用户态切换(网络或者channel,mutex等),不占用资源
  • 可变大小的栈,占用资源少
  • 隐藏底层poller(主要是epoll实现的netpoller细节)和调度细节,使用起来简单,以同步方式实现异步的性能

G M P

G: goroutine,就是平常提到的go中的协程
M: machine,线程,就是平常提到的操作系统中的线程
P: process,处理器,有的文章说代表上下文,P管理G和M,只有当G和P绑定并且分配给P管理的某个M的时候,G才会被执行。G一般存在与P的本地队列里面,也有可能存在全局的队列或者从其他的P的本地队列里偷过来

GMP关系

调度策略

当G执行任何需要等待的任务或者运行时间太长被强制换出的时候都会阻塞。此时与其绑定的M会被G用来运行队列中的其他G。
但是当G读写文件的时候,M也会被阻塞,此时P会生成新的M来运行队列中的其他G。M默认最大10000,有runtime.SetMaxThreads来设置
P一般等于cpu核心数,runtime.SetMaxProc

调度器实现了抢占
也就是说如果一个G执行太久,是会被切换出去的。
这样可以确保整个程序看起来是“并发”执行的,而不是一个G可以执行时就是一直执行,其他G都饿死。
但是切换点需要是函数调用。假设G中是不调函数的纯无限循环计算,还是无法被抢占。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值