Skip to content

运行时

Go 语言的运行时(runtime)是 Go 程序执行的核心基础设施,它负责管理程序的内存分配、垃圾回收、协程调度、系统监控等关键功能。与其他语言不同,Go 的运行时与用户代码紧密集成,这使得 Go 能够实现高效的并发编程和自动内存管理。

核心组件

Go 运行时主要由以下几个核心组件构成:

GMP 调度器

GMP 调度器是 Go 运行时最核心的组件之一,它负责将大量的 goroutine 合理地调度到有限的系统线程上执行。GMP 分别代表:

  • G (Goroutine):协程,Go 中的轻量级线程
  • M (Machine):系统线程,操作系统层面的执行线程
  • P (Processor):处理器,包含运行 Go 代码所需的资源

GMP 调度器的设计使得 Go 能够高效地支持成千上万的并发协程,是 Go 语言高并发特性的基石。

内存分配器

Go 的内存分配器负责管理堆内存的分配,其设计深受 Google TCMalloc 的影响。主要特点包括:

  • 多级缓存设计,减少锁竞争
  • 根据对象大小采用不同的分配策略
  • 自动决定对象分配在栈上还是堆上

内存分配器与垃圾回收器紧密配合,共同实现高效的内存管理。

垃圾回收器

Go 采用并发标记清除(Concurrent Mark-Sweep)垃圾回收算法,主要特点:

  • 三色标记算法
  • 写屏障技术实现并发回收
  • 低延迟,大部分情况下 STW 时间低于 100 微秒

Go 的垃圾回收器经过多年优化,已经能够满足绝大多数业务场景的性能需求。

系统监控器

系统监控器(sysmon)是一个独立的监控线程,负责:

  • 抢占长时间运行的协程
  • 检查是否需要触发垃圾回收
  • 监控系统状态并做出相应调整

它在后台持续运行,保障 Go 程序的稳定运行。

学习建议

建议按照以下顺序学习运行时的相关知识:

  1. 先学习 GMP 调度器,理解协程的调度机制
  2. 再学习 内存分配器,了解内存是如何分配的
  3. 然后学习 垃圾回收器,理解内存是如何回收的
  4. 最后学习 系统监控器,了解运行时的后台监控机制