<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Shanks]]></title><description><![CDATA[这是一位码农的博客]]></description><link>https://blog.csdn.net/pyf09</link><language>zh-cn</language><generator>https://blog.csdn.net/</generator><copyright><![CDATA[Copyright &copy; pyf09]]></copyright><item><title><![CDATA[博客地址更改]]></title><link>https://blog.csdn.net/pyf09/article/details/116920117</link><guid>https://blog.csdn.net/pyf09/article/details/116920117</guid><author>pyf09</author><pubDate>Mon, 17 May 2021 10:54:39 +0800</pubDate><description><![CDATA[最新的个人博客地址 shanks.link
]]></description><category></category></item><item><title><![CDATA[Go语言panic/recover的实现]]></title><link>https://blog.csdn.net/pyf09/article/details/115302438</link><guid>https://blog.csdn.net/pyf09/article/details/115302438</guid><author>pyf09</author><pubDate>Thu, 01 Apr 2021 20:29:49 +0800</pubDate><description><![CDATA[以下内容转载自https://mp.weixin.qq.com/s/0JTBGHr-bV4ikLva-8ghEw

原创爱写程序的阿波张源码游记2019-07-02

本文主要分析Go语言的panic/recover在AMD64 Linux平台下的实现，包括：


	主动调用 panic() 函数所引发的panic的处理流程，比如go代码中直接调用panic()函数或编译器插入的对panic()的调用；
	
	
	非法操作所导致的panic的处理流程，这主要跟信号处理流程有关。
	
阅读本文所必需的...]]></description><category></category></item><item><title><![CDATA[深入理解defer（下）defer实现机制]]></title><link>https://blog.csdn.net/pyf09/article/details/115302038</link><guid>https://blog.csdn.net/pyf09/article/details/115302038</guid><author>pyf09</author><pubDate>Thu, 01 Apr 2021 20:29:22 +0800</pubDate><description><![CDATA[以下内容转载自https://mp.weixin.qq.com/s/iEtMbRXW4yYyCG0TTW5y9g

原创爱写程序的阿波张源码游记2019-06-17

上一篇文章我们主要从使用的角度介绍了 defer 的基础知识，本文我们来分析一下 defer 的实现机制。

还是从一个例子程序开始。


packagemain

import"fmt"

funcsum(a,bint) {
c:=a+b
fmt.Println("sum:",c)
}

fun...]]></description><category></category></item><item><title><![CDATA[深入理解defer（上）defer基础]]></title><link>https://blog.csdn.net/pyf09/article/details/115301975</link><guid>https://blog.csdn.net/pyf09/article/details/115301975</guid><author>pyf09</author><pubDate>Thu, 01 Apr 2021 20:29:06 +0800</pubDate><description><![CDATA[以下内容转载自https://mp.weixin.qq.com/s/QmeQTONUuWlr_sRNP8b5Tw

原创爱写程序的阿波张源码游记2019-06-11

深入理解 defer 分上下两篇文章，本文为上篇，主要介绍如下内容：


	为什么需要 defer；
	
	
	defer 语法及语义；
	
	
	defer 使用要点；
	
	
	defer 语句中的函数到底是在 return 语句之后被调用还是 return 语句之前被调用。
	
为什么需要 defer

先来看一段没有使用 de...]]></description><category></category></item><item><title><![CDATA[Go语言调度器之盗取goroutine(17)]]></title><link>https://blog.csdn.net/pyf09/article/details/115383670</link><guid>https://blog.csdn.net/pyf09/article/details/115383670</guid><author>pyf09</author><pubDate>Thu, 01 Apr 2021 20:28:56 +0800</pubDate><description><![CDATA[以下内容转载自https://mp.weixin.qq.com/s/o2UmxmFFOwUAkgE-Ao9MsA

原创爱写程序的阿波张源码游记2019-05-17

本文是《Go语言调度器源代码情景分析》系列的第17篇，也是第三章《Goroutine调度策略》的第2小节。



上一小节我们分析了从全局运行队列与工作线程的本地运行队列获取goroutine的过程，这一小节我们继续分析因无法从上述两个队列中拿到需要运行的goroutine而导致的从其它工作线程的本地运行队列中盗取goroutine...]]></description><category></category></item><item><title><![CDATA[抢占系统调用执行时间过长的goroutine（22）]]></title><link>https://blog.csdn.net/pyf09/article/details/115301894</link><guid>https://blog.csdn.net/pyf09/article/details/115301894</guid><author>pyf09</author><pubDate>Thu, 01 Apr 2021 20:25:53 +0800</pubDate><description><![CDATA[以下内容转载自https://mp.weixin.qq.com/s/If0-35Pt8dN7G1gD4L9-hw

