第 2 页 - golang
0
评论
136
浏览

Goroutine 定义

Golang 在语言级别支持协程,称之为 Goroutine。Golang 标准库提供的所有 系统调用操作(包括所有的同步 I/O 操作),都会出让 CP...

0
评论
131
浏览

GMP 指的是什么

G(Goroutine):我们所说的协程,为用户级的轻量级线程,每个 Goroutine 对象中的 sched 保存着其上下文信息。M(Machine):...

0
评论
133
浏览

0 之前 GM 调度模型

调度器把 G 都分配到 M 上,不同的 G 在不同的 M 并发运行时,都需要向系统申 请资源,比如堆栈内存等,因为资源是全局的,就会因为资源竞争照成很多性...

0
评论
158
浏览

GMP 调度流程

每个 P 有个局部队列,局部队列保存待执行的goroutine(流程 2),当 M 绑定的 P 的的局部队列已经满了之后就会把 goroutine 放到全...

0
评论
138
浏览

GMP 中 work stealing 机制

获取 P 本地队列,当从绑定 P 本地 runq 上找不到可执行的 g,尝试从全局链 表中拿,再拿不到从 netpoll 和事件池里拿,最后会从别的 P ...

0
评论
136
浏览

GMP 中 hand off 机制

当本线程 M 因为 G 进行的系统调用阻塞时,线程释放绑定的 P,把 P 转移给其 他空闲的 M 执行。 细节:当发生上线文切换时,需要对执行现场进行保护...

0
评论
132
浏览

协作式的抢占式调度

在 1.14 版本之前,程序只能依靠 Goroutine 主动让出 CPU 资源才能触发调 度。这种方式存在问题有:某些 Goroutine 可以长时间占...

0
评论
152
浏览

基于信号的抢占式调度

在任何情况下,Go 运行时并行执行(注意,不是并发)的 goroutines 数量是 小于等于 P 的数量的。为了提高系统的性能,P 的数量肯定不是越小越...

0
评论
157
浏览

GMP 调度过程中存在哪些阻塞

I/O,select block on syscallchannel 等待锁runtime.Gosched()

0
评论
175
浏览

Sysmon 有什么作用

Sysmon 也叫监控线程,变动的周期性检查,好处-  释放闲置超过 5 分钟的 span 物理内存;-  如果超过 2 分钟没有垃圾回收,强制执行; -...

0
评论
144
浏览

三色标记原理

原理:首先把所有的对象都放到白色的集合中从根节点开始遍历对象,遍历到的白色对象从白色集合中放到灰色集合中 遍历灰色集合中的对象,把灰色对象引用的白色集合的...

0
评论
145
浏览

写屏障

Go 在进行三色标记的时候并没有 STW,也就是说,此时的对象还是可以进行修 改。 那么我们考虑一下,下面的情况。我们在进行三色标记中扫描灰色集合中,扫描...

0
评论
196
浏览

插入写屏障

Go GC 在混合写屏障之前,一直是插入写屏障,由于栈赋值没有 hook 的原 因,栈中没有启用写屏障,所以有 STW。Golang 的解决方法是:只是需...

0
评论
143
浏览

删除写屏障

Golang 没有这一步,Golang 的内存写屏障是由插入写屏障到混合写屏障过渡 的。简单介绍一下,一个对象即使被删除了最后一个指向它的指针也依旧可以 ...

0
评论
161
浏览

GC 触发时机

主动触发:调用 runtime.GC被动触发:使用系统监控,该触发条件由 runtime.forcegcperiod 变量控制,默认为 2 分 钟。当超过...

0
评论
176
浏览

混合写屏障

混合写屏障继承了插入写屏障的优点,起始无需 STW 打快照,直接并发扫 描垃圾即可;混合写屏障继承了删除写屏障的优点,赋值器是黑色赋值器,GC 期间,任 ...

0
评论
134
浏览

Go 有哪些方式安全读写共享变量?

方法并发原语备注不要修改变量sync.Once不要去写变量,变量只初始化一次只允许一个goroutine访问变量Channel不要通过共享变量来通信,通过...

0
评论
137
浏览

Go Cond实现原理?

概念Go标准库提供了Cond原语,可以让 Goroutine 在满足特定条件时被阻塞和唤醒底层数据结构type Cond struct { noC...

0
评论
118
浏览

Go WaitGroup实现原理?

概念Go标准库提供了WaitGroup原语, 可以用它来等待一批 Goroutine 结束底层数据结构// A WaitGroup must not b...

0
评论
128
浏览

Go 有哪些并发同步原语?

Go是一门以并发编程见长的语言,它提供了一系列的同步原语方便开发者使用原子操作Mutex、RWMutex 等并发原语的底层实现是通过 atomic 包中的...

0
评论
115
浏览

Go 常用的并发模型?

并发模型说的是系统中的线程如何协作完成并发任务,不同的并发模型,线程以不同的方式进行通信和协作。线程间通信方式线程间通信方式有两种:共享内存和消息传递,无...

0
评论
140
浏览

Go 如何查看GC信息?

1. GODEBUG='gctrace=1'package main func main() { for n := 1; n < 100000; n...

0
评论
135
浏览

Go GC如何调优?

控制内存分配的速度,限制 Goroutine 的数量,提高赋值器 mutator 的 CPU 利用率(降低GC的CPU利用率)少量使用+连接strings...

0
评论
136
浏览

Go GC实现原理?

什么是GC?垃圾回收也称为GC(Garbage Collection),是一种自动内存管理机制现代高级编程语言管理内存的方式分为两种:自动和手动,像C、C...

0
评论
123
浏览

Go 内存对齐机制?

什么是内存对齐为了能让CPU可以更快的存取到各个字段,Go编译器会帮你把struct结构体做数据的对齐。所谓的数据对齐,是指内存地址是所存储数据大小(按字...

0
评论
115
浏览

Go 内存逃逸机制?

概念在一段程序中,每一个函数都会有自己的内存区域存放自己的局部变量、返回地址等,这些内存会由编译器在栈中进行分配,每一个函数都会分配一个栈桢,在函数运行结...

0
评论
124
浏览

Go 内存分配机制?

Go语言内置运行时(就是runtime),抛弃了传统的内存分配方式,改为自主管理。这样可以自主地实现更好的内存使用模式,比如内存池、预分配等等。这样,不会...

0
评论
120
浏览

Go 如何查看运行时调度信息?

有 2 种方式可以查看一个程序的调度GMP信息,分别是go tool trace和GODEBUGtrace.gopackage main import ...

0
评论
149
浏览

Go 抢占式调度?

在1.2版本之前,Go的调度器仍然不支持抢占式调度,程序只能依靠Goroutine主动让出CPU资源才能触发调度,这会引发一些问题,比如:某些 Gorou...

0
评论
116
浏览

Go hand off 机制?

概念也称为P分离机制,当本线程 M 因为 G 进行的系统调用阻塞时,线程释放绑定的 P,把 P 转移给其他空闲的 M 执行,也提高了线程利用率(避免站着茅...

0
评论
127
浏览

Go work stealing 机制?

概念当线程M⽆可运⾏的G时,尝试从其他M绑定的P偷取G,减少空转,提高了线程利用率(避免闲着不干活)。当从本线程绑定 P 本地 队列、全局G队列、netp...

0
评论
138
浏览

Go 调度原理?

goroutine调度的本质就是将 Goroutine (G)按照一定算法放到CPU上去执行。CPU感知不到Goroutine,只知道内核线程,所以需要G...

0
评论
131
浏览

Go GMP和GM模型?

什么才是一个好的调度器?能在适当的时机将合适的协程分配到合适的位置,保证公平和效率。Go采用了GMP模型(对两级线程模型的改进实现),使它能够更加灵活地进...

0
评论
136
浏览

Go 线程实现模型?

Go实现的是两级线程模型(M:N),准确的说是GMP模型,是对两级线程模型的改进实现,使它能够更加灵活地进行线程之间的调度。背景             ...

0
评论
122
浏览

Go 如何控制并发的goroutine数量?

为什么要控制goroutine并发的数量?在开发过程中,如果不对goroutine加以控制而进行滥用的话,可能会导致服务整体崩溃。比如耗尽系统资源导致程序...

0
评论
130
浏览

Go 如何查看正在执行的goroutine数量?

程序中引入pprof pakage在程序中引入pprof package:import _ "net/http/pprof"程序中开启...

0
评论
136
浏览

Go goroutine泄露的场景?

泄露原因Goroutine 内进行channel/mutex 等读写操作被一直阻塞。Goroutine 内的业务逻辑进入死循环,资源一直无法释放。Goro...

0
评论
120
浏览

Go goroutine和线程的区别?

           goroutine                                                   线程    ...

0
评论
134
浏览

Go goroutine的底层实现原理?

概念Goroutine可以理解为一种Go语言的协程(轻量级线程),是Go支持高并发的基础,属于用户态的线程,由Go runtime管理而不是操作系统。底层...

0
评论
139
浏览

Go原子操作和锁的区别?

原子操作由底层硬件支持,而锁是基于原子操作+信号量完成的。若实现相同的功能,前者通常会更有效率原子操作是单个指令的互斥操作;互斥锁/读写锁是一种数据结构,...

0
评论
138
浏览

Go 原子操作有哪些?

Go atomic包是最轻量级的锁(也称无锁结构),可以在不形成临界区和创建互斥量的情况下完成并发安全的值替换操作,不过这个包只支持int32/int64...

0
评论
141
浏览

Go 可重入锁如何实现?

概念:可重入锁又称为递归锁,是指在同一个线程在外层方法获取锁的时候,在进入该线程的内层方法时会自动获取锁,不会因为之前已经获取过还没释放再次加锁导致死锁为...

0
评论
124
浏览

Go 读写锁的实现原理?

概念:读写互斥锁RWMutex,是对Mutex的一个扩展,当一个 goroutine 获得了读锁后,其他 goroutine可以获取读锁,但不能获取写锁;...

0
评论
142
浏览

Go 互斥锁允许自旋的条件?

线程没有获取到锁时常见有2种处理方式:-   一种是没有获取到锁的线程就一直循环等待判断该资源是否已经释放锁,这种锁也叫做自旋锁,它不用将线程阻塞起来, ...

0
评论
170
浏览

Go 互斥锁正常模式和饥饿模式的区别?

在Go一共可以分为两种抢锁的模式,一种是正常模式,另外一种是饥饿模式。正常模式(非公平锁)在刚开始的时候,是处于正常模式(Barging),也就是,当一个...

0
评论
114
浏览

Go 互斥锁的实现原理?

Go sync包提供了两种锁类型:互斥锁sync.Mutex 和 读写互斥锁sync.RWMutex,都属于悲观锁。概念:Mutex是互斥锁,当一个 go...

0
评论
122
浏览

Go函数参数传递到底是值传递还是引用传递?

先说下结论:Go语言中所有的传参都是值传递(传值),都是一个副本,一个拷贝。参数如果是非引用类型(int、string、struct等这些),这样就在函数...

0
评论
108
浏览

Go defer关键字的实现原理?

定义:defer 能够让我们推迟执行某些函数调用,推迟到当前函数返回前才实际执行。defer与panic和recover结合,形成了Go语言风格的异常与捕...

0
评论
149
浏览

Go内置函数make和new的区别?

首先纠正下make和new是内置函数,不是关键字变量初始化,一般包括2步,变量声明 + 变量内存分配,var关键字就是用来声明变量的,new和make函数...

0
评论
147
浏览

Go函数返回局部变量的指针是否安全?

一般来说,局部变量会在函数返回后被销毁,因此被返回的引用就成为了"无所指"的引用,程序会进入未知状态。但这在 Go 中是安全的,Go 编译器将会对每个局部...