Implemention of Golang: 协程栈(一)

协程栈概述

说明

计算机中的栈一个很大的应用场合使用在函数调用中。我们这里简单说说golang的协程栈布局,学过计算机的应该都不会陌生。

程序事例

package main

func f(a, b int) int {
    sum := 0
    sum = a + b
    for i := 0; i < 1000; i++ {
        println("sum is:", sum)
    }
    return sum
}

func main() {
    f(1, 2)
}

golang调度时机研究

channel读写

对channel的读、写都可能会引起协程调度,这很自然,因为现在golang的channel操作均是同步操作。

向channel写数据

golang的channel分为无缓冲和有缓冲,前者主要用于同步,而后者主要用于消息传递。他们形式上的区别在于创建缓冲区时指定的缓冲区大小这个参数。

无论是无缓冲还是有缓冲channel,当向channel写数据发现被阻塞时,都需要将当前写的协程挂起,并进行一次调度。接下来让我们仔细分析下与channel中与调度相关的逻辑。

Continue reading golang调度时机研究

golang 协程调度算法深究

说明

前面有两篇文章我们聊了聊golang的协程调度算法。现在重新捡起来看看,真的是太皮毛了,羞愧,浅尝辄止的研究从来不是我的风格。

痛定思痛,从这里开始,我们深入深入再深入,直到将她扒光为止。

这篇文章可能会包含较多的个人思考,所以可能会有不少呓语,请忽略,如果你也能跟上我的节奏,那么你可能会很喜欢,否则,你可能觉得我是个神经病。

Continue reading golang 协程调度算法深究

Golang协程调度算法分析(一)

Goroutine状态变迁

在讲解操作系统进程调度的部分时,几乎所有的书籍都会先列出一张进程的状态迁移图,通过状态图,能很清晰的把进程调度的每个环节串联起来,方便理解。

Go运行时的调度器其实可以看成OS调度器的某种简化版 本,一个goroutine在其生命周期之中,同样包含了各种状态的变换。弄清了这些状态及状态间切换的原理,对搞清整个Go调度器会非常有帮助。

以下是我总结的一张goroutine的状态迁移图,圆形框表示状态,箭头及文字信息表示切换的方向和条件:

Continue reading Golang协程调度算法分析(一)