golang
0
评论
128
浏览

Golang Map 查找

Go 语言中 map 采用的是哈希查找表,由一个 key 通过哈希函数得到哈希值,64 位系统中就生成一个 64bit 的哈希值,由这个哈希值将 key ...

0
评论
142
浏览

删除写屏障

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

0
评论
195
浏览

插入写屏障

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

0
评论
143
浏览

写屏障

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

0
评论
143
浏览

三色标记原理

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

0
评论
173
浏览

Sysmon 有什么作用

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

0
评论
156
浏览

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

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

0
评论
150
浏览

基于信号的抢占式调度

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

0
评论
130
浏览

协作式的抢占式调度

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

0
评论
135
浏览

GMP 中 hand off 机制

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

0
评论
137
浏览

GMP 中 work stealing 机制

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

0
评论
157
浏览

GMP 调度流程

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

0
评论
132
浏览

0 之前 GM 调度模型

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

0
评论
130
浏览

GMP 指的是什么

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

0
评论
135
浏览

Goroutine 定义

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

0
评论
118
浏览

sync.Pool 有什么用

对于很多需要重复分配、回收内存的地方,sync.Pool 是一个很好的选择。频 繁地分配、回收内存会给 GC 带来一定的负担,严重的时候会引起 CPU 的...

0
评论
137
浏览

什么是 CAS

CAS 的全称为 Compare And Swap,直译就是比较交换。是一条 CPU 的原子指 令,其作用是让 CPU 先进行比较两个值是否相等,然后原子...

0
评论
118
浏览

原子操作和锁的区别

原子操作由底层硬件支持,而锁则由操作系统的调度器实现。 锁应当用来保护一段逻辑,对于一个变量更新的保护。 原子操作通常执行上会更有效率,并且更能利用计算机...

0
评论
133
浏览

什么操作叫做原子操作

原子操作即是进行过程中不能被中断的操作,针对某个值的原子操作在被进行 的过程中,CPU 绝不会再去进行其他的针对该值的操作。为了实现这样的严谨 性,原子操...

0
评论
115
浏览

什么是 sync.Once

-  Once 可以用来执行且仅仅执行一次动作,常常用于单例对象的初始化场 景。 -  Once 常常用来初始化单例资源,或者并发访问只需初始化一次的共享...

0
评论
114
浏览

WaitGroup 实现原理

WaitGroup 主要维护了 2 个计数器,一个是请求计数器 v,一个是等待计数 器 w,二者组成一个 64bit 的值,请求计数器占高 32bit,等...

0
评论
109
浏览

WaitGroup 用法

一个 WaitGroup 对象可以等待一组协程结束。使用方法是:main 协程通过调用 wg.Add(delta int) 设置 worker 协程的个数...

0
评论
122
浏览

Cond 中 Wait 使用

func (c *Cond) Wait() Wait()会自动释放 c.L 锁,并挂起调用者的 goroutine。之后恢复执行, Wait()会在返回时...

0
评论
122
浏览

Broadcast 和 Signal 区别

func (c *Cond) Broadcast() Broadcast 会唤醒所有等待 c 的 goroutine。调用 Broadcast 的时候,可...

0
评论
171
浏览

Cond 是什么

Cond 实现了一种条件变量,可以使用在多个 Reader 等待共享资源 ready 的场 景(如果只有一读一写,一个锁或者 channel 就搞定了)每...

0
评论
120
浏览

RWMutex 注意事项

-  RWMutex 是单写多读锁,该锁可以加多个读锁或者一个写锁 -  读锁占用的情况下会阻止写,不会阻止读,多个 Goroutine 可以同时获取 读...

0
评论
118
浏览

RWMutex 实现

通过记录 readerCount 读锁的数量来进行控制,当有一个写锁的时候,会将读 锁数量设置为负数 1<<30。目的是让新进入的读锁等待之前...

0
评论
119
浏览

Mutex 允许自旋的条件

锁已被占用,并且锁不处于饥饿模式。积累的自旋次数小于最大自旋次数(active_spin=4)。CPU 核数大于 1。有空闲的 P。当前 Goroutin...

0
评论
112
浏览

Mutex 正常模式和饥饿模式

正常模式(非公平锁) 正常模式下,所有等待锁的 goroutine 按照 FIFO(先进先出)顺序等待。唤醒 的 goroutine 不会直接拥有锁,而是...

0
评论
118
浏览

Mutex 几种状态

mutexLocked — 表示互斥锁的锁定状态;mutexWoken — 表示从正常模式被从唤醒;mutexStarving — 当前的互斥锁进入饥饿状...

0
评论
127
浏览

Channel 的 ring buffer 实现

