【Go专家编程】调度模型

社会主义新天地 提交于 2020-03-23 17:47:41

3 月,跳不动了?>>>

线程模型

线程可分为用户线程和内核线程,用户线程由用户创建、同步和销毁,内核线程则由内核来管理。 根据用户线程管理方式的不同,分为三种线程模型。

一种是N:1模型,即N个用户线程运行在1个内核线程中,优点是用户线程上下文切换快,缺点是无法充分利用CPU多核的算力。

另一种是1:1模型,即每个用户线程对应一个内核线程,优点是充分利用CPU,缺点是线程上下文切换较慢。

Go实现的是M:N模型,即前两种模型的组合,M个用户线程(协程)运行在N个线程中,优点是充分利用CPU的算力且协程上下文切换快,缺点则是该模型的调度算法较为复杂。

Go调度器模型

Go协程调度模型中包含三个关键实体,Machine(简称M)、Processor(简称P)和Goroutine(简称G)。

  • M(Machine):工作线程,它由操作系统调度;
  • P(Processor):处理器(Go定义的一个摡念,不是指CPU),包含运行Go代码的必要资源,也有调度goroutine的能力。
  • G(Goroutine): 即Go协程,每个go关键字都会创建一个协程。

M必须持有P才可以执行代码,跟系统中的其他线程一样,M也会被系统调用阻塞。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!