微信号:golangchina

介绍:golang语言相关的资讯推送

2014 春节发帖第 11 天:goroutine 与调度器

2014-01-11 11:17 高端小混混

我们都知道 Go 语言是原生支持语言级并发的,这个并发的最小逻辑单元就是 goroutine。goroutine 就是 Go 语言提供的一种用户态线程,当然这种用户态线程是跑在内核级线程之上的。当我们创建了很多的 goroutine,并且它们都是跑在同一个内核线程之上的时候,就需要一个调度器来维护这些 goroutine,确保所有的 goroutine 都使用 cpu,并且是尽可能公平的使用 cpu 资源。

这个调度器的原理以及实现值得我们去深入研究一下。支撑整个调度器的主要有 4 个重要结构,分别是 M、G、P、Sched,前三个定义在 runtime.h 中,Sched 定义在 proc.c 中。

Sched 结构就是调度器,它维护有存储M和G的队列以及调度器的一些状态信息等。
M 代表内核级线程,一个M就是一个线程,goroutine 就是跑在 M 之上的;M是一个很大的结构,里面维护小对象内存 cache(mcache)、当前执行的 goroutine、随机数发生器等等非常多的信息。
P 全称是 Processor,处理器,它的主要用途就是用来执行 goroutine 的,所以它也维护了一个 goroutine 队列,里面存储了所有需要它来执行的 goroutine,这个P的角色可能有一点让人迷惑,一开始容易和 M 冲突,后面重点聊一下它们的关系。
G 就是 goroutine 实现的核心结构了,G 维护了 goroutine 需要的栈、程序计数器以及它所在的 M 等信息。
理解 M、P、G 三者的关系对理解整个调度器非常重要,我从网络上找了一个图来说明其三者关系:


...

 
Go中国 更多文章 gosnowflake xorm - 课时 1:常见用法指导 简单的 Linux 服务器监控 免费 Go 电子书 WeTalk 是如何使用 beego 并实现实时本地化的?
猜您喜欢 泰国程序员不会英语,却得了英语世界第三名! 中国技术力量:携程的技术演进之路 掌握SQL Monitoring这些特性,SQL优化通通不在话下 DevOps概念多也不怕,读懂这张图就够了