专题简介

本专题以精心设计的情景为线索,结合go语言最新1.12版源代码深入细致的分析了goroutine调度器实现原理。

适宜读者

  • go语言开发人员
  • 对线程调度器工作原理感兴趣的工程师
  • 对计算机底层运行原理感兴趣的工程师

专题目标

笔者希望即使是从未接触过计算机底层原理的读者,通过对本专栏的认真学习,都可以完全掌握go语言调度器的实现原理及细节,从而可以充分利用go调度器的特性写出更加优秀的并发程序和解决一些与调度相关的疑难杂症;另外,读者还可以学到大量与程序运行相关的基础知识,比如汇编代码,CPU如何执行指令以及并发无锁编程等等非常重要的编程内功心法,有了这些基础理论,在今后的学习和工作中,读者就完全有能力对其它一些自己感兴趣的底层实现原理做深入的分析。

如何学习本专栏

编程是一门实践性很强的技术,所以建议读者在阅读本专栏时多注重实践练习,特别是在学习第一部分的汇编指令及函数调用栈等知识的时候,读者可以自己写一些小程序然后用调试工具单步执行来跟踪寄存器以及栈的变化,从而更好的理解这些内容。

专栏模块

本专栏主要分为两大部分:

  • 第一部分包括第一章,主要介绍理解调度器工作原理所必须的预备知识,比如汇编指令,函数调用过程,操作系统线程调度原理以及线程本地存储等重要理论知识。这部分内容主要是为从未接触过底层知识的读者准备的,如果读者对这部分已经很熟了,则完全可以跳过这部分的阅读。
  • 第二部分包括第2到第6章,主要分析goroutine调度器的实现,包括调度器的初始化,调度策略以及主动被动和抢占调度等,在分析过程中我们不仅会介绍调度器在干什么,更重要的是我们还会详细说明为什么要这么做,让读者知其然也知其所以然。

专栏章节(初稿已经全部完成,逐渐放上来)

开篇语

第一章 预备知识

1. CPU寄存器

2. 内存

3. 函数调用栈

4. 汇编指令

5. go语言汇编

6. 函数调用过程

7. 系统调用

8. 操作系统线程及调度

9. 线程本地存储

第二章 初始化和调度循环

1. 调度器概述

2. 程序启动和调度器初始化

3. 创建main goroutine

4. 启动main goroutine

第三章 调度策略

1. goroutine的退出与调度循环

2. 再探schedule函数与寻找可运行的goroutine

3. 盗取goroutine与工作线程睡眠

第四章 被动调度

1. goroutine进入运行队列

2. goroutine进入睡眠

3. 唤醒睡眠中的goroutine与工作线程

4. 创建工作线程

第五章 主动调度

1. 主动调度

第六章 抢占调度

1. 抢占运行时间过长的goroutine

2. goroutine进入系统调用以及从系统调用返回

3. 抢占进入系统调用的goroutine

作者简介

爱写程序的阿波张,男,程序员,高级技术专家。

15年软件开发经验,做过应用层软件,也玩过操作系统内核,目前专注于K12在线教育创业中。

对计算机底层运行原理很感兴趣,熟悉X86汇编/C/C++/Go。

最后,欢迎关注个人微信公众号:go语言核心编程技术

