摘要:Go 能很好的在用户空间支持并发模型,这也是 Go 如此火热的原因,那今天我们来学习 Go 的调度机制。
数据结构
G 结构体
G 是 goroutine 的缩写,相当于操作系统中的进程控制块,在这里就是 goroutine 的控制结构,是对 goroutine 的抽象,下面是 G 的结构(只列出了部分与调度有关的):
//用于保存上下文的 gobuf 结构体 type gobuf struct { sp uintptr //栈指针,上下文中的 sp 指针 pc uintptr //程序计数器,上下文中的 pc 指针 g guintptr //指向当前 g 的指针 ... } //用于表示一个等待链表上的 goroutine type sudog struct { g *g //阻塞列表上的 G next *sudog //双向链表后指针 prev *sudog //双向链表前指针 elem unsafe.Pointer //该 goroutine 的数据指针 c *hchan ... }