Go语言GPM并发模型

Go语言的G-P-M模型

G:goroutine,表示一个协程对象,用go关键字加函数调用即可创建一个G对象,它是对并发执行任务的封装,也可以看作是一种特殊的协程,G属于用户级资源,对操作系统透明,非常轻量级,可以大量创建,且上下文切换成本比较低

M:machine的简称,可以看作是利用系统调用创建出来的操作系统上的线程实体,M的作用就是执行G中封装的并发任务,M属于操作系统资源,可创建的数量受限于操作系统, 一般来说G的数量都多于M的数量

P:processor的简称,表示逻辑处理器,每个P都有一个G队列,主要用于管理G对象,并为G在M上的运行提供本地化资源

M与P是一对一的关系,M会从P的本地队列中弹出一个可运行状态的G来执行,如果P中的本地队列为空,就会执行窃取

进程,线程,协程的概念

进程:process,进程是操作系统进行资源分配和调度的基本单位,是操作系统结构的基础,每个进程都有自己的独立内存空间,不同进程通过;进程间的通信机制来通信,进程间上下文的切换开销比较大,但相对比较稳定,安全。从理论上来讲,进程是对正在运行的程序过程的抽象

线程:thread,线程是进程中的一个实体,拥有自己独立的栈和共享堆,线程的切换一般是由操作系统调度,进程和线程是一对多的关系;一个进程由多个线程构成,而一个线程必属于一个进程

协程:goroutine,又称为轻量级的线程,协程是一种用户态的轻量级线程,调度完全由用户控制,协程拥有自己的寄存器上下文和栈,上下文的切换非常快,一个线程可以由多个协程组成

线程和协程的主要区别

线程的调度方式是抢占式的,如果一个线程的执行时间超过了分配给它的时间片,那么它就会被其他可执行的线程抢占;
协程的调度是协同式的,在协同式调度中没有时间片的概念,为了并发执行协程,调度器会在以下几种时间点对其进行切换:

  • 1通道channel接收或者发送会造成阻塞的消息
  • 2垃圾回收
  • 3文件和网络操作