深入理解缓冲区(八)
来源:互联网 发布:鹰蛋算法 编辑:程序博客网 时间:2024/05/29 04:21
4.1.4.2 Buf的元信息结构
Buf的元信息数据块的结构信息如下,描述了每一个缓存块的使用情况:
typedef struct sbufdesc
{
BufferTag tag; /* ID of page contained in buffer */ // 起着连接内存和外存地址映射的作用,通过这个,可以决定缓存块的脏信息写到外存的什么位置;如果是新读入的块,则根据新读入的块的地址给本变量赋值
BufFlags flags; /* see bit definitions above */
uint16 usage_count; /* usage counter for clock sweep code */
unsigned refcount; /* # of backends holding pins on buffer */
int wait_backend_pid; /* backend PID of pin-count waiter */
slock_t buf_hdr_lock; /* protects the above fields */
int buf_id; /* buffer's index number (from 0) */
int freeNext; /* link in freelist chain */
LWLockId io_in_progress_lock; /* to wait for I/O to complete */
LWLockId content_lock; /* to lock access to buffer contents */
} BufferDesc;
结构中的其他成员,也很重要,如果想掌握全部用法,请核对代码,一一细看其调用方式。
第二个成员,标识了buf的状态,如下:
#define BM_DIRTY (1 << 0) /* data needs writing */
#define BM_VALID (1 << 1) /* data is valid */
#define BM_TAG_VALID (1 << 2) /* tag is assigned */
#define BM_IO_IN_PROGRESS (1 << 3) /* read or write in progress */
#define BM_IO_ERROR (1 << 4) /* previous I/O failed */
#define BM_JUST_DIRTIED (1 << 5) /* dirtied since write started */
#define BM_PIN_COUNT_WAITER (1 << 6) /* have waiter for sole pin */
#define BM_CHECKPOINT_NEEDED (1 << 7) /* must write for checkpoint */
不同状态,buf有需要不同的处理。
需要注意的是,buf层起着连接物理IO和上层数据访问的桥梁作用,所以,对上对下的重要信息,都在这个结构中。
如成员“io_in_progress_lock”,与物理IO相关,被调用关系如下:
sbufdesc.io_in_progress_lock
UnpinBuffer
WaitIO
InvalidateBuffer
StartBufferIO
WaitIO
StartBufferIO // 与缓存相关的一个重要函数,从物理存储往缓存块中加载数据
TerminateBufferIO
AbortBufferIO
InitBufferPool
sbufdesc
再有,与锁(content_lock、buf_hdr_lock等)相关的,和并发有关,需要仔细查看,本文讲解缓冲区,不再多述并发相关内容。- 深入理解缓冲区(八)
- 深入理解缓冲区(一)
- 深入理解缓冲区(二)
- 深入理解缓冲区(三)
- 深入理解缓冲区(四)
- 深入理解缓冲区(五)
- 深入理解缓冲区(六)
- 深入理解缓冲区(七)
- 深入理解缓冲区(九)
- 深入理解缓冲区(十)
- 深入理解缓冲区(十一)
- 深入理解缓冲区(十二)
- 深入理解缓冲区(十三)
- 深入理解缓冲区(十四)
- 深入理解缓冲区(十五)
- 深入理解缓冲区(十六)
- 深入理解缓冲区(十七)
- 深入理解缓冲区(十八)
- 离开乔布斯的日子
- 大小不固定的图片、多行文字的水平垂直居中
- 网络营销的秘诀
- 当ibatis 包含大于小于号的sql语句
- 多动手
- 深入理解缓冲区(八)
- 开博啦
- STM32序列——中断和事件
- C++中extern “C”含义深层探索
- VB.NET程序运行耗时精确计量方法之一
- [随笔] 记在项目完成之后
- 为什么只有死了,才会引起我们普通大众的关注?
- oracle忘记密码
- 如何让input和img水平对齐