深入理解缓冲区(八)

本文详细解析了Buf的元信息数据块结构,包括各个字段的意义和使用场景,着重介绍了如何通过该结构实现缓存块的有效管理和物理IO操作的同步。同时,文章深入探讨了与缓存层紧密相关的锁机制及其对并发处理的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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等)相关的,和并发有关,需要仔细查看,本文讲解缓冲区,不再多述并发相关内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值