一、共享缓冲区数据结构
1、Buffer由数组BufferDescriptor[]数组进行管理。该数组由函数InitBufferPool创建,大小为NBuffers个成员即BufferDesc。该数组创建后由StrategyControl进行管理,firstFreeBuffer为链表头,指向链表第一个成员;lastFreeBuffer指向链表尾;所有free list中成员由freeNext串起来,该值为数组下标。
2、BufferDescriptor数组是共享内存中申请,所有进程共享。
进程1:(gdb) p BufferDescriptors$1 = (BufferDescPadded *) 0xa615fb80(gdb) p *BufferDescriptors$2 = {bufferdesc = {tag = {rnode = {spcNode = 1664, dbNode = 0, relNode = 1262}, forkNum = MAIN_FORKNUM, blockNum = 0}, buf_id = 0, state = {value = 2199126016}, wait_backend_pid = 0, freeNext = -2, content_lock = {tranche = 53, state = {value = 536870912}, waiters = { head = 2147483647, tail = 2147483647}}}, pad = "200"}进程2(gdb) p BufferDescriptors$1 = (BufferDescPadded *) 0xa615fb80(gdb) p *BufferDescriptors$2 = {bufferdesc = {tag = {rnode = {spcNode = 1664, dbNode = 0, relNode = 1262}, forkNum = MAIN_FORKNUM, blockNum = 0}, buf_id = 0, state = {value = 2199126016}, wait_backend_pid = 0, freeNext = -2, content_lock = {tranche = 53, state = {value = 536870912}, waiters = { head = 2147483647, tail = 2147483647}}}, pad = "200"}
3、同时还会通过一个环形区进行管理这些数组成员。当进行大表扫描时使用。由strategy->buffers[]数组管理,该数组存储的是BufferDescriptors[]数组的下标+1后的值,而每次取buf描述符时,从strategy->current值开始进行选择。选出的不可用后,依次向后进行遍历,遍历到头后从头再来进行选择,即形成一个环。是否可用的标准后文详述。
4、下面说下BufferDesc成员变量。
1)BufferTag tag为一个描述符对应磁盘物理页的映射。即space ID+database ID+文件ID -- forkNum(表文件还是fsm文件或者vm文件)-- 页号
2)buf_id为buffer数组BufferBlocks[]的下标
3)state为状态标记,包括该buffer的refcount和usagecount以及是否合法valid等待
4)wait_backend_pid: