<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Scheduler on Inkwell Corner</title>
    <link>https://xhyyx.pages.dev/tags/scheduler/</link>
    <description>Recent content in Scheduler on Inkwell Corner</description>
    <image>
      <title>Inkwell Corner</title>
      <url>https://i.postimg.cc/7hwBy7VS/calcr.png</url>
      <link>https://i.postimg.cc/7hwBy7VS/calcr.png</link>
    </image>
    <generator>Hugo</generator>
    <language>zh-cn</language>
    <copyright>©2026 Inkwell Corner</copyright>
    <lastBuildDate>Tue, 17 Sep 2024 10:15:38 +0800</lastBuildDate>
    <atom:link href="https://xhyyx.pages.dev/tags/scheduler/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Go runtime 调度器精讲（十一）：总览全局</title>
      <link>https://xhyyx.pages.dev/posts/go-runtime-scheduler-11/</link>
      <pubDate>Tue, 17 Sep 2024 10:15:38 +0800</pubDate>
      <guid>https://xhyyx.pages.dev/posts/go-runtime-scheduler-11/</guid>
      <description>&lt;h1 id=&#34;前言&#34;&gt;前言&lt;/h1&gt;
&lt;p&gt;前面用了十讲介绍了 Go runtime 调度器，这一讲结合一些图在总览下 Go runtime 调度器。&lt;/p&gt;
&lt;h1 id=&#34;状态转换图&#34;&gt;状态转换图&lt;/h1&gt;
&lt;p&gt;首先是 Goroutine 的状态转换图：&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;status process&#34; loading=&#34;lazy&#34; src=&#34;https://xhyyx.pages.dev/images/go-runtime-status-process.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;大部分转移路径前面几讲也介绍过，这里就不继续介绍了(下同)。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Go runtime 调度器精讲（十）：异步抢占</title>
      <link>https://xhyyx.pages.dev/posts/go-runtime-scheduler-10/</link>
      <pubDate>Mon, 16 Sep 2024 20:20:38 +0800</pubDate>
      <guid>https://xhyyx.pages.dev/posts/go-runtime-scheduler-10/</guid>
      <description>&lt;h1 id=&#34;前言&#34;&gt;前言&lt;/h1&gt;
&lt;p&gt;前面介绍了运行时间过长和系统调用引起的抢占，它们都属于协作式抢占。本讲会介绍基于信号的真抢占式调度。&lt;/p&gt;
&lt;p&gt;在介绍真抢占式调度之前看下 Go 的两种抢占式调度器：&lt;/p&gt;</description>
    </item>
    <item>
      <title>Go runtime 调度器精讲（九）：系统调用引起的抢占</title>
      <link>https://xhyyx.pages.dev/posts/go-runtime-schduler-9/</link>
      <pubDate>Mon, 16 Sep 2024 12:01:38 +0800</pubDate>
      <guid>https://xhyyx.pages.dev/posts/go-runtime-schduler-9/</guid>
      <description>&lt;h1 id=&#34;前言&#34;&gt;前言&lt;/h1&gt;
