随笔分类 -  golang

摘要:defer 用于延迟函数的调用,每次defer都会把一个函数压入栈中,函数返回前再把延迟的函数取出并执行 延迟函数的参数在defer语句出现时就已经确定下来了 如: func a() { i := 0 defer fmt.Println(i) i++ return } defer语句中的fmt.Pr 阅读全文
posted @ 2021-11-01 21:45 CJ-cooper 阅读(220) 评论(0) 推荐(0) 编辑
摘要:go语言中并发安全和锁 首先可以先看看这篇文章,对锁有些了解 【锁】详解区分 互斥锁、⾃旋锁、读写锁、乐观锁、悲观锁 Mutex-互斥锁 Mutex 的实现主要借助了 CAS 指令 + 自旋 + 信号量 数据结构: type Mutex struct { state int32 sema uint3 阅读全文
posted @ 2021-10-28 19:05 CJ-cooper 阅读(1448) 评论(0) 推荐(1) 编辑
摘要:实现原理 垃圾收集的多个阶段: 清理终止阶段(STW) 暂停程序,所有的处理器在这时会进入安全点 我的理解是这里stw,等待所有协程都知道要开始打开写屏障了,不然无法做到统一 如果当前垃圾收集循环是强制触发的,我们还需要处理还未被清理的内存管理单元 标记阶段-并发执行 将状态切换至 _GCmark 阅读全文
posted @ 2021-10-26 15:29 CJ-cooper 阅读(284) 评论(0) 推荐(0) 编辑
摘要:GC垃圾回收机制设计原理 标记清除 1.3版本之前。大概分为两阶段: 标记阶段 - 从根对象出发标记堆中存活的对象 清除阶段 - 遍历堆中所有对象,回收未被标记的垃圾对象 1.0版本:是完全串行的,这两个阶段都在STW暂停范围之内 1.1版本:在多核主机并行执行垃圾收集的标记和清除阶段 缺点:整个过 阅读全文
posted @ 2021-10-24 20:58 CJ-cooper 阅读(428) 评论(0) 推荐(0) 编辑
摘要:GMP Goroutine调度是一个很复杂的机制,下面尝试用简单的语言描述一下Goroutine调度机制,想要对其有更深入的了解可以去研读一下源码。 介绍 首先介绍一下GMP什么意思: G goroutine: 即Go协程,每个go关键字都会创建一个协程。 M thread内核级线程,所有的G都要放 阅读全文
posted @ 2021-09-15 01:39 CJ-cooper 阅读(6508) 评论(1) 推荐(0) 编辑
摘要:Golang抢占式调度 在1.2版本之前,go的调度器仍然不支持抢占式调度,程序只能依靠Goroutine主动让出CPU资源才能触发调度,这会引发一些问题,比如: 某些 Goroutine 可以长时间占用线程,造成其它 Goroutine 的饥饿 垃圾回收器是需要stop the world的。如果 阅读全文
posted @ 2021-09-13 22:21 CJ-cooper 阅读(609) 评论(0) 推荐(0) 编辑
摘要:Channel 底层数据结构 type hchan struct { qcount uint // 当前队列中剩余元素个数 dataqsiz uint // 环形队列长度,即可以存放的元素个数 buf unsafe.Pointer // 环形队列指针 elemsize uint16 // 每个元素的 阅读全文
posted @ 2021-09-09 15:45 CJ-cooper 阅读(353) 评论(0) 推荐(0) 编辑
摘要:defer 用于延迟函数的调用,每次defer都会把一个函数压入栈中,函数返回前再把延迟的函数取出并执行 数据结构 type _defer struct { sp uintptr //函数栈指针 pc uintptr //程序计数器 fn *funcval //函数地址 link *_defer / 阅读全文
posted @ 2021-08-31 17:38 CJ-cooper 阅读(174) 评论(0) 推荐(0) 编辑
摘要:map底层是由哈希表实现的 Go使用链地址法来解决键冲突。 当两个key落在了同一个桶中,这时就发生了哈希冲突。go的解决方式是链地址法:在桶中按照顺序寻到第一个空位,若有位置,则将其置于其中;否则,判断是否存在溢出桶,若有溢出桶,则去该桶的溢出桶中寻找空位,如果没有溢出桶,则添加溢出桶,并将其置溢 阅读全文
posted @ 2021-08-17 00:58 CJ-cooper 阅读(596) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示