在读 Golang GC 部分源码时候看到,对于 mspan 用于标记是否需要 GC 清除的 bitmap mspan.gcmarkBits,在 sweep 清扫过程中会使用 countAlloc(sys.OnesCount64) 来快速计算 64 位二进制数中 1 的数量(即已分配的 object 数量)。 而 Golang 标准库的 sys.OnesCount64 是这么实现的: 和
了解更多

起因是在读 Golang Malloc 相关代码时候,看到了 sys.TrailingZeros64 标准库函数,这个函数的作用是计算传入的 64 位二进制数(uint64)末尾有多少个 0。 计算二进制末尾有多少个 0,似乎很简单没啥好多讲的,直觉第一反应是类似这么实现: 就是不断循环看数的最低位,如果是 0 则计数并将数右移,如果是 1 则退出循环,返回计数。道理和循环不断模 2 取
了解更多

左书祺老师的《Go语言设计与实现》写得很好,不过在阅读过程中发现不少部分还是要结合阅读源码才能够理解其中细节。 与之前的笔记类似,本篇将围绕 5.2 select 一节通过查看资料和阅读源码进行整理补充,以免自己回头忘记。 也欢迎熟悉这部分源码或是感兴趣的老板参与讨论。 基于阅读的 Golang 源码版本是 1.16 原书中对于 select 源码的分析事实上是从两个层面来分析的,第一部分是
了解更多

前面几天看完 Channel 之后,意识到 Channel 在目前版本本质上还是一个加锁的 FIFO 消息队列。不管是对 Channel 进行发送、接收还是关闭操作,都会加锁。由此让我想再重新好好看下目前 Golang 的锁实现,以后分析并发性能的时候能够更加清晰。 左书祺老师的《Go语言设计与实现》 在 【6.2 同步原语与锁】一章中详细介绍了 sync.Mutex 与 sync.RWMut
了解更多

左书祺老师的《Go语言设计与实现》写得很好,不过在阅读过程中发现不少部分还是要结合阅读源码才能够理解其中细节。 与上篇计时器类似,本篇将围绕 6.4 章 Channel 通过查看资料和阅读源码补充的部分,以免自己回头忘记。 也欢迎熟悉这部分源码或是感兴趣的老板参与讨论。 基于阅读的 Golang 源码版本是 1.16 1. 数据结构这部分针对书中 6.4.2 的章节部分,其中介绍了 Ch
了解更多

在学习 Golang 定时器这一块时看到了 Russ Cox 大神的这篇 Proposal ,因为觉得这篇 Proposal 和对应的 Issue 讨论 比较有趣,就把这篇 Proposal 翻译学习一下,最后再讲下自己看了有关讨论的自己的一点感想。 整篇 Proposal 介绍了用于测量经过时间的单调时钟(Monotonic Clock),以及为了引入单调时钟对于 Go Time 的改造。
了解更多

左书祺老师的《Go语言设计与实现》写得很好,不过在阅读过程中发现不少部分还是要结合阅读源码才能够理解其中细节。 因此写下这篇笔记,记录下《Go 语言设计与实现》 6.3 章通过查看资料和阅读源码补充的部分,以免自己回头忘记。 也欢迎熟悉这部分源码或是感兴趣的老板参与讨论。 基于阅读的 Golang 源码版本是 1.16 1. 数据结构1.1 runtime.timer在 6.3.2 数据
了解更多

Golang 计时器与四叉堆

in Golang

最近在重读左书祺老师的《Go 语言设计与实现》 6.3 计时器一章,书中介绍了 Golang 计时器(Timer)的内部实现 —— 所有的计时器都由每个处理器(runtime.p)单独管理,并通过对应的最小四叉堆进行维护: 我阅读的开源代码还不够多,因此对于 Golang 使用四叉堆(Quaternary Heap),而非使用经典的二叉堆(Binary Heap)来维护 Timer 感
了解更多

  • page 1 of 1

Grzhan

静静地当一个宅√


伪宅 & 码农


Shanghai China