channel 中使用了 ring buffer(环形缓冲区) 来缓存写入的数据。ring  buffer 有很多好处,而且非常适合用来实现 FIFO 式...

0
评论
99
浏览

介绍一下 Channel

Go 语言中,不要通过共享内存来通信,而要通过通信来实现内存共享。Go 的 CSP(Communicating Sequential Process)并发...

0
评论
138
浏览

Go 语言当中 Channel 缓冲有什么特点?

无缓冲的 channel是同步的,而有缓冲的channel是非同步的。

0
评论
282
浏览

Go 高并发的特点

答案:Go 语言天生支持高并发,得益于 go 关键字开辟了协程的调用。func main() { go add(1,1) // 开辟了协程 ...

0
评论
297
浏览

Go里面一个协程能保证绑定在一个内核线程上面的。

题目来源:腾讯作者:斯鱼协程是用户级的线程,对内核是透明的,系统并不知道协程的存在,并且协程是非抢占式调度,无法实现公平的任务调用,通常只进行协作式调度,...

0
评论
120
浏览

扩容过程中需不需要重新写入

题目来源:腾讯作者:斯鱼切片的扩容,当在尾部扩容时,追加元素,不需要重新写入;var a []int a = append(a, 1)在头部插入时;会引起...

0
评论
120
浏览

c 与go的区别优劣

答案1:Go与C1、区别语言代码表面差异如源文件差异 C语言扩展名源类型.cC语言源文件.h头文件Go语言扩展名源文件.goGo语言源文件其他详细的语言代...

0
评论
128
浏览

go map slice 实现(内存泄漏分析)

答案1:slice内存泄漏分析(1)发生场景:截取长slice中的一段导致长slice未释放 ​ 由于底层都是数组,如果截图长slice的一段,其实...

0
评论
110
浏览

go waitgroup 的坑

答案1:1、waitGroup对象做值传递如: func main(){ var swg sync.WaitGroup for i:=0;...

0
评论
119
浏览

与其他语言相比,使用 Go 有什么好处?

与其他作为学术实验开始的语言不同,Go 代码的设计是务实的。每个功能和语法决策都旨在让程序员的生活更轻松。Golang 针对并发进行了优化,并且在规模上运...

0
评论
124
浏览

Golang 使用什么数据类型?

Golang 使用以下类型:MethodBoolStringArraySliceStructPointerFunctionInterfaceMapChannel

0
评论
132
浏览

Go 程序中的包是什么?

包 (pkg) 是 Go 工作区中包含 Go 源文件或其他包的目录。源文件中的每个函数、变量和类型都存储在链接包中。每个 Go 源文件都属于一个包,该包在...

0
评论
120
浏览

Go 支持什么形式的类型转换?

将整数转换为浮点数。 Go 支持显式类型转换以满足其严格的类型要求。i := 55 //int  j := 67.8 //float64  sum :...

0
评论
118
浏览

什么是 Goroutine?你如何停止它?

一个 Goroutine 是一个函数或方法执行同时旁边其他任何够程采用了特殊的 Goroutine线程。Goroutine 线程比标准线程更轻量级,大多数...

0
评论
124
浏览

如何在运行时检查变量类型?

类型开关(Type Switch)是在运行时检查变量类型的最佳方式。类型开关按类型而不是值来评估变量。每个 Switch 至少包含一个case用作条件语句...

0
评论
96
浏览

Go 两个接口之间可以存在什么关系?

如果两个接口有相同的方法列表,那么他们就是等价的,可以相互赋值。如果接口A的方法列表是接口B的方法列表的自己,那么接口B可以赋值给接口A。接口查询是否成功...

0
评论
136
浏览

Go 当中同步锁有什么特点?作用是什么

当一个Goroutine(协程)获得了Mutex后,其他Goroutine(协程)就只能乖乖的等待,除非该Goroutine释放了该Mutex。RWMut...

0
评论
115
浏览

Go 语言当中 Channel(通道)有什么特点,需要注意什么?

如果给一个 nil 的 channel 发送数据,会造成永远阻塞。如果从一个 nil 的 channel 中接收数据,也会造成永久阻塞。给一个已经关闭的 ...

0
评论
118
浏览

看下面代码的 defer 的执行顺序是什么? defer的作用和特点是什么?

defer的作用是: 你只需要在调用普通函数或方法前加上关键字defer,就完成了defer所需要的语法。当defer语句被执行时,跟在defer后面的函...

0
评论
115
浏览

Golang Slice 的底层实现

切片是基于数组实现的,它的底层是数组,它自己本身非常小,可以理解为对 底层数组的抽象。因为基于数组实现,所以它的底层的内存是连续分配的,效 率非常高,还可...