弄懂goroutine调度原理
goroutine简介 golang语言作者Rob Pike说, “Goroutine是一个与其他goroutines 并发运行在同一地址空间的Go函数或方法。一个运行的程序由一个或更多个goroutine组成。它与线程、协程、进程等不同。它是一个goroutine“ 。 goroutine通过通道来通信,而协程通过让出和恢复操作来通信; goroutine 通过Golang 的调度器进行调度,而协程通过程序本身调度; 简单的说就是Golang自己实现了协程并叫做goruntine(本文称Go协程),且比协程更强大。 goroutine调度原理 上面说到Go协程是通过Golang的调度器进行调度的,其中调度器的线程模型为两级线程模型。 有关两级线程模型的介绍,可以看 这篇文章 我们来看下Golang实现的两级线程模型是怎样的。首先要知道这三个字母代表的含义 M :代表内核级的线程 P :全程Processor,代表运行Go协程所需要的资源(上下文环境) G :代表Go协程 我们先看下为实现调度Golang定义了这些数据结构存M,P,G 名称 作用范围 描述 全局M列表 Go的运行时 存放所有M的单向链表 全局P列表 Go的运行时 存放所有P的数组 全局G列表 Go的运行时 存放所有G的切片 调度器的空闲M列表 调度器 存放空闲M的单向链表 调度器的空闲P列表 调度器