六. Go 协程调度原理相关
文章平均质量分 91
Go 协程调度原理相关
苹果香蕉西红柿
这个作者很懒,什么都没留下…
展开
-
九. go 高性能编程之 超时场景如何退出协程 goroutine
【代码】九. go 高性能编程之 超时场景如何退出协程 goroutine。原创 2023-05-05 09:14:11 · 437 阅读 · 0 评论 -
十一. go 高性能编程之 控制协程并发数量
【代码】十一. go 高性能编程之 控制协程并发数量。原创 2023-05-04 10:01:18 · 193 阅读 · 0 评论 -
十. go 高性能编程之 其它场景何退出协程 goroutine
情形二:一个接收者和N个发送者,此唯一接收者通过关闭一个额外的信号通道来通知发送者不要再发送数据了。情形三:M个接收者和N个发送者,它们中的任何协程都可以让一个中间调解协程帮忙发出停止数据传送的信号。情形一:M个接收者和一个发送者,发送者通过关闭用来传输数据的通道来传递发送结束信号。原创 2023-05-04 10:00:57 · 70 阅读 · 0 评论 -
go 进阶 协程相关: 六. 协程问题总结
先简述一下协程调度过程,以创建新的G为例创建G时,会先判断有没有空闲的P,有的话创建M绑定P,将新的G放到该P队列中。如果没有空闲P,判断当前P队列是否满了,没满的话就放到P队列中,如果满了,会将P中的一半连同新的G一起放到全局队列中。M周期性的从P中取出G来执行,并且定期从全局队列中取出G来执行,防止全局队列中的G被饿死。当M因为当前G陷入系统调用或者阻塞时,M会记住当前的P,然后解绑P,P如果没有G了,就会进入空闲状态,如果有G会从M缓存池取空闲的M或者创建一个M来继续执行队列中的G。原创 2023-04-25 11:38:34 · 460 阅读 · 0 评论 -
go 进阶 协程相关: 五. 协程底层从Main方法到调度器
M 是指OS 内核线程在用户态的映射(可以直接看成内核线程), 代表着真正执行计算的资源,在绑定有效的 P 后,进入 schedule 循环;而 schedule 循环的机制大致是从 Global 队列、P 的 Local 队列以及 wait 队列中获取P表示逻辑处理器,对 G 来说,P 相当于 CPU 核,G 只有绑定到 P 才能被调度。对 M 来说,P 提供了相关的执行环境(Context),如内存分配状态(mcache),任务队列(G)等。在runtime中使用 p 结构表示。原创 2023-04-25 11:38:05 · 112 阅读 · 0 评论 -
go 进阶 协程相关: 三. 协程底层引出main方法执行流程
M0 是什么?golang程序运行时可以启动多个M,其中第一个启动的叫 M0。G0 是什么?G 分三种:第一种是执行用户任务的叫做 G第二种执行 runtime 下调度工作的叫 G0,每个 M 都绑定一个 G0第三种则是启动 runtime.main 用到的 G。写程序接触到的基本都是第一种。原创 2023-04-25 11:37:48 · 122 阅读 · 0 评论 -
go 进阶 协程相关: 四. 协程G的获取
首先创建一个G对象,G对象保存到P本地队列或者是全局队列。P此时去唤醒一个M。P继续执行它的执行序。M寻找是否有空闲的P,如果有则将该G对象移动到它本身。接下来M执行一个调度循环(调用G对象->执行->清理线程→继续找新的Goroutine执行)。M执行过程中,随时会发生上下文切换。当发生上线文切换时,需要对执行现场进行保护,以便下次被调度执行时进行现场恢复。Go调度器M的栈保存在G对象上,只需要将M所需要的寄存器(SP、PC等)保存到G对象上就可以实现现场保护。原创 2023-04-25 11:37:31 · 157 阅读 · 0 评论 -
go 进阶 协程相关: 二. 协程MPG在代码中对应结构体详解
每个 m 都持有一个特殊的goroutine,我们称之为g0,它具有调度栈的能力。调度和执行系统调用时会先切换到这个gm 可以与一个G相绑定,字段 curgm 可以与P绑定,也可以不绑定,如果已绑定则字段p不非nilm 可以记录下次和上次绑定的p,字段 nextp 和 oldp如果m 没有工作可做的话,它会通过自旋积极再找一个活干m会不会在 note 阻塞可以记录对m完成抢占信息的次数一个m最多可以持有10个锁。原创 2023-04-25 11:37:01 · 166 阅读 · 0 评论 -
go 进阶 协程相关: 一. 协程基础与MPG线程模型(协程原理)
操作系统会把内存分为内核空间和用户空间,内核空间的指令代码具备直接调度计算机底层资源的权限,而用户空间的指令代码没有访问计算机底层资源的能力,需要通过系统调用等方式切换至内核态从而进行计算机底层资源的申请和调度。一个cpu同一时间只能调度一个线程,多线程其实是cpu快速的在多个线程之间进行切换,造成多个线程同时执行的假象,提高cpu利用率。3.由于多个协程都要方法到一个map,map需要定义为全局的。1.编写函数,计算各个数的阶乘,将阶乘结果存入map中。原创 2023-04-25 11:36:19 · 463 阅读 · 0 评论