4.1.3.2 从buf分配看buf的使用
BufferAlloc函数,当有buf可以被分配时,从缓冲区拿出“空闲”(有个freelist结构)的缓存块进行分配,如果缓冲区已经满,则根据缓存淘汰算法,对缓存中的被选中的脏页进行刷出,然后分配给提出需求者。
BufferAlloc被调用关系:
BufferAlloc
ReadBuffer_common
ReadBufferExtended
ReadBufferWithoutRelcache
BufferAlloc代码分析:
1. 变量定义区,查看“volatile BufferDesc *buf;”的使用之处,可以更好把握buf的分配情况
2. “buf_id = BufTableLookup(&newTag, newHash);”,调用BufTableLookup函数确定要求的块是否在缓冲区中?
3. 接第二步,如果找到这样的缓存块,则作为BufferAlloc函数的返回值返回找到的缓存块
4. 接第二步,如果没有找到,反复循环,淘汰一些缓冲块出缓冲区(通过对StrategyGetBuffer函数的调用、对得到的buf判断是否是dirty,如果是,则淘汰。注意StrategyGetBuffer函数中,对于缓冲区淘汰策略的使用方式,如何淘汰,取决于淘汰算法------仔细看StrategyGetBuffer函数的实现),直到找到一个可以分配的缓存块
5. 接第四步,为找到的缓存块,赋予恰当的值