golang的goroutine调度模型

golang的goroutine调度模型

进程:一个在内存中运行的程序

线程:进程中的一个控制单元,一个进程至少由一个线程,也可以由多个线程,主要由CPU进行调度。

形象理解:进程就是一个生产某样产品的工厂,线程就是工厂里面的生产车间。

golang的goroutine是一个轻量化的线程。一个go主线程就可以轻轻松松起成千上万个goroutine。主要特点:

  1. 有独立的占空间
  2. 共享程序的堆空间
  3. 调度由用户掌控

golang的gouroutine的调度模型为MPG模型

  • M:操作系统的主线程(物理线程,由CPU调度)
  • P:协程执行所需要的上下文
  • 协程

golang起一个goroutine很简单,只需要一个关键字go就可以轻松起一个goroutine

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GYdaqagH-1663260806647)(C:\Users\fei\AppData\Roaming\Typora\typora-user-images\image-20220916001557361.png)]

  1. golang起的goroutine会放在一个全局队列中,全局队列遵循先进先出的原则
  2. M(线程)则从全局队列中获取goroutine,每个M(线程)获取goroutine的时候,会进行加锁操作,获取goroutine完成后再释放锁,以此保证安全
  3. P(上下文)负责管理一个本地队列,M(线程)一次性从全局队列中获

你可能感兴趣的:(golang,开发语言)