Golang协程调度器scheduler怎么使用(golang,scheduler,开发技术)

时间:2024-05-07 04:02:27 作者 : 石家庄SEO 分类 : 开发技术
  • TAG :

这篇文章主要介绍“Golang协程调度器scheduler怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Golang协程调度器scheduler怎么使用”文章能帮助大家解决问题。

1. 调度器scheduler的作用

我们都知道,在Go语言中,程序运行的最小单元是gorouines。

然而程序的运行最终都是要交给操作系统来执行的,以Java为例,Java中的一个线程对应的就是操作系统中的线程,以此来实现在操作系统中的运行。在Go中,gorouines比线程更轻量级,其与操作系统的线程也不是一一对应的关系,然而,最终我们想要执行程序,还是要借助操作系统的线程来完成,调度器scheduler的工作就是完成gorouines到操作系统线程的调度。

2. GMP模型

Golang协程调度器scheduler怎么使用

当我们运行go fun(){}时,会生成一个g,优先放置在创建他的p的本地队列中,如果本地队列已满,那么会放置在全局队列中。

g的运行需要借助p与m,p是执行器,只有获得p的g才能执行,p的执行需要挂在m上,m对应的是操作系统中的线程,p的数量与CPU的核数相同。

goroutine运行所需要的上下文信息都是存放在g的数据结构当中的,所以g可以依靠任意的p或者m执行,而对于操作系统而言,其并不能看到p与g的调度过程,这些过程对于操作系统线程来说都是连续的,所以省去了线程上下文切换的开销。

g的数据结构如下所示:

typegstruct{stackstack//g自己的栈m*m//执行当前g的mschedgobuf//保存了g的现场,goroutine切换时通过它来恢复atomicstatusuint32//g的状态Gidle,Grunnable,Grunning,Gsyscall,Gwaiting,Gdeadgoidint64schedlinkguintptr//下一个g,g链表preemptbool//抢占标记lockedmmuintptr//锁定的M,g中断恢复指定M执行gopcuintptr//创建该goroutine的指令地址startpcuintptr//goroutine函数的指令地址}

p的数据结构如下所示:

typepstruct{idint32statusuint32//状态linkpuintptr//下一个P,P链表mmuintptr//拥有这个P的Mmcache*mcache//P本地runnable状态的G队列runqheaduint32runqtailuint32runq[256]guintptrrunnextguintptr//一个比runq优先级更高的runnableG//状态为dead的G链表,在获取G时会从这里面获取gFreestruct{gListnint32}gcBgMarkWorkerguintptr//(atomic)gcwgcWork}

m的数据结构如下所示:

typemstruct{g0*g//g0,每个M都有自己独有的g0curg*g//当前正在运行的gppuintptr//当前用于的pnextppuintptr//当m被唤醒时,首先拥有这个pidint64spinningbool//是否处于自旋parknotealllink*m//onallmschedlinkmuintptr//下一个m,m链表mcache*mcache//内存分配lockedgguintptr//和G的lockedm对应freelink*m//onsched.freem}

通过gmp模型,我们能解决gorouines到操作系统线程的映射问题,gorouines之间的切换是在用户态完成的,在操作系统的视角来看,线程的上下文切换并不频繁,因此就少了很多陷入内核的过程,所以有更好的并发效果。

3. 调度机制

1)work stealing机制

当一个p上的g执行完之后,他会尝试从其他的p队列中窃取g来执行,以减少操作系统线程的切换动作。

2)hand off机制

这个是针对m来说的,有的时候m可能因为g的信号调用而被操作系统阻塞,这个时候p就会挂载去另一个m继续执行可以执行的g,当阻塞的m就绪之后,会给p发信号,召唤他回来继续进行后续操作。

关于“Golang协程调度器scheduler怎么使用”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注亿速云行业资讯频道,小编每天都会为大家更新不同的知识点。

本文:Golang协程调度器scheduler怎么使用的详细内容,希望对您有所帮助,信息来源于网络。
上一篇:echarts怎么实现动态曲线图下一篇:

14 人围观 / 0 条评论 ↓快速评论↓

(必须)

(必须,保密)

阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18