go
李晨毅
得物(毒)app,高级golang工程师
展开
-
详解go中的混合锁 - mutex
0 前言我们知道,多线程下为了确保数据不会出错,必须加锁后才能访问共享资源。常见的锁包括互斥锁、自旋锁、读写锁等等,往往需要通过系统内核来实现。然而协程的互斥锁实现原理完全不同,它并不与内核打交道,虽然不能跨线程工作,但却因为减少了用户态与内核态转换时所需的上下文切换环节,效率很高,是一个非常不错的选择。本文以golang为例,用flowchart作图结合代码的形式,讲解在golang中是如何使用用户态的代码将锁重新实现的。 1 前提知识点1.1 互斥锁与自旋锁我们常见的各种锁是有.原创 2020-11-07 12:37:55 · 22167 阅读 · 0 评论 -
从底层深入Go的基础模型 - interface
0 interface是什么In Object-oriented programming, a protocol or interface is a common means for unrelated Object (computer science) to communicate with each other. These are definitions of Method (computer programming) and values which the objects agree u.原创 2020-11-02 21:48:52 · 23092 阅读 · 1 评论 -
(tip)谨慎使用defer修改返回值
golang在defer修改返回值时需要格外注意!如果未提前声明返回值的话,在defer中修改返回值是无效的操作。原因如下:package mainfunc test1() int { i := 1 defer func() { // 实际则是将局部变量i的地址指针传入,调用runtime.deferproc函数 i++ }() return i // 将i的值拷贝到调用栈的返回值上}func test2() int { i := 1 defer func(i in原创 2020-09-22 21:32:33 · 25459 阅读 · 0 评论 -
自顶向下解析raft一致性算法
0 前言raft算法是现在在分布式系统中广泛应用的一种共识性算法,网上可以找到许多介绍文章,但是却往往通篇都是进行了介绍,未能明确梳理逻辑,本文旨在自顶向下逐步拆解问题,清晰解释raft算法的主线。1 raft算法的来源(拜占庭将军问题)曾经的拜占庭国土辽阔,为了抵御来自各个方向的敌人,军队之间分隔很远,他们之间只能通过信使互相传递消息。一场新的战役即将爆发,有5支拜占庭军队要共同进退,5个将军都是平级的,他们要怎么达成一起进攻或者一起撤退的共识呢?最简单的办法就是投票,每个将军都派出信使将自己.原创 2020-09-10 19:43:56 · 22115 阅读 · 0 评论 -
使用pprof快速定位Go内存泄漏
什么是pprofpprof是Go的性能分析工具,在程序运行过程中,可以记录程序的运行信息,可以是CPU使用情况、内存使用情况、goroutine运行情况等,当需要性能调优或者定位Bug时候,这些记录的信息是相当重要。代码实现package mainimport ( "fmt" "net/http" _ "net/http/pprof" // 引入pprof,调用init方法)func main() { // 生产环境应仅在本地监听pprof go func() { ip :.原创 2020-09-04 13:46:38 · 26246 阅读 · 0 评论 -
从Go走进plan9汇编
前言:问:什么是plan9?答:plan9是一个很强的操作系统,但我们只需要学习它的汇编语法。问:为什么说golang开发者需要学习plan9汇编?答:因为golang的开发团队和bell实验室(开发了Unix的那个实验室)开发plan9操作系统的钢铁糙汉子开发团队是同一批人,他们非要用,咱也没办法。问:反编译之后玩Intel和AT&T不香吗?答:确实可以跳过plan9汇编(比如直接拿机器码反编译出intel汇编来看),但是会让阅读变得非常困难。并且在golang的基础方法中,使用了大.原创 2020-09-03 20:53:57 · 25382 阅读 · 5 评论 -
tcmalloc——为高并发场景而生的内存分配器
(Ps:全篇读完后再回头来看一下封面图)0.前言在我们写业务代码的过程中,业务代码与系统内核间的两层内存池往往容易被忽略,尤其是其中的C库内存池。当代码申请内存时,首先会到达应用层内存池,如果应用层内存池有足够的可用内存,就会直接返回给业务代码,否则,它会向更底层的 C 库内存池申请内存。PTmalloc, TCMalloc和JEMalloc都属于C库内存池。几乎所有程序都在使用 C 库内存池分配出的内存,比如java使用ptmalloc,golang使用tcmalloc等等。C 库内存池影响着系.原创 2020-08-28 00:28:46 · 22806 阅读 · 0 评论 -
sync.Pool设计分析
golang sync.Pool的数据模型在1.13中发生了比较大的改变,一方面是数据模型的重构,一方面是GC对sync.Pool池子影响的优化。1.数据模型:初始情况默认大小为8,能放8个item。因为是有限大小的FIFO,所以采取了最佳模型ring buffer来实现这个队列。(因为定长队列是用定长数组实现的,如果在头部push的话,需要后续所有内容往后迁移,复杂度为O(n),...原创 2020-04-09 14:12:45 · 20652 阅读 · 0 评论 -
golang 归并排序,快速排序, 堆排序
归并排序func sortArray(nums []int) []int { if len(nums) <= 1 { return nums } partA := sortArray(nums[:len(nums)/2]) partB := sortArray(nums[len(nums)/2:]) temp := m...原创 2020-02-14 15:01:10 · 20350 阅读 · 0 评论