![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
go gmp
文章平均质量分 62
gmp相关知识汇总
~AC~
这个作者很懒,什么都没留下…
展开
-
go gmp --- 场景驱动方式来入门gmp
本篇文章我将以场景驱动的方式以不同的case来看一下gmp到底是怎么工作的。场景1 新建G此时p的本地队列未满,由于局部性原理,G1新建G2后G2进入p的本地队列,因为G2很有可能与G1共享同一块内存。场景2 新建过多的G如果p的本地队列已经满了(有G3-G6),此时G2再去创建G7,由于本地队列已满,会将本地队列的一半G移到全局队列中,进行负载均衡。场景3 创建G唤醒空闲P和M在创建G时还会去尝试唤醒空闲P,然后看是否有空闲M,如果有则唤醒M,如果没有则新建M来绑定这个P,之后M进入自旋寻原创 2021-11-21 20:03:11 · 4521 阅读 · 0 评论 -
go gmp --- goroutine抢占调度源码分析
为什么需要goroutine抢占调度?通过本文我们已经知道,go会在每次调度goroutine的时候检查定时器是否就绪了,所以如果仅靠goroutine主动让出(系统调用阻塞、读写chan阻塞…)而不对运行时间过长的goroutine进行抢占的话,这些定时器的调度时间可能会与预期有很大的偏差。goroutine抢占调度怎么实现的呢?怎么发现某些goroutine需要被抢占?通过上面这篇文章我们知道在go程序启动时会调用runtime.main,而它会创建一个监控线程,这个监控线程很特殊,不会关联任何原创 2021-11-14 19:39:29 · 956 阅读 · 3 评论 -
系统性学习go gmp模型
前言本系列一部分内容是从互联网上摘录的,当然其中也有不少个人的心得。如有纰漏,敬请指出。本系列文章go的版本为1.15.6,可能和其他版本有些出入!!!不知不觉,写go也已经快要一年了,但仔细想想却一直没有深入去学习go。于是,借此机会就写下了这一系列文章。当然,go里面需要我探索的不只是gmp,还有内存模型、gc、并发数据结构等。目录本系列文章首先会介绍gmp的基础知识,然后会通过几种场景来加深读者对gmp的理解,之后会分析相关源码,深入底层。前置知识,go函数栈布局[前置知识,go程序原创 2021-10-24 19:40:39 · 1070 阅读 · 0 评论 -
go gmp ---goroutine回收及调度循环
经过前面的知识,我们已经知道一个m启动后会调用schedule进行一轮调度,那经过这一轮调度后这个m还会再进行下一轮调度么?答案是的,那我们来看一下schedule是怎么做到循环调度的。在分析goroutine创建代码newproc时我们已经知道,一个gouroutine执行完后会调用goexit,那我们来看一下是不是goexit实现了循环调度的功能呢?先看代码//asm_amd64.sTEXT runtime·goexit(SB),NOSPLIT,$0-0 BYTE $0x90 // NOP C原创 2021-10-20 10:32:00 · 325 阅读 · 0 评论 -
go gmp --- 启动流程源码分析
这里我们已经知道了go程序的入口,这篇文章主要是介绍go在启动时是怎么初始化的。先来看一下go启动函数rt0_go()的汇编代码。//go程序启动时初始化工作TEXT runtime·rt0_go(SB),NOSPLIT,$0 // 拷贝argc、argv // copy arguments forward on an even stack MOVQ DI, AX // argc MOVQ SI, BX // argv SUBQ $(4*8+7), SP // 2args 2aut原创 2021-10-18 17:01:21 · 800 阅读 · 0 评论 -
gdb查看go程序启动入口
本次测试环境为docker运行的centos创建main.gopackage mainfunc main() { go hello()}func hello() { println("hello world")}编译main.gogo build main.gogdb调试maingdb maininfo files //显示entry pointb *0x45bc8 //entry point处打断点上图可以看到程序入口为原创 2021-09-24 15:20:02 · 723 阅读 · 0 评论 -
go gmp --- goroutine创建源码newproc()分析
之前我们已经了解了GMP的基础知识,对G、M、P各自的职责和分工都有了大致的认识,本篇文章主要是介绍一个goroutine是怎么被创建出来的从一个简单的例子开始func TestNewGoroutine(t *testing.T) { go func() { sayHello() }()}func sayHello() { println("hello gmp")}编译文件 go tool compile -N -l -S new_goroutine_test.go得到汇编代码.原创 2021-10-16 16:48:13 · 618 阅读 · 0 评论 -
go函数栈布局
go中的函数栈布局是怎么样的呢?本文将会会通过下面这个例子来展开。package function_stackfunc sum(a, b int) int { a2 := a * a b2 := b * b c := a2 + b2 return c}func main() { sum(1, 2)}执行如下命令1 编译成可执行文件 go tool compile -N -l function_stack_test.go2 反编译 go tool objdump functi原创 2021-10-09 20:08:53 · 324 阅读 · 0 评论 -
GMP调度模型入门教程
本文内容主要来自于互联网,本人更多的是汇总信息。GMP调度器的由来单进程操作系统不需要调度器单进程操作系统中每个进程是串行运行的,没有并行的概念,也就是当进程A阻塞时,CPU也不会切换到其他进程,会一直等待A解阻塞。多进程/线程操作系统有了调度器需求在多进程/线程的操作系统中,如果一个进程/线程发生阻塞那么CPU就会切换到另一个进程/线程运行,这样从宏观上来看多个进程/线程就绪并行的。那此时就引入额外的问题,如果有过多的进程/线程的话,CPU会花很多时间在创建、销毁、切换上,这样就会导致CP.原创 2021-10-10 16:51:41 · 1137 阅读 · 0 评论