Please enable Javascript to view the contents

Golang-中级-线程调度GMP

 ·  ☕ 2 分钟

gpm是对csp并发模型的一种实现

g:goroutine 携程 轻量级线程 应用程序控制
p:processor 处理器
m:machine 线程

工作逻辑:
1.默认生成内核数的p和m,如果g被创建,首先会被添加到p的私有队列里面,让m来从p处理,如果所有p的私有队列全满,g会被添加到全局队列里面等待m的处理
2.当一个g在管道传输阻塞时,m会跳过这个g,转而去执行其他的g,当此g被唤醒(读写调用)时,g会被添加到它的唤醒g所在的p的队列里等待处理
3.当g调用了syscall后,相应的m也会休眠,此时的p会去找其他的闲置的m来接管执行队列里的g,如果没有闲置的会重新创建一个m

主要有两个机制 work stealing和hand off

  • work stealing:当本地队列的g执行完后,会去全局队列里面拿,如果全局队列里面没有,会再从其他p的本地队列里面偷取

  • hand off:就是上面的第3点,syscall阻塞后会与当前的m分离,当前的m和g会阻塞,然后p会找新的m

P的数量由GOMAXPROCS决定,程序运行就创建好了这么多个P。

GMP调度器的核心思想: 通过工作窃取机制和hand off机制,服用操作系统的线程,让操作系统认为这个些线程一直在忙碌,不断的把时间片分配给这些线程,从而减少线程创建消费和切换,提高程序的并发能力

分享

Hex
作者
Hex
CloudNative Developer

目录