go语言调度器源代码情景分析之一:开篇语的更多相关文章

  1. go语言调度器源代码情景分析之五:汇编指令

    本文是<go调度器源代码情景分析>系列 第一章 预备知识的第4小节. 汇编语言是每位后端程序员都应该掌握的一门语言,因为学会了汇编语言,不管是对我们调试程序还是研究与理解计算机底层的一些运 ...

  2. go语言调度器源代码情景分析之四:函数调用栈

    本文是<go调度器源代码情景分析>系列 第一章 预备知识的第3小节. 什么是栈 栈是一种“后进先出”的数据结构,它相当于一个容器,当需要往容器里面添加元素时只能放在最上面的一个元素之上,需 ...

  3. go语言调度器源代码情景分析之三:内存

    本文是<go调度器源代码情景分析>系列 第一章 预备知识的第2小节. 内存是计算机系统的存储设备,其主要作用是协助CPU在执行程序时存储数据和指令. 内存由大量内存单元组成,内存单元大小为 ...

  4. go语言调度器源代码情景分析之二:CPU寄存器

    本文是<go调度器源代码情景分析>系列 第一章 预备知识的第1小节. 寄存器是CPU内部的存储单元,用于存放从内存读取而来的数据(包括指令)和CPU运算的中间结果,之所以要使用寄存器来临时 ...

  5. go语言调度器源代码情景分析之六:go汇编语言

    go语言runtime(包括调度器)源代码中有部分代码是用汇编语言编写的,不过这些汇编代码并非针对特定体系结构的汇编代码,而是go语言引入的一种伪汇编,它同样也需要经过汇编器转换成机器指令才能被CPU ...

  6. 《Android系统源代码情景分析》连载回忆录:灵感之源

    上个月,在花了一年半时间之后,写了55篇文章,分析完成了Chromium在Android上的实现,以及Android基于Chromium实现的WebView.学到了很多东西,不过也挺累的,平均不到两个 ...

  7. linux调度器源码分析 - 初始化(二)

    本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 引言 上期文章linux调度器源码分析 - 概述(一)已经把调度器相关的数据结构介绍了一遍,本篇着重通过代码说明 ...

  8. [翻译] 深入浅出Go语言调度器:第一部分 - 系统调度器

    目录 译者序 序 介绍 系统调度器 执行指令 Figure 1 Listing 1 Listing 2 Listing 3 线程状态 任务侧重 上下文切换 少即是多 寻找平衡 缓存行 Figure 2 ...

  9. Linux内核源代码情景分析系列

    http://blog.sina.com.cn/s/blog_6b94d5680101vfqv.html Linux内核源代码情景分析---第五章 文件系统  5.1 概述 构成一个操作系统最重要的就 ...

随机推荐

  1. Ubuntu 安装LAMP

    简要记录一下. 环境准备 虚拟机环境 lz@starnight:~$ sudo -i [sudo] password for lz: root@starnight:~# cat /etc/issue ...

  2. form表单序列化为Jquery对象

    <form id="DailyFinancial" > @*class="form-inline"*@ <div class="fo ...

  3. java接受安卓及ios App上传的图片,并保存到阿里OSS

    做后台的时候,写了两个方法,分别用来获取安卓和苹果IOS端上传的头像,保存到阿里云OSS图片存储服务器上.(SMM框架) 安卓及H5版本: /** * 上传用户头像 */ @RequestMappin ...

  4. 单调队列——求m区间内的最小值

    单调队列,顾名思义是指队列内的元素是有序的,队头为当前的最大值(单调递减队列)或最小值(单调递增序列),以单调递减队列为例来看队列的入队和出队操作: 1.入队: 如果当前元素要进队,把当前元素和队尾元 ...

  5. 微软黑科技强力注入,.NET C#全面支持人工智能

    微软黑科技强力注入,.NET C#全面支持人工智能,AI编程领域开始C#.Py--百花齐放 就像武侠小说中,一个普通人突然得到绝世高手的几十年内力注入,招式还没学,一身内力有点方 Introducin ...

  6. 妙用this关键字

    妙用this关键字 ## this关键字一般this关键字都是指的是对象的本身,在类的所有方法.构造器都可以拿到this引用,这是jvm"偷偷"帮我们传递进来的引用,指向调用方法对 ...

  7. ubuntu 命令整合1

    一.linux命令基本格式 命令名[选项] [参数] 注意: 命令名区分字母大小写 命令名必须有 选项.参数可以没有,选项一般使用减号开头二.具体Linux命令 1.who 显示登录系统中的用户的信息 ...

  8. cw2vec理论及其实现

    导读 本文对AAAI 2018(Association for the Advancement of Artificial Intelligence 2018)高分录用的一篇中文词向量论文(cw2ve ...

  9. mysql explain中key_len值的说明

    在mysql 的explain的输出中,有个key_len的列,其数据是如何计算的呢? 在看到了淘宝的dba以前发布的博客后,我在mysql 5.6上操作一番,了解了一点. 环境准备 – 创建表. u ...

  10. 通过VirtualBox安装Linux系统(CentOS7)

    本文目的:创建虚拟系统.在windows系统中通过虚拟工具VirtualBox创建一个虚拟系统CentOS. 备注:(1)版本如下:VirtualBox-5.2.12-122591-Win 和Cent ...