PostgreSQL的数据存储(三)—数据缓存区和数据存储层的接口

2.2      良好的接口层抽象

通过研究f_smgr数据结构,我们可以清晰分解出如下IO函数需要的操作:

接口名称

接口下层函数

功能

smgr_init

mdinit

初始化一些系统需要的状态等,调用关系如下:

smgrinit

       BaseInit

              AutoVacLauncherMain

              AutoVacWorkerMain

              AuxiliaryProcessMain

              PostgresMain

从上面的调用关系可以看出,系启动的过程中,完成初始化的工作

smgr_create

mdcreate

创建一个“relation”(注意PG中,此处的“relation”指的是一个表的数据,而对象的定义,诸如视图、序列等,都是存储对的定义在系统表pg_class中,没有外存可见的文件存在)

smgrcreate

       fsm_extend

       RelationCreateStorage

       smgr_redo

       ATExecSetTableSpace

       vm_extend

       XLogReadBufferExtended

从上面的调用关系可以看出,新建、扩展、日志重做等操作会调用到创建relation

smgr_read

mdread

从指定的“relation”中读出指定块的数据到“数据缓冲区”,物理读操作。

smgrread

       ReadBuffer_common

              ReadBufferExtended

              ReadBufferWithoutRelcache

       copy_relation_data

从上面的调用关系可以看出,物理读操作,只与数据缓冲区打交道

smgr_prefetch

mdprefetch

从外存上预先读入数据到数据缓冲区。

f_smgr.smgr_prefetch  

       f_smgr

       smgrprefetch

              PrefetchBuffer

                     BitmapHeapNext

                            ExecBitmapHeapScan

                                   ExecProcNode

              LocalPrefetchBuffer

                     PrefetchBuffer

从上面的调用关系可以看出,预取功能是为bitmap扫描做的。除此外,本函数是为异步IO做的,但实际上PG还是采用的同步IO函数实现的本函数,

smgr_write

mdwrite

物理写操作,把数据缓冲区中的信息,刷出到外存

f_smgr.smgr_write

       f_smgr

       smgrwrite

              FlushBuffer

              FlushRelationBuffers

              LocalBufferAlloc

              _bt_blwritepage

从上面的调用关系可以看出,物理写操作,都是与数据缓存区层打交道。

smgr_nblocks

mdnblocks

计算一个“relation”所使用的块(8k一个块)的个数

smgr_extend

mdextend

一个“relation”空间不够的时候,自动扩展文件大小

smgr_truncate

mdtruncate

对一个“relation”空间做截断操作

smgr_immedsync

mdimmedsync

刷出一个“relation”的内容到外存

smgr_pre_ckpt

mdpreckpt

checkpoint之前,预先做一些操作

smgr_sync

mdsync

同步刷出数据到外存。(恢复过程中使用,暂不研究)

smgr_post_ckpt

mdpostckpt

checkpoint之后,收尾做一些操作(删除一些在事务没有完成前不能删除的文件)

smgr_exists

mdexists

判断外存文件是否存在

smgr_unlink

mdunlink

删除一个外存文件(一个“relation”)

smgr_close

mdclose

关闭一个外存文件(一个“relation”)

smgr_shutdown

NULL

系统关闭时,存储系统是否需要做些收尾工作,如果需要,可以置于此

 

以上函数,init可以对应shutdownopen对应closeread对应writecreate对应unlink,其他操作,是一些辅助类型的操作,但是必要。如,计算块的个数、文件扩展、截断、文件是否存在等等。注意,理解这些操作,就能理解一个接口层,抽象后,可以支持哪些操作了。

在数据缓冲区改进方式中,我们曾经提出,使用异步IO改进数据库系统的效率,如果我们改造存储层,则可以先从这一层做起,但接口的抽象,基本类似于上述内容。

转载自:https://blog.csdn.net/fly2nn/article/details/61924248

You may also like...