<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>源码解析 on PlumePHP</title><link>https://plumephp.com/tags/%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90/</link><description>Recent content in 源码解析 on PlumePHP</description><generator>Hugo</generator><language>zh-CN</language><lastBuildDate>Thu, 13 Aug 2026 10:00:00 +0800</lastBuildDate><atom:link href="https://plumephp.com/tags/%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90/index.xml" rel="self" type="application/rss+xml"/><item><title>Go 调度器 G-M-P 模型源码完全解析：从 goroutine 到线程的映射</title><link>https://plumephp.com/111-go-scheduler-gmp/</link><pubDate>Thu, 13 Aug 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/111-go-scheduler-gmp/</guid><description>&lt;h2 id="go-调度器的设计哲学为什么不用操作系统线程"&gt;Go 调度器的设计哲学：为什么不用操作系统线程&lt;/h2&gt;
&lt;p&gt;Go 语言将 goroutine 作为核心并发原语，其调度器的设计是整个语言运行时的灵魂所在。操作系统线程虽然是成熟的并发抽象，但在大规模并发场景下存在以下根本性问题。首先，线程的创建成本高昂。在 Linux 上创建一个线程需要分配栈空间（默认 8MB）、建立线程本地存储、注册到内核调度器，这些操作会带来数微秒甚至数十微秒的延迟。当应用需要同时运行数万乃至数十万个并发单元时，线程模型将耗尽系统资源。其次，线程上下文切换开销较大。CPU 在内核态和用户态之间切换需要保存和恢复寄存器状态、调整虚拟内存映射、刷新 TLB 缓存，在现代 CPU 上一次上下文切换的代价约为 1-2 微秒，而 goroutine 的切换仅需纳秒级别。&lt;/p&gt;</description></item></channel></rss>