线程模型
线程可分为用户线程和内核线程,用户线程由用户创建、同步和销毁,内核线程则由内核来管理。 根据用户线程管理方式的不同,分为三种线程模型。
一种是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也会被系统调用阻塞。
来源:oschina
链接:https://my.oschina.net/renhc/blog/3209215