自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

爱写程序的阿波张

公众号:go语言核心编程技术

  • 博客(17)
  • 收藏
  • 关注

原创 为什么tcp的TIME_WAIT状态要维持2MSL

本文主要分析为什么TIME_WAIT状态的持续时间是2MSL而不是1MSL,3MSL或其它的时长,而不会详细描述为什么需要TIME_WAIT状态。阅读本文需要的预备知识:了解TCP协议的状态变迁; 了解TCP拆链的四次挥手过程; 了解为什么需要TIME_WAIT状态。正文其实这个问题在《TCP/IP详解》以及《UNIX网络编程》这两本书中都有提及,但这两本书上的描述都比较简洁并不...

2019-06-04 17:05:21 399

原创 Goroutine被动调度之一(18)

本文是《Go语言调度器源代码情景分析》系列的第18篇,也是第四章《Goroutine被动调度》的第1小节。前一章我们详细分析了调度器的调度策略,即调度器如何选取下一个进入运行的goroutine,但我们还不清楚什么时候以及什么情况下会发生调度,从这一章开始我们就来讨论这个问题。总体说来,go语言的调度器会在以下三种情况下对goroutine进行调度:goroutine执行某个操作因条件...

2019-05-22 16:40:51 564

原创 实战分析一个运行起来会卡死的Go程序

序言最近一位非常热心的网友建议结合demo来分析一下goroutine的调度器,而且还提供了一个demo代码,于是便有了本文,在此对这位网友表示衷心的感谢!这位网友提供的demo程序可能有的gopher以前见过,已经知道了具体原因,但本文假定我们是第一次遇到这种问题,然后从零开始,通过一步一步的分析和定位,最终找到问题的根源及解决方案。虽然本文不需要太多的背景知识,但最好使用过gdb或...

2019-05-20 09:31:17 2593

原创 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

原创 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

原创 Go语言goroutine调度器初始化 (12)

本文是《Go语言调度器源代码情景分析》系列的第12篇,也是第二章的第2小节。本章将以下面这个简单的Hello World程序为例,通过跟踪其从启动到退出这一完整的运行流程来分析Go语言调度器的初始化、goroutine的创建与退出、工作线程的调度循环以及goroutine的切换等重要内容。package mainimport "fmt"func main() {f...

2019-05-06 09:23:02 702

原创 Go语言goroutine调度器概述(11)

本文是《go调度器源代码情景分析》系列的第11篇,也是第二章的第1小节。goroutine简介goroutine是Go语言实现的用户态线程,主要用来解决操作系统线程太“重”的问题,所谓的太重,主要表现在以下两个方面:创建和切换太重:操作系统线程的创建和切换都需要进入内核,而进入内核所消耗的性能代价比较高,开销较大; 内存使用太重:一方面,为了尽量避免极端情况下操作系统线程栈的溢出,内...

2019-05-03 14:40:38 439

原创 线程本地存储及实现原理

本文是《go调度器源代码情景分析》系列 第一章 预备知识的第十小节,也是预备知识的最后一小节。线程本地存储又叫线程局部存储,其英文为Thread Local Storage,简称TLS,看似一个很高大上的东西,其实就是线程私有的全局变量而已。有过多线程编程的读者一定知道,普通的全局变量在多线程中是共享的,一个线程对其进行了修改,所有线程都可以看到这个修改,而线程私有的全局变量与普通全局变量...

2019-05-01 18:17:59 469

原创 操作系统线程及线程调度

本文主要从操作系统什么时候会起对线程的调度以及调度的时候内核会做哪些事情的角度简单的介绍一下系统线程方面的知识。

2019-04-30 13:43:12 874

原创 系统调用

本文主要简单的说明什么是系统调用,以及系统调用是如何实现的。

2019-04-30 13:38:08 899

原创 从汇编层面看函数调用的实现原理

作者:爱写程序的阿波张公众号:go语言核心编程技术本文是《go调度器源代码情景分析》系列 第一章 预备知识的第6小节。前面几节我们介绍了CPU寄存器、内存、汇编指令以及栈等基础知识,为了达到融会贯通加深理解的目的,这一节我们来综合运用一下前面所学的这些知识,看看函数的执行和调用过程。本节我们需要重点关注的问题有:CPU是如何从调用者跳转到被调用函数执行的? 参数是如何从...

2019-04-29 09:38:00 1263 2

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

go汇编格式跟前面讨论过的AT&T汇编基本上差不多,但也有些重要区别,本节就这些差异做一个简单说明。

2019-04-28 08:44:59 566

原创 go语言调度器源代码情景分析之五:汇编语言

汇编语言是每位后端程序员都应该掌握的一门语言,因为学会了汇编语言,不管是对我们调试程序还是研究与理解计算机底层的一些运行原理都具有非常重要的作用,所以建议有兴趣的读者可以多花点时间把它学好。与高级编程语言一样,汇编语言也是一门完整的计算机编程语言,它所涉及的知识内容也很多...

2019-04-26 14:33:03 526 2

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

作者:爱写程序的阿波张公众号:go语言核心编程技术本文是《go调度器源代码情景分析》系列 第一章 预备知识的第3小节。什么是栈栈是一种“后进先出”的数据结构,它相当于一个容器,当需要往容器里面添加元素时只能放在最上面的一个元素之上,需要取出元素时也只能从最上面开始取,通常我们称添加元素为入栈(push),取出元素为出栈(pop)。不知道读者是否有快餐店吃饭的经历,快餐店一般...

2019-04-25 20:14:19 363 1

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

作者:爱写程序的阿波张版权:转载请注明出处公众号:go语言核心编程技术本文是《go调度器源代码情景分析》系列 第一章 预备知识的第三小节。内存是计算机系统的存储设备,其主要作用是协助CPU在执行程序时存储数据和指令。内存由大量内存单元组成,内存单元大小为1个字节(1字节包含8个二进制位), 每个内存单元都有一个编号,更专业的说法是每一个内存单元都有一个地址,我们在编写汇编代码或编译器把...

2019-04-24 20:23:13 296

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

作者:爱写程序的阿波张版权:转载请注明出处公众号:go语言核心编程技术本文是《go调度器源代码情景分析》系列 第一章 预备知识的第二小节。寄存器是CPU内部的存储单元,用于存放从内存读取而来的数据(包括指令)和CPU运算的中间结果,之所以要使用寄存器来临时存放数据而不是直接操作内存,一是因为CPU的工作原理决定了有些操作运算只能在CPU内部进行,二是因为CPU读写寄存器的速度比读写内存的...

2019-04-24 12:58:05 414

原创 go语言调度器源代码情景分析之一:开篇语

专题简介本专题以精心设计的情景为线索,结合go语言最新1.12版源代码深入细致的分析了goroutine调度器实现原理。适宜读者 go语言开发人员 对线程调度器工作原理感兴趣的工程师 对计算机底层运行原理感兴趣的工程师 专题目标笔者希望即使是从未接触过计算机底层原理的读者,通过对本专栏的认真学习,都可以完全掌握go语言调度器的实现原理及细节,从...

2019-04-24 12:19:34 481

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除