原创爱写程序的阿波张源码游记2019-06-01

本文是《Go语言调度器源代码情景分析》系列的第22篇，也是第六章《抢占调度》的第2小节。

上一节我们分析了因运行时间过长而导致的抢占调度，这一节我们来分析因进入系统调用时间过长而发生的抢占调度。

剥夺工作线程的p

现在重新回到sysmon监控线程定期调用的retake函数:

runtime/proc.go : 4380


f...]]></description><category></category></item><item><title><![CDATA[因goroutine运行时间过长而发生的抢占调度（21）]]></title><link>https://blog.csdn.net/pyf09/article/details/115301804</link><guid>https://blog.csdn.net/pyf09/article/details/115301804</guid><author>pyf09</author><pubDate>Thu, 01 Apr 2021 20:25:48 +0800</pubDate><description><![CDATA[以下内容转载自https://mp.weixin.qq.com/s/i8DQ0HrO5Bt-qE5cX7c1ng

原创爱写程序的阿波张源码游记2019-05-28

本文是《Go语言调度器源代码情景分析》系列的第21篇，也是第六章《抢占调度》的第1小节。

前面几节我们分析了Goroutine因读写channel等阻塞而导致的被动调度以及通过调用Gosched函数发起的主动调度，现在还剩下最后一种调度方式即抢占调度未讨论，从本节开始，我们就来对它进行分析。

本小节我们需要重点关注：


	什么情...]]></description><category></category></item><item><title><![CDATA[工作线程的唤醒及创建(19)]]></title><link>https://blog.csdn.net/pyf09/article/details/115254081</link><guid>https://blog.csdn.net/pyf09/article/details/115254081</guid><author>pyf09</author><pubDate>Thu, 01 Apr 2021 20:25:21 +0800</pubDate><description><![CDATA[以下内容转载自https://mp.weixin.qq.com/s/T9CDaNF5KUFjE_Z6YW7mRw

原创爱写程序的阿波张源码游记2019-05-23

本文是《Go语言调度器源代码情景分析》系列的第19篇，也是第四章《Goroutine被动调度》的第2小节。



本文需要重点关注：


	如何唤醒睡眠中的工作线程
	
	
	如何创建新的工作线程
	
上一篇文章我们分析到了ready函数通过把需要唤醒的goroutine放入运行队列来唤醒它，本文接着上文继续分析。

唤醒空闲的P
...]]></description><category></category></item><item><title><![CDATA[Goroutine被动调度之一（18）]]></title><link>https://blog.csdn.net/pyf09/article/details/115301457</link><guid>https://blog.csdn.net/pyf09/article/details/115301457</guid><author>pyf09</author><pubDate>Thu, 01 Apr 2021 20:24:55 +0800</pubDate><description><![CDATA[以下内容转载自https://mp.weixin.qq.com/s/w3i5hVKmYW_M06nLaMlwvQ

原创爱写程序的阿波张源码游记2019-05-22

本文是《Go语言调度器源代码情景分析》系列的第18篇，也是第四章《Goroutine被动调度》的第1小节。

前一章我们详细分析了调度器的调度策略，即调度器如何选取下一个进入运行的goroutine，但我们还不清楚什么时候以及什么情况下会发生调度，从这一章开始我们就来讨论这个问题。

总体说来，go语言的调度器会在以下三种情况下对go...]]></description><category></category></item><item><title><![CDATA[第三章 Goroutine调度策略（16）]]></title><link>https://blog.csdn.net/pyf09/article/details/115254008</link><guid>https://blog.csdn.net/pyf09/article/details/115254008</guid><author>pyf09</author><pubDate>Mon, 29 Mar 2021 15:01:26 +0800</pubDate><description><![CDATA[以下内容转载自https://mp.weixin.qq.com/s/2objs5JrlnKnwFbF4a2z2g

原创爱写程序的阿波张源码游记2019-05-14

本文是《Go语言调度器源代码情景分析》系列的第16篇，也是第三章《Goroutine调度策略》的第1小节。



在调度器概述一节我们提到过，所谓的goroutine调度，是指程序代码按照一定的算法在适当的时候挑选出合适的goroutine并放到CPU上去运行的过程。这句话揭示了调度系统需要解决的三大核心问题：


	调度时机：什么...]]></description><category></category></item><item><title><![CDATA[非main goroutine的退出及调度循环（15）]]></title><link>https://blog.csdn.net/pyf09/article/details/115253988</link><guid>https://blog.csdn.net/pyf09/article/details/115253988</guid><author>pyf09</author><pubDate>Mon, 29 Mar 2021 15:01:07 +0800</pubDate><description><![CDATA[以下内容转载自https://mp.weixin.qq.com/s/XttP9q7-PO7VXhskaBzGqA

