golang的goroutine是如何实现的?

我知道同步并发的原理是利用进程或者线程,由操作系统调度;异步并发的原理是DMA,即不经过CPU直接把IO的某一快copy到memory上或者反之,那么,新学golang的我想知道,golang的所谓goroutine (协程)如何实现的?
关注者
1343
被浏览
94345

前面的人已经说的非常好了,这里再补充一下 goroutine 是如何切换的。

golang 里面的 M struct ,也就是系统线程,里面包含一个 g0,结构如下

type m struct {
    g0 *g
}

也就是说当 goroutine 跑起来的时候除了 G 本身的 stack,M 里面还有一个 g0 statck,那么这个 g0 是用来干嘛的呢?对,就是用来切换的时候保存上下文的。

当 goroutine 切换的时候,M 先将执行栈切换到 g0上,然后将 g 的 context 保存下来。