[Go] golang的MPG调度模型
程序员文章站
2022-06-19 19:07:58
MPG模式运行状态11)当前程序有三个M,如果三个M都在一个cpu运行,就是并发,如果在不同的cpu运行就是并行2)M1,M2,M3正在执行一个G,M1的协程队列有三个,M2的协程队列有三个,M3的协程队列有两个3)从上图可以看到:Go的协程是轻量级的线程,是逻辑态的,Go可以容易的起上万个协程4) ......
mpg模式运行状态1
1)当前程序有三个m,如果三个m都在一个cpu运行,就是并发,如果在不同的cpu运行就是并行
2)m1,m2,m3正在执行一个g,m1的协程队列有三个,m2的协程队列有三个,m3的协程队列有两个
3)从上图可以看到:go的协程是轻量级的线程,是逻辑态的,go可以容易的起上万个协程
4)其他程序c/java的多线程,往往是内核态的,比较重量级,几千个线程就有可能耗光cpu资源
mpg模式运行状态2
1)分成两个部分来看
2)原来的情况是m1主线程正在执行g1协程,另外有三个协程在等待
3)如果g1协程阻塞,比如读取文件或者数据库
4)这时就会创建m2主线程(也可能是从已有的线程池中取出m2)并且将等待的三个协程挂到m2下执行,m1主线程下的g1仍然执行文件的读写
5)这样的mpg调度模式,既可以让g1执行,也不会让队列的其他协程一直阻塞
上一篇: php反弹shell实现代码