&lt;p&gt;第八讲介绍了当 goroutine 运行时间过长会被抢占的情况。这一讲继续看 goroutine 执行系统调用时间过长的抢占。&lt;/p&gt;
&lt;h1 id=&#34;系统调用时间过长的抢占&#34;&gt;系统调用时间过长的抢占&lt;/h1&gt;
&lt;p&gt;看下面的示例：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt; 1&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;func&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;longSyscall&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt; 2&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;	&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;timeout&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;syscall&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;NsecToTimeval&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;int64&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;5&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;time&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;Second&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt; 3&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;	&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;fds&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;make&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;([]&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;syscall&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;FdSet&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt; 4&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt; 5&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;	&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;err&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;syscall&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Select&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;fds&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nil&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nil&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;timeout&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;err&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nil&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt; 6&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;		&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Println&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Error:&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;err&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt; 7&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;	&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt; 8&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt; 9&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;	&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Println&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Select returned after timeout&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;11&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;12&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;func&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;13&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;	&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;threads&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;runtime&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;GOMAXPROCS&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;14&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;	&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;threads&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;++&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;15&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;		&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;go&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;longSyscall&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;16&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;	&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;17&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;18&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;	&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;time&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Sleep&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;8&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;time&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;Second&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;19&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;longSyscall goroutine 执行一个 5s 的系统调用，在系统调用过程中，sysmon 会监控 longSyscall，发现执行系统调用过长，会对其抢占。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Go runtime 调度器精讲（八）：运行时间过长的抢占</title>
      <link>https://xhyyx.pages.dev/posts/go-runtime-scheduler-8/</link>
      <pubDate>Mon, 16 Sep 2024 01:10:38 +0800</pubDate>
      <guid>https://xhyyx.pages.dev/posts/go-runtime-scheduler-8/</guid>
      <description>&lt;h1 id=&#34;前言&#34;&gt;前言&lt;/h1&gt;
&lt;p&gt;在 &lt;a href=&#34;https://www.cnblogs.com/xingzheanan/p/18415503&#34;&gt;Go runtime 调度器精讲（七）：案例分析&lt;/a&gt; 一文我们介绍了一个抢占的案例。从案例分析抢占的实现，并未涉及到源码层面。本文将继续从源码入手，看 Go runtime 调度器是如何实现抢占逻辑的。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Go runtime 调度器精讲（七）：案例分析</title>
      <link>https://xhyyx.pages.dev/posts/go-runtime-scheduler-7/</link>
      <pubDate>Sun, 15 Sep 2024 18:21:38 +0800</pubDate>
      <guid>https://xhyyx.pages.dev/posts/go-runtime-scheduler-7/</guid>
      <description>&lt;h1 id=&#34;前言&#34;&gt;前言&lt;/h1&gt;
&lt;p&gt;前面用了六讲介绍 Go runtime 调度器，这一讲我们看一个关于调度 goroutine 的程序案例分析下调度器做了什么。需要说明的是，这个程序和抢占有关，抢占目前为止还没有介绍到，如果看不懂也没有关系，有个印象就行。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Go runtime 调度器精讲（六）：非 main goroutine 运行</title>
      <link>https://xhyyx.pages.dev/posts/go-runtime-scheduler-6/</link>
      <pubDate>Sat, 14 Sep 2024 18:40:38 +0800</pubDate>
      <guid>https://xhyyx.pages.dev/posts/go-runtime-scheduler-6/</guid>
      <description>&lt;h1 id=&#34;前言&#34;&gt;前言&lt;/h1&gt;
&lt;p&gt;在 &lt;a href=&#34;https://www.cnblogs.com/xingzheanan/p/18411879&#34;&gt;Go runtime 调度器精讲（三）：main goroutine 创建&lt;/a&gt; 介绍了 main goroutine 的创建，文中我们说 main goroutine 和非 main goroutine 有区别。当时卖了个关子并未往下讲，这一讲我们会继续介绍非 main goroutine (也就是 go 关键字创建的 goroutine，后文统称为 gp) 的运行，并且把这个关子解开，说一说它们的区别在哪儿。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Go runtime 调度器精讲（五）：调度策略</title>
      <link>https://xhyyx.pages.dev/posts/go-runtime-scheduler-5/</link>
      <pubDate>Sat, 14 Sep 2024 12:38:38 +0800</pubDate>
      <guid>https://xhyyx.pages.dev/posts/go-runtime-scheduler-5/</guid>
      <description>&lt;h1 id=&#34;前言&#34;&gt;前言&lt;/h1&gt;
&lt;p&gt;在 &lt;a href=&#34;https://www.cnblogs.com/xingzheanan/p/18412514&#34;&gt;第四讲&lt;/a&gt; 我们介绍了 main goroutine 是如何运行的。其中针对 main goroutine 介绍了调度函数 schedule 是怎么工作的，对于整个调度器的调度策略并没有介绍，这点是不完整的，这一讲会完善调度器的调度策略部分。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Go runtime 调度器精讲（四）：运行 main goroutine</title>
      <link>https://xhyyx.pages.dev/posts/go-runtime-scheduler-4/</link>
      <pubDate>Fri, 13 Sep 2024 17:24:38 +0800</pubDate>
      <guid>https://xhyyx.pages.dev/posts/go-runtime-scheduler-4/</guid>
      <description>&lt;h1 id=&#34;前言&#34;&gt;前言&lt;/h1&gt;
&lt;p&gt;皇天不负有心人，终于我们到了运行 main goroutine 环节了。让我们走起来，看看一个 goroutine 到底是怎么运行的。&lt;/p&gt;
&lt;h1 id=&#34;运行-goroutine&#34;&gt;运行 goroutine&lt;/h1&gt;
&lt;p&gt;稍微回顾下前面的内容，第一讲 Go 程序初始化，介绍了 Go 程序是怎么进入到 runtime 的，随之揭开 runtime 的面纱。第二讲，介绍了调度器的初始化，要运行 goroutine 调度器是必不可少的，只有调度器准备就绪才能开始工作。第三讲，介绍了 main goroutine 是如何创建出来的，只有创建一个 goroutine 才能开始运行，否则执行代码无从谈起。这一讲，我们继续介绍如何运行 main goroutine。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Go runtime 调度器精讲（三）：main goroutine 创建</title>
      <link>https://xhyyx.pages.dev/posts/go-runtime-scheduler-3/</link>
      <pubDate>Fri, 13 Sep 2024 11:23:38 +0800</pubDate>
      <guid>https://xhyyx.pages.dev/posts/go-runtime-scheduler-3/</guid>
      <description>&lt;h1 id=&#34;前言&#34;&gt;前言&lt;/h1&gt;
&lt;p&gt;回顾下 &lt;a href=&#34;https://www.cnblogs.com/xingzheanan/p/18408706&#34;&gt;上一讲&lt;/a&gt; 的内容。主线程 m0 蓄势待发，准备干活。g0 为 m0 提供了执行环境，P 和 m0 绑定，为 m0 提供活，也就是 goroutine。那么问题来了，活呢？哪里有活给 m0 干？&lt;/p&gt;</description>
    </item>
    <item>
      <title>Go runtime 调度器精讲（二）：调度器初始化</title>
      <link>https://xhyyx.pages.dev/posts/go-runtime-scheduler-2/</link>
      <pubDate>Wed, 11 Sep 2024 18:27:38 +0800</pubDate>
      <guid>https://xhyyx.pages.dev/posts/go-runtime-scheduler-2/</guid>
      <description>&lt;h1 id=&#34;前言&#34;&gt;前言&lt;/h1&gt;
&lt;p&gt;&lt;a href=&#34;https://www.cnblogs.com/xingzheanan/p/18407990&#34;&gt;上一讲&lt;/a&gt; 介绍了 Go 程序初始化的过程，这一讲继续往下看，进入调度器的初始化过程。&lt;/p&gt;
&lt;p&gt;接着上一讲的执行过程，省略一些不相关的代码，执行到 &lt;a href=&#34;https://github.com/golang/go/blob/master/src/runtime/asm_amd64.s#L343&#34;&gt;runtime/asm_amd64.s:rt0_go:343L&lt;/a&gt;：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;dlv&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; si
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;        asm_amd64.s:343 0x45431c*       8b442418        mov eax, dword ptr &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;rsp+0x18&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;       // &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;rsp+0x18&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; 存储的是 argc 的值，eax &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; argc
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;        asm_amd64.s:344 0x454320        &lt;span class=&#34;m&#34;&gt;890424&lt;/span&gt;          mov dword ptr &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;rsp&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;, eax            // 将 argc 移到 rsp，&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;rsp&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; argc
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;4&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;        asm_amd64.s:345 0x454323        488b442420      mov rax, qword ptr &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;rsp+0x20&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;       // &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;rsp+0x20&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; 存储的是 argv 的值，rax &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;rsp+0x20&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;5&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;        asm_amd64.s:346 0x454328        &lt;span class=&#34;m&#34;&gt;4889442408&lt;/span&gt;      mov qword ptr &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;rsp+0x8&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;, rax        // 将 argv 移到 &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;rsp+0x8&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;，&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;rsp+0x8&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; argv
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;6&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;        asm_amd64.s:347 0x45432d        e88e2a0000      call &lt;span class=&#34;nv&#34;&gt;$runtime&lt;/span&gt;.args                  // 调用 runtime.args 处理栈上的 argc 和 argv
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;7&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;        asm_amd64.s:348 0x454332        e8c9280000      call &lt;span class=&#34;nv&#34;&gt;$runtime&lt;/span&gt;.osinit                // 调用 runtime.osinit 初始化系统核心数
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;8&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;        asm_amd64.s:349 0x454337        e8e4290000      call &lt;span class=&#34;nv&#34;&gt;$runtime&lt;/span&gt;.schedinit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;上述指令调用 &lt;code&gt;runtime.args&lt;/code&gt; 处理函数参数，接着调用 &lt;code&gt;runtime.osinit&lt;/code&gt; 初始化系统核心数。&lt;code&gt;runtime.osinit&lt;/code&gt; 在 &lt;a href=&#34;https://github.com/golang/go/blob/master/src/runtime/os_linux.go#L343&#34;&gt;runtime.os_linux.go&lt;/a&gt; 中定义：&lt;/p&gt;</description>
    </item>
    <item>
      <title>Go runtime 调度器精讲（一）：Go 程序初始化</title>
      <link>https://xhyyx.pages.dev/posts/go-runtime-scheduler-1/</link>
      <pubDate>Wed, 11 Sep 2024 11:43:38 +0800</pubDate>
      <guid>https://xhyyx.pages.dev/posts/go-runtime-scheduler-1/</guid>
      <description>&lt;h1 id=&#34;前言&#34;&gt;前言&lt;/h1&gt;
&lt;p&gt;本系列将介绍 Go runtime 调度器。要学好 Go 语言，runtime 运行时是绕不过去的，它相当于一层“操作系统”对我们的程序做“各种类型”的处理。其中，调度器作为运行时的核心，是必须要了解的内容。本系列会结合 Go plan9 汇编，深入到 runtime 调度器的源码层面去看程序运行时，goroutine 协程创建等各种场景下 runtime 调度器是如何工作的。&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
