摘要:
原创文章,欢迎转载,转载请注明出处,谢谢。 【目录】 Go runtime 调度器精讲(一):Go 程序初始化 Go runtime 调度器精讲(二):调度器初始化 Go runtime 调度器精讲(三):main goroutine 创建 Go runtime 调度器精讲(四):运行 main g 阅读全文
摘要:
原创文章,欢迎转载,转载请注明出处,谢谢。 0. 前言 前面介绍了运行时间过长和系统调用引起的抢占,它们都属于协作式抢占。本讲会介绍基于信号的真抢占式调度。 在介绍真抢占式调度之前看下 Go 的两种抢占式调度器: 抢占式调度器 - Go 1.2 至今 基于协作的抢占式调度器 - Go 1.2 - G 阅读全文
摘要:
原创文章,欢迎转载,转载请注明出处,谢谢。 0. 前言 第八讲介绍了当 goroutine 运行时间过长会被抢占的情况。这一讲继续看 goroutine 执行系统调用时间过长的抢占。 1. 系统调用时间过长的抢占 看下面的示例: func longSyscall() { timeout := sys 阅读全文
摘要:
原创文章,欢迎转载,转载请注明出处,谢谢。 0. 前言 在 Go runtime 调度器精讲(七):案例分析 一文我们介绍了一个抢占的案例。从案例分析抢占的实现,并未涉及到源码层面。本文将继续从源码入手,看 Go runtime 调度器是如何实现抢占逻辑的。 1. sysmon 线程 还记得 Go 阅读全文
摘要:
原创文章,欢迎转载,转载请注明出处,谢谢。 0. 前言 前面用了六讲介绍 Go runtime 调度器,这一讲我们看一个关于调度 goroutine 的程序案例分析下调度器做了什么。需要说明的是,这个程序和抢占有关,抢占目前为止还没有介绍到,如果看不懂也没有关系,有个印象就行。 1. 案例 1 执行 阅读全文
摘要:
原创文章,欢迎转载,转载请注明出处,谢谢。 0. 前言 在 Go runtime 调度器精讲(三):main goroutine 创建 介绍了 main goroutine 的创建,文中我们说 main goroutine 和非 main goroutine 有区别。当时卖了个关子并未往下讲,这一讲 阅读全文
摘要:
原创文章,欢迎转载,转载请注明出处,谢谢。 0. 前言 在 第四讲 我们介绍了 main goroutine 是如何运行的。其中针对 main goroutine 介绍了调度函数 schedule 是怎么工作的,对于整个调度器的调度策略并没有介绍,这点是不完整的,这一讲会完善调度器的调度策略部分。 阅读全文
摘要:
原创文章,欢迎转载,转载请注明出处,谢谢。 0. 前言 皇天不负有心人,终于我们到了运行 main goroutine 环节了。让我们走起来,看看一个 goroutine 到底是怎么运行的。 1. 运行 goroutine 稍微回顾下前面的内容,第一讲 Go 程序初始化,介绍了 Go 程序是怎么进入 阅读全文
摘要:
原创文章,欢迎转载,转载请注明出处,谢谢。 0. 前言 回顾下 上一讲 的内容。主线程 m0 蓄势待发,准备干活。g0 为 m0 提供了执行环境,P 和 m0 绑定,为 m0 提供活,也就是 goroutine。那么问题来了,活呢?哪里有活给 m0 干? 这一讲我们将介绍 m0 执行的第一个活,也就 阅读全文
摘要:
原创文章,欢迎转载,转载请注明出处,谢谢。 0. 前言 上一讲 介绍了 Go 程序初始化的过程,这一讲继续往下看,进入调度器的初始化过程。 接着上一讲的执行过程,省略一些不相关的代码,执行到 runtime/asm_amd64.s:rt0_go:343L: (dlv) si asm_amd64.s: 阅读全文