【编者的话】虽然已经有很多解释goroutine的优秀文章,但是对于初学者来说,大多都比较晦涩难懂,在这里总结一下自己对goroutine的理解以及相关资料
Goroutine
Goroutines 既不是OS 线程,也并非Green 线程
Goroutines是更高层次的coroutines(协程)抽象
Goroutine是并发的子程序(函数、闭包、方法),它们是nonpreemptive(非抢占式的) - 不能被中断。相反,协程有多个可允许中断或重入的点。
Go运行时观察Goroutines的状态,当阻塞时自动暂停它们,当它们非阻塞后又重新开启。这样Goroutine就是抢占式的协程,而且只有当它们阻塞时。
运行goroutines的机制是由M:N调度器实现的,该调度器将M个green线程映射到N个OS线上,然后将Goroutines调度到green线程上。
当goroutines多于可用的green线程,调度器将在可用的线程中处理goroutines的分布确保当某些goroutines阻塞时,其他的goroutines依然可以执行。
Work Stealing
-
fair scheduling
n个处理器, x个任务:每个处理器分配x/n个任务
Scheduler
- G go协程
- M OS线程(源代码中表示machine)
- P context(源代码中表示processor)
- GOMAXPROCS 控制着有多少context被用于运行时
<待续>
References: