学习到的内容:
1.一个64位的int类型值,充分利用高32位和低32位,进行相关加减以及从一个64位中拆出高32位和低32位.
扩展:如何自己实现一个无锁队列.
- 如何判断队列是否满.
- 如何实现无锁化.
- 优化方面需要思考的东西.
2.内存相关操作以及优化
- 内存对齐
- CPU Cache Line
- 直接操作内存.
一、原理分析
1.1 结构依赖关系图
下面是相关源代码,不过是已经删减了对本次分析没有用的代码.
1.2 用图让代码说话
1.3 Put过程分析
Put 过程分析比较重要,因为这里会包含pool所有依赖相关分析.
总的分析学习过程可以分为下面几个步骤:
PpoolLocal
valpoolLocalpoolDequeue
PpoolLocal
4.读写内存优化.
数组直接操作内存,而不经过Golang
uint64headtail
获取P对应的poolLocal
sync.Pool.localPutpidlocal
runtime_procPin
Put 进入poolDequeue队列:
headtailpoolChainEltpoolChain.headnextprev
通过下面代码,我们可以看到,Go通过逻辑运算判断队列是否满的设计时非常巧妙的,如果后续我们去开发组件,也是可以这么进行设计的。
Get实现逻辑:
PutGet
二、学习收获
如何自己实现一个无锁队列. 本文未实现,后续文章会进行实现.
2.1 如何自己实现一个无锁队列
横向思考,并未进行实现,后续会进行实现“
uintptrunsafe.Pointeratomic.CompareAndSwapPointer