【问题标题】:Why are goroutines much cheaper than threads in other languages?为什么 goroutines 比其他语言的线程便宜得多?
【发布时间】:2017-01-28 04:32:48
【问题描述】:

在他的演讲 - https://blog.golang.org/concurrency-is-not-parallelism 中,Rob Pike 说 go 例程类似于线程,但要便宜得多。谁能解释一下原因?

【问题讨论】:

    标签: go goroutine


    【解决方案1】:

    见“How goroutines work”。
    它们在以下方面更便宜:

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

    另外,正如“Go’s march to low-latency GC”中提到的,当运行时负责管理 goroutine 时,GC 更容易实现:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-01
      • 2021-03-27
      • 2014-01-21
      相关资源
      最近更新 更多