求剧情
Go语言学习笔记 · 第十七节

《Go语言学习笔记》第十七节

由于 goroutine 对线程的抽象,以往基于线程本地存储的方案无法实施,官方因此提供 sync.Pool,其算法已被内存分配、GC 和调度器采用。

由于 goroutine 对线程的抽象,以往基于线程本地存储的方案无法实施,官方因此提供 sync.Pool,其算法已被内存分配、GC 和调度器采用。

Pool 用 local 和 localSize 维护 poolLocal 数组,Get/Put 均通过 pin 取得与当前 P 绑定的 poolLocal。indexLocal 采用不考虑 P 数量变化的取巧写法,以性能优先。poolLocal 含两个区域:private 完全私有、无须加锁,优先级最高;share 可被其他 poolLocal 访问以平衡缓存,需加锁,但锁多只面对当前线程,影响不大。Get 先从本地取,失败则向其他 poolLocal 借用,仍不行才调用 New 新建;取出的对象与 Pool 失去引用,需自行 Put 放回。Put 无需跨 poolLocal 平衡。Pool 收缩交给 GC:poolCleanup 在 STW 状态下执行,无需加锁,只清理仅被 Pool 引用的可移除对象,不影响已被 Get 的对象。作者认为若能设阈值只清理超量缓存,可减少 GC 后频繁 New,Pool 设计尚有改进余地。

‹ 上一章目录

全部 17 章