原创爱写程序的阿波张源码游记2019-05-12

本文是《Go语言调度器源代码情景分析》系列的第15篇，也是第二章的第5小节。

上一节我们说过main goroutine退出时会直接执行exit系统调用退出整个进程，而非main goroutine退出时则会进入goexit函数完成最后的清理工作，本小节我们首先就来验证一下非main goroutine执行完成后是否真的会去执行go...]]></description><category></category></item><item><title><![CDATA[Go语言调度器之调度main goroutine（14）]]></title><link>https://blog.csdn.net/pyf09/article/details/115238823</link><guid>https://blog.csdn.net/pyf09/article/details/115238823</guid><author>pyf09</author><pubDate>Mon, 29 Mar 2021 15:00:47 +0800</pubDate><description><![CDATA[以下内容转载自https://mp.weixin.qq.com/s/8eJm5hjwKXya85VnT4y8Cw

原创爱写程序的阿波张源码游记2019-05-09

本文是《Go语言调度器源代码情景分析》系列的第14篇，也是第二章的第4小节。

上一节我们通过分析main goroutine的创建详细讨论了goroutine的创建及初始化流程，这一节我们接着来分析调度器如何把main goroutine调度到CPU上去运行。本节需要重点关注的问题有：


	如何保存g0的调度信息？
	
	
	sc...]]></description><category></category></item><item><title><![CDATA[Go语言调度器之创建main goroutine(13)]]></title><link>https://blog.csdn.net/pyf09/article/details/115238792</link><guid>https://blog.csdn.net/pyf09/article/details/115238792</guid><author>pyf09</author><pubDate>Mon, 29 Mar 2021 15:00:32 +0800</pubDate><description><![CDATA[以下内容转载自https://mp.weixin.qq.com/s/FF8YU8nXP9TKt0qvSuzmtw

原创爱写程序的阿波张源码游记2019-05-07

本文是《Go语言调度器源代码情景分析》系列的第13篇，也是第二章的第3小节。

上一节我们分析了调度器的初始化，这一节我们来看程序中的第一个goroutine是如何创建的。

创建main goroutine

接上一节，schedinit完成调度系统初始化后，返回到rt0_go函数中开始调用newproc() 创建一个新的gorou...]]></description><category></category></item><item><title><![CDATA[Go语言goroutine调度器初始化 十二]]></title><link>https://blog.csdn.net/pyf09/article/details/115238748</link><guid>https://blog.csdn.net/pyf09/article/details/115238748</guid><author>pyf09</author><pubDate>Mon, 29 Mar 2021 15:00:06 +0800</pubDate><description><![CDATA[以下内容转载自https://mp.weixin.qq.com/s/W9D4Sl-6jYfcpczzdPfByQ

原创爱写程序的阿波张源码游记2019-05-05

本文是《Go语言调度器源代码情景分析》系列的第12篇，也是第二章的第2小节。



本章将以下面这个简单的Hello World程序为例，通过跟踪其从启动到退出这一完整的运行流程来分析Go语言调度器的初始化、goroutine的创建与退出、工作线程的调度循环以及goroutine的切换等重要内容。


packagemain

i...]]></description><category></category></item><item><title><![CDATA[Go语言调度器之主动调度(20)]]></title><link>https://blog.csdn.net/pyf09/article/details/115254088</link><guid>https://blog.csdn.net/pyf09/article/details/115254088</guid><author>pyf09</author><pubDate>Mon, 29 Mar 2021 14:59:29 +0800</pubDate><description><![CDATA[以下内容转载自https://mp.weixin.qq.com/s/zA7KY_25NGjip9pP38RIvg

原创爱写程序的阿波张源码游记2019-05-24

本文是《Go语言调度器源代码情景分析》系列的第20篇，也是第五章《主动调度》的第1小节。



Goroutine的主动调度是指当前正在运行的goroutine通过直接调用runtime.Gosched()函数暂时放弃运行而发生的调度。

主动调度完全是用户代码自己控制的，我们根据代码就可以预见什么地方一定会发生调度。比如下面的程序...]]></description><category></category></item><item><title><![CDATA[goroutine调度器概述(11)]]></title><link>https://blog.csdn.net/pyf09/article/details/115238709</link><guid>https://blog.csdn.net/pyf09/article/details/115238709</guid><author>pyf09</author><pubDate>Fri, 26 Mar 2021 13:04:22 +0800</pubDate><description><![CDATA[以下内容转载自https://mp.weixin.qq.com/s/2wkZyOFAyhHgvNkEkXamkQ

