golang GMP

GMP是Go语言中的核心调度模型,包括Goroutine(轻量级线程)、Processor(P)和内核线程(M)。每个P有自己的本地队列和全局队列用于存储待运行的goroutine。Go语言通过线程复用来提高效率,采用workstealing策略平衡负载,当线程阻塞时,会释放P给其他线程,同时支持抢占机制和GOMAXPROCS设置来充分利用多核CPU。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

GMP 简介

   G:goroutine 协程

   P:processor 处理器

   M:thread 内核线程

全局队列:存放等待运行的goroutine

P的本地队列:

  • 存放等待运行的goroutine
  • 数量限制:不超过256个
  • 优先将新创建的goroutine放在P的本地队列中,如果满了会放在全局队列中

M列表:

  • 当前操作系统分配到当前Go程序的内核线程数
  • Go语言本身,限定M的最大量是10000
  • 有一个M阻塞,会创建一个新的M
  • 如果有M空闲,那么就会回收或睡眠

调度器的设计策略

  • 复用线程(避免频繁的创建、销毁线程、而是对线程的复用)
    • work stealing机制:当本线程无可运行的goroutine时,尝试从其他线程绑定的P偷取G,而不是销毁线程
    • hand off机制:当本线程因为G进行系统调用阻塞时,线程释放绑定的P,把P转移给其他空闲的线程执行
  • 利用并行 (GOMAXPROCS设置P的数量,最多有GOMAXPROCS个线程分布在多个CPU上同时执行
  • 抢占(在goroutine中要等待一个协程主动让出CPU才执行下一个协程,在Go中,一个goroutine最多占用CPU 10ms,防止其他goroutine被饿死)
  • 全局G队列 (当M执行work stealing 从其他P偷不到G时,他可以从全局G队列获取G)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值