PostgreSQL的数据存储(二)---数据缓存去和数据存储层的接口

本文深入探讨了数据缓冲区与数据存储层之间的接口设计,包括存储访问接口层的作用、关键数据结构及其在PostgreSQL系统中的应用。详细解释了接口层如何通过抽象实现两层之间的有效交互,确保数据高效流动与存储。

2 数据缓冲区和数据存储层之间的接口

2.1 存储访问接口层

位于buffer下层的代码,是数据存储层,但数据缓冲区和数据存储层之间,有一个接口存在,位于src/backend/storage/smgr;这一接口,规定了数据缓冲区和数据存储层之间如何交互,如何发生关联。

PG的结构良好,很多层之间,可以很好的分离,这点也体现在了本文所讲述的接口之间。接口层,通过抽象,规定了两层之间,发生关联的点;通过定义这些关联的点动作和出入口参数,完整描述了接口层的概貌。

在数据缓冲区的文档中,讲述了ReadBufferExtended函数极其调用的ReadBuffer_common子函数中,可能都涉及的、类似smgrXXX函数的调用,如smgrread,这是buf层的函数发现buf中没有相应的数据可向数据访问层提供,则buf管理器直接向数据库存储层要求IO,使得被要求的数据能够进入buf。

关键数据结构如下:

typedef struct f_smgr

{

void (*smgr_init) (void); /* may be NULL */

void (*smgr_shutdown) (void); /* may be NULL */

void (*smgr_close) (SMgrRelation reln, ForkNumber forknum);

void (*smgr_create) (SMgrRelation reln, ForkNumber forknum,

bool isRedo);

bool (*smgr_exists) (SMgrRelation reln, ForkNumber forknum);

void (*smgr_unlink) (RelFileNodeBackend rnode, ForkNumber forknum,

bool isRedo);

void (*smgr_extend) (SMgrRelation reln, ForkNumber forknum,

BlockNumber blocknum, char *buffer, bool skipFsync);

void (*smgr_prefetch) (SMgrRelation reln, ForkNumber forknum,

BlockNumber blocknum);

void (*smgr_read) (SMgrRelation reln, ForkNumber forknum,

BlockNumber blocknum, char *buffer);

void (*smgr_write) (SMgrRelation reln, ForkNumber forknum,

BlockNumber blocknum, char *buffer, bool skipFsync);

BlockNumber (*smgr_nblocks) (SMgrRelation reln, ForkNumber forknum);

void (*smgr_truncate) (SMgrRelation reln, ForkNumber forknum,

BlockNumber nblocks);

void (*smgr_immedsync) (SMgrRelation reln, ForkNumber forknum);

void (*smgr_pre_ckpt) (void); /* may be NULL */

void (*smgr_sync) (void); /* may be NULL */

void (*smgr_post_ckpt) (void); /* may be NULL */

} f_smgr;

static const f_smgr smgrsw[] = {

/* magnetic disk */

{mdinit, NULL, mdclose, mdcreate, mdexists, mdunlink, mdextend,

mdprefetch, mdread, mdwrite, mdnblocks, mdtruncate, mdimmedsync,

mdpreckpt, mdsync, mdpostckpt

}

};


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值