Goroutine 定义
Golang 在语言级别支持协程,称之为 Goroutine。Golang 标准库提供的所有 系统调用操作(包括所有的同步 I/O 操作),都会出让 CP...
GMP 指的是什么
G(Goroutine):我们所说的协程,为用户级的轻量级线程,每个 Goroutine 对象中的 sched 保存着其上下文信息。M(Machine):...
0 之前 GM 调度模型
调度器把 G 都分配到 M 上,不同的 G 在不同的 M 并发运行时,都需要向系统申 请资源,比如堆栈内存等,因为资源是全局的,就会因为资源竞争照成很多性...
GMP 调度流程
每个 P 有个局部队列,局部队列保存待执行的goroutine(流程 2),当 M 绑定的 P 的的局部队列已经满了之后就会把 goroutine 放到全...
GMP 中 work stealing 机制
获取 P 本地队列,当从绑定 P 本地 runq 上找不到可执行的 g,尝试从全局链 表中拿,再拿不到从 netpoll 和事件池里拿,最后会从别的 P ...
GMP 中 hand off 机制
当本线程 M 因为 G 进行的系统调用阻塞时,线程释放绑定的 P,把 P 转移给其 他空闲的 M 执行。 细节:当发生上线文切换时,需要对执行现场进行保护...
协作式的抢占式调度
在 1.14 版本之前,程序只能依靠 Goroutine 主动让出 CPU 资源才能触发调 度。这种方式存在问题有:某些 Goroutine 可以长时间占...
基于信号的抢占式调度
在任何情况下,Go 运行时并行执行(注意,不是并发)的 goroutines 数量是 小于等于 P 的数量的。为了提高系统的性能,P 的数量肯定不是越小越...
Sysmon 有什么作用
Sysmon 也叫监控线程,变动的周期性检查,好处- 释放闲置超过 5 分钟的 span 物理内存;- 如果超过 2 分钟没有垃圾回收,强制执行; -...
GC 触发时机
主动触发:调用 runtime.GC被动触发:使用系统监控,该触发条件由 runtime.forcegcperiod 变量控制,默认为 2 分 钟。当超过...
Go 有哪些方式安全读写共享变量?
方法并发原语备注不要修改变量sync.Once不要去写变量,变量只初始化一次只允许一个goroutine访问变量Channel不要通过共享变量来通信,通过...
Go Cond实现原理?
概念Go标准库提供了Cond原语,可以让 Goroutine 在满足特定条件时被阻塞和唤醒底层数据结构type Cond struct { noC...
Go WaitGroup实现原理?
概念Go标准库提供了WaitGroup原语, 可以用它来等待一批 Goroutine 结束底层数据结构// A WaitGroup must not b...
Go 有哪些并发同步原语?
Go是一门以并发编程见长的语言,它提供了一系列的同步原语方便开发者使用原子操作Mutex、RWMutex 等并发原语的底层实现是通过 atomic 包中的...
Go 常用的并发模型?
并发模型说的是系统中的线程如何协作完成并发任务,不同的并发模型,线程以不同的方式进行通信和协作。线程间通信方式线程间通信方式有两种:共享内存和消息传递,无...
Go 如何查看GC信息?
1. GODEBUG='gctrace=1'package main func main() { for n := 1; n < 100000; n...
Go GC如何调优?
控制内存分配的速度,限制 Goroutine 的数量,提高赋值器 mutator 的 CPU 利用率(降低GC的CPU利用率)少量使用+连接strings...
Go GC实现原理?
什么是GC?垃圾回收也称为GC(Garbage Collection),是一种自动内存管理机制现代高级编程语言管理内存的方式分为两种:自动和手动,像C、C...
Go 内存对齐机制?
什么是内存对齐为了能让CPU可以更快的存取到各个字段,Go编译器会帮你把struct结构体做数据的对齐。所谓的数据对齐,是指内存地址是所存储数据大小(按字...
Go 内存逃逸机制?
概念在一段程序中,每一个函数都会有自己的内存区域存放自己的局部变量、返回地址等,这些内存会由编译器在栈中进行分配,每一个函数都会分配一个栈桢,在函数运行结...
Go 内存分配机制?
Go语言内置运行时(就是runtime),抛弃了传统的内存分配方式,改为自主管理。这样可以自主地实现更好的内存使用模式,比如内存池、预分配等等。这样,不会...
Go 如何查看运行时调度信息?
有 2 种方式可以查看一个程序的调度GMP信息,分别是go tool trace和GODEBUGtrace.gopackage main import ...
Go 抢占式调度?
在1.2版本之前,Go的调度器仍然不支持抢占式调度,程序只能依靠Goroutine主动让出CPU资源才能触发调度,这会引发一些问题,比如:某些 Gorou...
Go hand off 机制?
概念也称为P分离机制,当本线程 M 因为 G 进行的系统调用阻塞时,线程释放绑定的 P,把 P 转移给其他空闲的 M 执行,也提高了线程利用率(避免站着茅...
Go work stealing 机制?
概念当线程M⽆可运⾏的G时,尝试从其他M绑定的P偷取G,减少空转,提高了线程利用率(避免闲着不干活)。当从本线程绑定 P 本地 队列、全局G队列、netp...
Go 调度原理?
goroutine调度的本质就是将 Goroutine (G)按照一定算法放到CPU上去执行。CPU感知不到Goroutine,只知道内核线程,所以需要G...
Go GMP和GM模型?
什么才是一个好的调度器?能在适当的时机将合适的协程分配到合适的位置,保证公平和效率。Go采用了GMP模型(对两级线程模型的改进实现),使它能够更加灵活地进...
Go 如何控制并发的goroutine数量?
为什么要控制goroutine并发的数量?在开发过程中,如果不对goroutine加以控制而进行滥用的话,可能会导致服务整体崩溃。比如耗尽系统资源导致程序...
Go 如何查看正在执行的goroutine数量?
程序中引入pprof pakage在程序中引入pprof package:import _ "net/http/pprof"程序中开启...
Go goroutine泄露的场景?
泄露原因Goroutine 内进行channel/mutex 等读写操作被一直阻塞。Goroutine 内的业务逻辑进入死循环,资源一直无法释放。Goro...
Go goroutine的底层实现原理?
概念Goroutine可以理解为一种Go语言的协程(轻量级线程),是Go支持高并发的基础,属于用户态的线程,由Go runtime管理而不是操作系统。底层...
Go原子操作和锁的区别?
原子操作由底层硬件支持,而锁是基于原子操作+信号量完成的。若实现相同的功能,前者通常会更有效率原子操作是单个指令的互斥操作;互斥锁/读写锁是一种数据结构,...
Go 原子操作有哪些?
Go atomic包是最轻量级的锁(也称无锁结构),可以在不形成临界区和创建互斥量的情况下完成并发安全的值替换操作,不过这个包只支持int32/int64...
Go 可重入锁如何实现?
概念:可重入锁又称为递归锁,是指在同一个线程在外层方法获取锁的时候,在进入该线程的内层方法时会自动获取锁,不会因为之前已经获取过还没释放再次加锁导致死锁为...
Go 读写锁的实现原理?
概念:读写互斥锁RWMutex,是对Mutex的一个扩展,当一个 goroutine 获得了读锁后,其他 goroutine可以获取读锁,但不能获取写锁;...
Go 互斥锁允许自旋的条件?
线程没有获取到锁时常见有2种处理方式:- 一种是没有获取到锁的线程就一直循环等待判断该资源是否已经释放锁,这种锁也叫做自旋锁,它不用将线程阻塞起来, ...
Go 互斥锁正常模式和饥饿模式的区别?
在Go一共可以分为两种抢锁的模式,一种是正常模式,另外一种是饥饿模式。正常模式(非公平锁)在刚开始的时候,是处于正常模式(Barging),也就是,当一个...
Go 互斥锁的实现原理?
Go sync包提供了两种锁类型:互斥锁sync.Mutex 和 读写互斥锁sync.RWMutex,都属于悲观锁。概念:Mutex是互斥锁,当一个 go...
Go函数参数传递到底是值传递还是引用传递?
先说下结论:Go语言中所有的传参都是值传递(传值),都是一个副本,一个拷贝。参数如果是非引用类型(int、string、struct等这些),这样就在函数...
Go defer关键字的实现原理?
定义:defer 能够让我们推迟执行某些函数调用,推迟到当前函数返回前才实际执行。defer与panic和recover结合,形成了Go语言风格的异常与捕...
Go内置函数make和new的区别?
首先纠正下make和new是内置函数,不是关键字变量初始化,一般包括2步,变量声明 + 变量内存分配,var关键字就是用来声明变量的,new和make函数...
Go函数返回局部变量的指针是否安全?
一般来说,局部变量会在函数返回后被销毁,因此被返回的引用就成为了"无所指"的引用,程序会进入未知状态。但这在 Go 中是安全的,Go 编译器将会对每个局部...
已加贵站~
name: 技研录
link: https://linmohan.fun/
avatar: https://linmohan.fun/img/favicon.png
descr: 「代码重构世界,逻辑解构真理」