知识卡片
三级缓存降锁
内容
(书中 Go 1.14,TCMalloc 思想)三级结构逐级放宽共享范围也逐级增加同步成本:mcache 挂在每个 P 上、同一时刻只有一个协程使用,分配无需加锁;mcentral 被所有 P 共享,按规格汇总 span 链表,访问需要加锁;mheap 管理全局虚拟地址空间和向操作系统申请内存,操作必须全局加锁。层级越低越快、只服务局部,层级越高越通用、但要付出锁的代价。
参考来源
- 位置:《Go语言底层原理剖析》第18章《内存分配管理》18.1.2节《三级对象管理》
- 结论依据:原文明确"每个逻辑处理器P都存储了一个本地span缓存,称作mcache。如果协程需要内存可以直接从mcache中获取,由于在同一时间只有一个协程运行在逻辑处理器P上,所以中间不需要加锁",并说明"mcentral是被所有逻辑处理器P共享的","对Heap进行的操作必须全局加锁,而mcache、mcentral可以被看作某种形式的缓存",因此可以推出"三级结构层级越低越无锁越快、层级越高越通用越需要加锁"的结论。
- 原始内容:为了能够方便地对span进行管理,加速span对象的访问和分配,Go语言采取了三级管理结构,分别为mcache、mcentral、mheap。Go语言采用了现代TCMalloc内存分配算法的思想,每个逻辑处理器P都存储了一个本地span缓存,称作mcache。如果协程需要内存可以直接从mcache中获取,由于在同一时间只有一个协程运行在逻辑处理器P上,所以中间不需要加锁……mcentral是被所有逻辑处理器P共享的……对Heap进行的操作必须全局加锁,而mcache、mcentral可以被看作某种形式的缓存。