PostgreSQL中的StrategyGetBuffer源码解析

  1. GetBufferFromRing从环上获取buffer
  2. 如果没有读取到buffer,则唤醒bgwriter
  3. StrategyControl->numBufferAllocs加1,这个是为了给bgwriter进程估计buffer的使用率
  4. 申请spin锁,从freelist(保存在StrategyControl中)移动元素时需要申请spinlock
  5. 从freelist头部获取buffer,如果这个buffer的使用计数和引用计数都为0,则将这个buffer放入ring中,并返回这个buffer
  6. 如果在freelist中也没有找到buffer,则使用clock sweep算法

ClockSweepTick函数,每次的牺牲者从StrategyControl->nextVictimBuffer取得,然后StrategyControl->nextVictimBuffer加1,如果牺牲者槽位号超过NBuffer,则进入victim回卷处理流程。具体做法是,将nextVictimBuffer重新赋值为其对于NBuffers的余数(即从1开始)。

ClockSweepTick保证了牺牲者编号从1~NBuffers,超过NBuffers后,再从1开始递增查找牺牲者。

每找到一个victim,如果对应的buffer引用计数为0,则看使用计数,如果使用计数不为零,则使用计数减1,如果使用计数为零,则选定这个buffer,将这个buffer放入ring

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值