- GetBufferFromRing从环上获取buffer
- 如果没有读取到buffer,则唤醒bgwriter
- StrategyControl->numBufferAllocs加1,这个是为了给bgwriter进程估计buffer的使用率
- 申请spin锁,从freelist(保存在StrategyControl中)移动元素时需要申请spinlock
- 从freelist头部获取buffer,如果这个buffer的使用计数和引用计数都为0,则将这个buffer放入ring中,并返回这个buffer
- 如果在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