进程
2
(gdb) p BuerDescriptors
$1 = (BuerDescPadded *) 0xa615fb80
(gdb) p *BuerDescriptors
$2 = {buerdesc = {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-
>buers[]
数组管理,该数组存储的是
BuerDescriptors[]
数组的下标
+1
后的值,而每次取
buf
描述符时,从
strategy->current
值开始进行选择。选出的不可用后,依次向后进行遍历 ,
遍历到头后从头再来进行选择,即形成一个环。是否可用的标准后文详述。
4
、下面说下
BuerDesc
成员变量。
1
)
BuerTag tag
为一个描述符对应磁盘物理页的映射。即
space ID+database ID+
文件
ID
-- forkNum
(表文件还是
fsm
文件或者
vm
文件)
--
页号
2
)
buf_id
为
buer
数组
BuerBlocks[]
的下标
3
)
state
为状态标记,包括该
buer
的
refcount
和
usagecount
以及是否合法
valid
等待
4
)
wait_backend_pid
:若进程
A
需要 删除 的元 组所 在缓 冲块 有其 他进 程访 问, 即
refcount>0
时,进程
A
不能物理上删除元组。系统将该进程的
ID
记录在
wait_backend_id
上,然后对缓冲块加
pin
,并阻塞自己。当
refcount
为
1
时最后一个使用该缓冲块的进
程释放缓冲区时,会向
wait_backend_id
进程发送消息。
5
)
FreeNext
为链表的下一个节点的下标
6
)
content_lock
为
buer
锁,当进程访问缓冲块时加锁,读加
LW_SHARE
锁,写加
LW_EXCLUSIVE
锁
评论