理解GPM
Go语言的scheduler的实现原理
Go语言中支撑整个scheduler实现的主要有四个结构,分别是G、P、M、Sched,前三个定义在runrtime.h,Sched定义在proc.c中。
- Sched结构就是调度器,维护了存储M和G的队列,以及调度器的一切状态信息
- G是goroutine实现的核心结构,是对一个要并发执行的任务的封装,可以称作为用户态的线程,属于用户级资源,对操作系统透明,轻量级,可以大量创建,上下文的切换成本低。
- P是Processor,逻辑处理器,主要作用是管理G对象,并为G在M上的运行提供本地化资源,他维护了一个goroutine队列runqueue,也可以理解为goroutine的上下文环境。
- M是Machine,是利用系统调用创建出来的操作系统线程实体,作用是执行G中的并发任务,代表了一个内核线程,由操作系统管理,goroutine就是运行在M上的,M中维护了小对象内存mcache,当前执行的goroutine,随机数发生器等信息。
runtime包
runtime类似于Java或者.Net中的虚拟机,负责内存分配,垃圾回收,goroutine,chanel,切片,map,反射等等。
未完待续。。。。
参考资料:bilibili