您的位置:首页 > 其它

深入理解缓冲区(十二)

2011-10-17 08:25 204 查看

4.1.6 并行计算对buf置换的影响

并行计算对buf置换的影响,是指在多用户状态下,对buf中的缓存块同时读写时缓冲区的调度、处理、需要考虑的问题等等。

假设,A、B是三名仓库管理员,各管着100个仓库,每个仓库装入、取出哪个货主的货物,由管理员负责管理分配

A管理员,当有货主想取货物时,A都带着货主去每个仓库辨认一下货物是否是货主的,如是,则给货主支取;当有货主想存货物时,A都去每个仓库看一下,找到一个空的仓库,把货物存放进去;当货主想存货物而没有空仓库时,上级曾经规定,把最长不来取货的仓库腾空给新货主使用,所以,A管理员有个清理仓库的职责,但如果货物有价值,则先保存(到另外地方)货物使得仓库可被再用。

B管理员,是个聪明的人,他不想在有货主提取或存入货物时老跑每个仓库查看具体情况,而是把每个仓库、货主的情况记载下来(元信息),每次货主存取货物,都先查记载,这样便于管理。

C管理员,管理着高级仓库,每个仓库存储的货物,可以为多个货主提供存取服务(即每个仓库中的货物,可以被一个货主独占,也可以被多个或者共同查看—读、独自取—写)。

这样的假设,表明了对于仓库管理的需求和实际管理方式, B、C结合的管理,是最好的选择。

从代码的角度,在“4.1.4.2 Buf的元信息结构”节中,给出的BufferDesc结构的内容:

BufferDesc结构的成员
加减锁
操作函数/宏
锁模式
说明
buf_hdr_lock

LockBufHdr

UnlockBufHdr

PG的自旋锁(SpinLock)

1. 对自己(BufferDesc)进行保护

2. 当有refcount、usage_count等需要被改写时,加buf_hdr_lock锁

io_in_progress_lock

LWLockAcquire

LWLockRelease

LW_SHARED

LW_EXCLUSIVE

1. 为本层(数据缓冲区)下层(数据存储层)交换数据提供防止并发错误的机制

content_lock

LockBuffer

UnlockBuffers

BUFFER_LOCK_SHARE

BUFFER_LOCK_EXCLUSIVE

1. 对缓冲区进行保护

2. 当上层(数据访问层)读写缓冲区可能发生冲突时,可以使得读读并发,读写并发时先读不影响写、写不影响读

3. 为上层访问缓冲区提供防止并发错误的机制

BufferDesc结构的其他成员
数据类型
作用
说明
tag

BufferTag

外存的物理块的地址,是联系外存(物理地址)和内容(buf)的关键部分

flags

BufFlags

描述buf处于的状态

Buf从空闲到被使用,期间,可以被修改(脏页,BM_DIRTY

),脏页需要被刷出才可重用;

Buf也可以出于正在被读入或刷出状态,这时,会特别标识为BM_IO_IN_PROGRESS;

当buf出现错误时,会报告错误。

可以有下述状态:

BM_DIRTY

BM_VALID

BM_TAG_VALID

BM_IO_IN_PROGRESS

BM_IO_ERROR

BM_JUST_DIRTIED

BM_PIN_COUNT_WAITER

BM_CHECKPOINT_NEEDED

usage_count

uint16

使用计数器。被使用多少次,都自增1,直到涨到最大(用BM_MAX_USAGE_COUNT表示最大的限制数)

refcount

unsigned

Pin计数器(引用计数器)。被backend(带有用户连接的进程)pin住多少次。

buf_id

int

指向buf缓冲区的“指针”(buf缓冲区使用数组,所以用int做下标暂称之为指针)

freeNext

int

执行空闲缓冲区的“指针”(buf缓冲区使用数组,所以用int做下标暂称之为指针)

特别注意:

Buf,是内存操作,是内外存交流的汇集点,起着承上启下的作用,但其本身位于内存中,故很多操作,和内存紧密相关,需要特别的注意。

很多细节,需要阅读代码+仔细揣摩、才能明白体会深刻。很多与其他模块相关联的点,没有提及,但可能也影响着buf的管理。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: