一、goroutine是什么?
是go里的一种轻量级线程-协程
1、相对线程,协程的优势在于它非常轻量级,进行上下文切换的代价非常小
2、相对于一个goroutine,每个结构中有一个sched的属性就是用来保存它上下文的,这样,goroutine就可以很轻易的来回切换
3、由于其上下文切换在用户态下发生,根本不必进入内核态,所以速度很快。而且只有当前goroutine的pc,sp等少量信息需要保存
4、在go语言中,每一个并发的执行单元为一个goroutine
go语言中的goroutine并发,采用的是CSP(communicating sequential processes)并发模型,讲究的是以通讯的方式来进行数据共享,是通过goroutine配合channel的方式来实现的。
二、既然它是比线程还小的粒度,那么它与线程有什么关系?
go语言的线程模型就是一种特殊的两级线程模型,如下图所示:
两级线程模型的实现非常复杂,和内核级线程模型类似,一个进程中可以对应多个内核级线程,但是进程中的线程不和内核线程一一对应;这种线程模型会先创建多个内核级线程,然后用自身的用户级线程去对应创建的多个内核级线程,自身的用户级线程需要本身去调度,内核级的线程交给操作系统内核去调度
三、goroutine的调度策略
1、介绍一下go线程实现的MPG模型:
S(