原创爱写程序的阿波张源码游记2019-05-01

本文是《go调度器源代码情景分析》系列的第11篇，也是第二章的第1小节。

goroutine简介

goroutine是Go语言实现的用户态线程，主要用来解决操作系统线程太“重”的问题，所谓的太重，主要表现在以下两个方面：


	创建和切换太重：操作系统线程的创建和切换都需要进入内核，而进入内核所消耗的性能代价比较高，开销较大；
	...]]></description><category></category></item><item><title><![CDATA[Go语言调度器源代码情景分析之十：线程本地存储]]></title><link>https://blog.csdn.net/pyf09/article/details/115238634</link><guid>https://blog.csdn.net/pyf09/article/details/115238634</guid><author>pyf09</author><pubDate>Fri, 26 Mar 2021 13:03:29 +0800</pubDate><description><![CDATA[以下内容转载自https://mp.weixin.qq.com/s/-tiXJpH0IrJw-RH4x5SRdQ

原创爱写程序的阿波张源码游记2019-04-27

本文是《go调度器源代码情景分析》系列 第一章 预备知识的第十小节，也是预备知识的最后一小节。

线程本地存储又叫线程局部存储，其英文为Thread Local Storage，简称TLS，看似一个很高大上的东西，其实就是线程私有的全局变量而已。

有过多线程编程的读者一定知道，普通的全局变量在多线程中是共享的，一个线程对其进行了修改...]]></description><category></category></item><item><title><![CDATA[go调度器源代码情景分析之九：操作系统线程及线程调度]]></title><link>https://blog.csdn.net/pyf09/article/details/115238594</link><guid>https://blog.csdn.net/pyf09/article/details/115238594</guid><author>pyf09</author><pubDate>Fri, 26 Mar 2021 13:02:04 +0800</pubDate><description><![CDATA[以下内容转载自https://mp.weixin.qq.com/s/OvGlI5VvvRdMRuJegNrOMg

原创爱写程序的阿波张源码游记2019-04-25

本文是《go调度器源代码情景分析》系列 第一章 预备知识的第九小节。

要深入理解goroutine的调度器，就需要对操作系统线程有个大致的了解，因为go的调度系统是建立在操作系统线程之上的，所以接下来我们对其做一个简单的介绍。

很难对线程下一个准确且易于理解的定义，特别是对于从未接触过多线程编程的读者来说，要搞懂什么是线程可能并不...]]></description><category></category></item><item><title><![CDATA[go语言调度器源代码情景分析之八：系统调用]]></title><link>https://blog.csdn.net/pyf09/article/details/115235476</link><guid>https://blog.csdn.net/pyf09/article/details/115235476</guid><author>pyf09</author><pubDate>Fri, 26 Mar 2021 11:51:49 +0800</pubDate><description><![CDATA[以下内容转载自https://mp.weixin.qq.com/s/CXhc71UZtbdbAo15xbJ6_Q

原创爱写程序的阿波张源码游记2019-04-24

我们将在最后一章讨论有关系统调用方面的抢占调度，所以这里有必要对系统调用有个基本的了解。

系统调用是指使用类似函数调用的方式调用操作系统提供的API。

虽然从概念上来说系统调用和函数调用差不多，但本质上它们有很大的不同，操作系统的代码位于内核地址空间，而CPU在执行用户代码时特权等级很低，无权访问需要最高优先级才能访问的内核地址空...]]></description><category></category></item><item><title><![CDATA[go语言调度器源代码情景分析之七：函数调用过程]]></title><link>https://blog.csdn.net/pyf09/article/details/115219485</link><guid>https://blog.csdn.net/pyf09/article/details/115219485</guid><author>pyf09</author><pubDate>Thu, 25 Mar 2021 21:38:08 +0800</pubDate><description><![CDATA[以下内容转载自https://mp.weixin.qq.com/s/3RUjui-q6bgRnUW7TgOjmA

原创爱写程序的阿波张源码游记2019-04-22

前面几节我们介绍了CPU寄存器、内存、汇编指令以及栈等基础知识，为了达到融会贯通加深理解的目的，这一节我们来综合运用一下所学知识，看看函数的执行和调用过程。

本节我们需要重点关注的问题有：


	CPU是如何从调用者跳转到被调用函数执行的？
	
	
	参数是如何从调用者传递给被调用函数的？
	
	
	函数局部变量所占内存是怎么在栈上...]]></description><category></category></item></channel></rss>