|
28 | 28 | <meta property="og:description" content="GMP 协程 协程是用户态的概念。多个协程实际上映射为1个线程。 协程是用户态概念,因此创建、销毁、调度都在用户态完成,不需要切换内核态。 由于协程从属于同一个内核级线程,因此实际上无法并行;而一个协程的阻塞最终也会导致整个线程下的所有协程阻塞。 Goroutine Go解耦了协程和线程的绑定关系,从而使线程变为一个中间层,协程可以灵活地映射到不同的线程上,相当于“虚拟线程”。 好处"> |
29 | 29 | <meta property="og:locale" content="zh_CN"> |
30 | 30 | <meta property="article:published_time" content="2025-05-25T16:00:00.000Z"> |
31 | | -<meta property="article:modified_time" content="2025-05-28T11:57:28.874Z"> |
| 31 | +<meta property="article:modified_time" content="2025-06-02T06:49:22.251Z"> |
32 | 32 | <meta property="article:author" content="SIMULEITE"> |
33 | 33 | <meta property="article:tag" content="知识"> |
34 | 34 | <meta name="twitter:card" content="summary"> |
|
141 | 141 | <div class="sidebar-panel-container"> |
142 | 142 | <!--noindex--> |
143 | 143 | <div class="post-toc-wrap sidebar-panel"> |
144 | | - <div class="post-toc animated"><ol class="nav"><li class="nav-item nav-level-1"><a class="nav-link" href="#gmp"><span class="nav-text"> GMP</span></a><ol class="nav-child"><li class="nav-item nav-level-2"><a class="nav-link" href="#%E5%8D%8F%E7%A8%8B"><span class="nav-text"> 协程</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#goroutine"><span class="nav-text"> Goroutine</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#gmp-2"><span class="nav-text"> GMP</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#g"><span class="nav-text"> G</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#m"><span class="nav-text"> M</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#p"><span class="nav-text"> P</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#g0%E4%B8%8Eg%E7%9A%84%E8%BD%AC%E6%8D%A2"><span class="nav-text"> g0与g的转换</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#goroutine%E8%B0%83%E5%BA%A6"><span class="nav-text"> Goroutine调度</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#%E4%B8%BB%E5%8A%A8%E8%B0%83%E5%BA%A6"><span class="nav-text"> 主动调度</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E8%A2%AB%E5%8A%A8%E8%B0%83%E5%BA%A6"><span class="nav-text"> 被动调度</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E6%AD%A3%E5%B8%B8%E8%B0%83%E5%BA%A6"><span class="nav-text"> 正常调度</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E6%8A%A2%E5%8D%A0%E8%B0%83%E5%BA%A6"><span class="nav-text"> 抢占调度</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#schedule"><span class="nav-text"> schedule()</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#findrunnable"><span class="nav-text"> findRunnable()</span></a><ol class="nav-child"><li class="nav-item nav-level-4"><a class="nav-link" href="#stealwork"><span class="nav-text"> stealWork()</span></a></li></ol></li><li class="nav-item nav-level-3"><a class="nav-link" href="#execute"><span class="nav-text"> execute()</span></a></li></ol></li></ol></li></ol></div> |
| 144 | + <div class="post-toc animated"><ol class="nav"><li class="nav-item nav-level-1"><a class="nav-link" href="#gmp"><span class="nav-text"> GMP</span></a><ol class="nav-child"><li class="nav-item nav-level-2"><a class="nav-link" href="#%E5%8D%8F%E7%A8%8B"><span class="nav-text"> 协程</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#goroutine"><span class="nav-text"> Goroutine</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#gmp-2"><span class="nav-text"> GMP</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#g"><span class="nav-text"> G</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#m"><span class="nav-text"> M</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#p"><span class="nav-text"> P</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#g0%E4%B8%8Eg%E7%9A%84%E8%BD%AC%E6%8D%A2"><span class="nav-text"> g0与g的转换</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#goroutine%E8%B0%83%E5%BA%A6"><span class="nav-text"> Goroutine调度</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#%E4%B8%BB%E5%8A%A8%E8%B0%83%E5%BA%A6"><span class="nav-text"> 主动调度</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E8%A2%AB%E5%8A%A8%E8%B0%83%E5%BA%A6"><span class="nav-text"> 被动调度</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E6%AD%A3%E5%B8%B8%E8%B0%83%E5%BA%A6"><span class="nav-text"> 正常调度</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E6%8A%A2%E5%8D%A0%E8%B0%83%E5%BA%A6"><span class="nav-text"> 抢占调度</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#schedule"><span class="nav-text"> schedule()</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#findrunnable"><span class="nav-text"> findRunnable()</span></a><ol class="nav-child"><li class="nav-item nav-level-4"><a class="nav-link" href="#stealwork"><span class="nav-text"> stealWork()</span></a></li></ol></li><li class="nav-item nav-level-3"><a class="nav-link" href="#execute"><span class="nav-text"> execute()</span></a></li></ol></li></ol></li><li class="nav-item nav-level-1"><a class="nav-link" href="#geohash"><span class="nav-text"> GeoHash</span></a></li></ol></div> |
145 | 145 | </div> |
146 | 146 | <!--/noindex--> |
147 | 147 |
|
@@ -223,7 +223,7 @@ <h1 class="post-title" itemprop="name headline"> |
223 | 223 | <i class="far fa-calendar-check"></i> |
224 | 224 | </span> |
225 | 225 | <span class="post-meta-item-text">更新于</span> |
226 | | - <time title="修改时间:2025-05-28 19:57:28" itemprop="dateModified" datetime="2025-05-28T19:57:28+08:00">2025-05-28</time> |
| 226 | + <time title="修改时间:2025-06-02 14:49:22" itemprop="dateModified" datetime="2025-06-02T14:49:22+08:00">2025-06-02</time> |
227 | 227 | </span> |
228 | 228 |
|
229 | 229 |
|
@@ -313,6 +313,8 @@ <h4 id="stealwork"><a class="markdownIt-Anchor" href="#stealwork"></a> stealWork |
313 | 313 | </ul> |
314 | 314 | <h3 id="execute"><a class="markdownIt-Anchor" href="#execute"></a> execute()</h3> |
315 | 315 | <figure class="highlight go"><table><tr><td class="code"><pre><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">execute</span><span class="params">(gp *g, inheritTime <span class="type">bool</span>)</span></span> {</span><br><span class="line"> _g_ := getg()</span><br><span class="line"></span><br><span class="line"> _g_.m.curg = gp</span><br><span class="line"> <span class="comment">// 映射Processor与Machine</span></span><br><span class="line"> gp.m = _g_.m</span><br><span class="line"> <span class="comment">// CAS切换状态</span></span><br><span class="line"> casgstatus(gp, _Grunnable, _Grunning)</span><br><span class="line"> gp.waitsince = <span class="number">0</span></span><br><span class="line"> gp.preempt = <span class="literal">false</span></span><br><span class="line"> gp.stackguard0 = gp.stack.lo + _StackGuard</span><br><span class="line"> <span class="keyword">if</span> !inheritTime {</span><br><span class="line"> <span class="comment">// 更新调度次数</span></span><br><span class="line"> _g_.m.p.ptr().schedtick++</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">// 执行Goroutine任务</span></span><br><span class="line"> gogo(&gp.sched)</span><br><span class="line">}</span><br></pre></td></tr></table></figure> |
| 316 | +<h1 id="geohash"><a class="markdownIt-Anchor" href="#geohash"></a> GeoHash</h1> |
| 317 | + |
316 | 318 | </div> |
317 | 319 |
|
318 | 320 |
|
|
0 commit comments