Skip to content
All notes

Go 语言八股问答

以问题和回答的形式整理 Go 语言面试知识。

Go 语言八股问答

Google Chrome 2026-10-18 16.11.59.png

1. 讲一下协程、线程、进程

回答

进程是操作系统分配资源的基本单位。线程是进程内被 CPU 调度执行的基本单位,协程是用户态或语言运行时管理的轻量执行单元。

进程有独立地址空间和系统资源;同一进程内的线程共享地址空间、文件句柄等资源,同时各自拥有栈和寄存器上下文;Go 里的 goroutine 由 Go runtime 调度,并多路复用到多个 OS 线程上执行。

要点

  • 进程:资源容器,拥有虚拟地址空间、打开的文件、权限上下文等资源。
  • 线程:调度实体,同一进程内线程共享进程资源,各自有栈、寄存器和线程局部状态。
  • 协程:用户态/运行时层面的任务抽象,切换更轻,适合组织大量并发任务。
  • Go goroutine:初始栈小,由 runtime 调度,阻塞 I/O 时 runtime 会让其他 goroutine 继续运行。
  • 成本关系:进程切换涉及地址空间等资源切换;线程切换依赖内核调度;goroutine 调度成本更低。

2. GMP 中为什么需要 P

回答

P 的本质,是把“调度能力”从 OS Thread M 身上拆出来。

如果只有 G 和 M,大量 M 从一个全局 Goroutine 队列取任务,会造成全局队列严重的锁竞争;如果把任务队列直接绑定到每个 M 上,那么当某个 OS Thread 因系统调用等原因阻塞时,它对应的调度资源和待执行 Goroutine 也会受到影响,本质上是 G 的调度状态和 M 耦合得太深。G 太依赖 M。

因此 Go 引入 P,把执行 Goroutine 所需的调度资源从 M 中抽离出来。每个 P 维护本地运行队列,减少全局锁竞争;M 需要绑定 P 才能执行 Go 代码,当 M 阻塞时,P 可以解绑并交给其他 M 继续运行;同时 P 的数量由 GOMAXPROCS 控制,用来限制 Go 代码的并行度。