为什么goroutines比其他语言的线程便宜得多?

aam*_*mir 5 go goroutine

在他的谈话- https://blog.golang.org/concurrency-is-not-parallelism,罗勃·派克说,去例程类似于线程,但很多便宜得多.有人可以解释原因吗?

Von*_*onC 5

请参阅“ goroutine 如何工作”。
\n它们在以下方面更便宜:

\n
    \n
  • 内存消耗:
    \n线程以大内存启动,而不是几 Kb。
  • \n
  • 设置和拆卸成本
    \n(这就是为什么你必须维护一个线程池)
  • \n
  • 切换成本
    \n线程是抢占式调度的,在线程切换期间,调度程序需要保存/恢复所有寄存器。
    \n与 Go 相反,Go 中运行时管理 Goroutine 从创建到调度再到拆卸的整个过程。并且要保存的寄存器数量更少。
  • \n
\n

另外,正如《Go\xe2\x80\x99s 迈向低延迟 GC》中提到的,当运行时负责管理 goroutine 时,GC 更容易实现:

\n
\n

自从 Go 1.5 中引入并发 GC 以来,运行时就一直跟踪 goroutine 自上次扫描其堆栈以来是否已执行。标记终止阶段将检查每个 goroutine 以查看它最近是否运行过,并重新扫描少数运行过的 goroutine。

\n

在 Go 1.7 中,运行时维护此类 goroutine 的单独简短列表。这样就不需要在用户代码暂停时查看整个 goroutine 列表,并且大大减少了可以触发 kernel\xe2\x80\x99s NUMA 相关内存迁移代码的内存访问次数。

\n
\n