![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
go语言调度器情景分析
ABo_Zhang
15年软件开发经验,做过应用,也玩过操作系统内核,高级技术专家,目前K12方向创业中。公众号:go语言核心编程技术
展开
-
go语言调度器源代码情景分析之四:函数调用栈
作者:爱写程序的阿波张公众号:go语言核心编程技术本文是《go调度器源代码情景分析》系列 第一章 预备知识的第3小节。什么是栈栈是一种“后进先出”的数据结构,它相当于一个容器,当需要往容器里面添加元素时只能放在最上面的一个元素之上,需要取出元素时也只能从最上面开始取,通常我们称添加元素为入栈(push),取出元素为出栈(pop)。不知道读者是否有快餐店吃饭的经历,快餐店一般...原创 2019-04-25 20:14:19 · 363 阅读 · 1 评论 -
Go语言调度器之调度main goroutine(14)
本文是《Go语言调度器源代码情景分析》系列的第14篇,也是第二章的第4小节。上一节我们通过分析main goroutine的创建详细讨论了goroutine的创建及初始化流程,这一节我们接着来分析调度器如何把main goroutine调度到CPU上去运行。本节需要重点关注的问题有:如何保存g0的调度信息? schedule函数有什么重要作用? gogo函数如何完成从g0到main g...原创 2019-05-11 11:04:20 · 732 阅读 · 0 评论 -
Go语言调度器之创建main goroutine(13)
本文是《Go语言调度器源代码情景分析》系列的第13篇,也是第二章的第3小节。上一节我们分析了调度器的初始化,这一节我们来看程序中的第一个goroutine是如何创建的。创建main goroutine接上一节,schedinit完成调度系统初始化后,返回到rt0_go函数中开始调用newproc() 创建一个新的goroutine用于执行mainPC所对应的runtime·main函数...原创 2019-05-08 21:09:27 · 356 阅读 · 0 评论 -
Go语言goroutine调度器初始化 (12)
本文是《Go语言调度器源代码情景分析》系列的第12篇,也是第二章的第2小节。本章将以下面这个简单的Hello World程序为例,通过跟踪其从启动到退出这一完整的运行流程来分析Go语言调度器的初始化、goroutine的创建与退出、工作线程的调度循环以及goroutine的切换等重要内容。package mainimport "fmt"func main() {f...原创 2019-05-06 09:23:02 · 702 阅读 · 0 评论 -
操作系统线程及线程调度
本文主要从操作系统什么时候会起对线程的调度以及调度的时候内核会做哪些事情的角度简单的介绍一下系统线程方面的知识。原创 2019-04-30 13:43:12 · 874 阅读 · 0 评论 -
系统调用
本文主要简单的说明什么是系统调用,以及系统调用是如何实现的。原创 2019-04-30 13:38:08 · 899 阅读 · 0 评论 -
从汇编层面看函数调用的实现原理
作者:爱写程序的阿波张公众号:go语言核心编程技术本文是《go调度器源代码情景分析》系列 第一章 预备知识的第6小节。前面几节我们介绍了CPU寄存器、内存、汇编指令以及栈等基础知识,为了达到融会贯通加深理解的目的,这一节我们来综合运用一下前面所学的这些知识,看看函数的执行和调用过程。本节我们需要重点关注的问题有:CPU是如何从调用者跳转到被调用函数执行的? 参数是如何从...原创 2019-04-29 09:38:00 · 1263 阅读 · 2 评论 -
go语言调度器源代码情景分析之一:开篇语
专题简介本专题以精心设计的情景为线索,结合go语言最新1.12版源代码深入细致的分析了goroutine调度器实现原理。适宜读者 go语言开发人员 对线程调度器工作原理感兴趣的工程师 对计算机底层运行原理感兴趣的工程师 专题目标笔者希望即使是从未接触过计算机底层原理的读者,通过对本专栏的认真学习,都可以完全掌握go语言调度器的实现原理及细节,从...原创 2019-04-24 12:19:34 · 480 阅读 · 0 评论 -
Go语言goroutine调度器概述(11)
本文是《go调度器源代码情景分析》系列的第11篇,也是第二章的第1小节。goroutine简介goroutine是Go语言实现的用户态线程,主要用来解决操作系统线程太“重”的问题,所谓的太重,主要表现在以下两个方面:创建和切换太重:操作系统线程的创建和切换都需要进入内核,而进入内核所消耗的性能代价比较高,开销较大; 内存使用太重:一方面,为了尽量避免极端情况下操作系统线程栈的溢出,内...原创 2019-05-03 14:40:38 · 439 阅读 · 0 评论 -
线程本地存储及实现原理
本文是《go调度器源代码情景分析》系列 第一章 预备知识的第十小节,也是预备知识的最后一小节。线程本地存储又叫线程局部存储,其英文为Thread Local Storage,简称TLS,看似一个很高大上的东西,其实就是线程私有的全局变量而已。有过多线程编程的读者一定知道,普通的全局变量在多线程中是共享的,一个线程对其进行了修改,所有线程都可以看到这个修改,而线程私有的全局变量与普通全局变量...原创 2019-05-01 18:17:59 · 469 阅读 · 0 评论 -
Goroutine被动调度之一(18)
本文是《Go语言调度器源代码情景分析》系列的第18篇,也是第四章《Goroutine被动调度》的第1小节。前一章我们详细分析了调度器的调度策略,即调度器如何选取下一个进入运行的goroutine,但我们还不清楚什么时候以及什么情况下会发生调度,从这一章开始我们就来讨论这个问题。总体说来,go语言的调度器会在以下三种情况下对goroutine进行调度:goroutine执行某个操作因条件...原创 2019-05-22 16:40:51 · 564 阅读 · 0 评论