$PostgreSQL: pgsql/src/backend/storage/smgr/README,v 1.6 2008/08/11 11:05:11 heikki Exp $
存储器管理
在原始的伯克利Postgres系统中,有多个存储器管理器.现在只剩下"磁盘"存储管理器(在伯克利,也有索尼光盘和持久存储主存的存储.但是在任何外部发布的Postgres或任意版本的PostgreSQL中已不再支持了.)不过,我们保留了存储管理器切换的开关,以备可能有人打算引入其他种类的存储管理器.
在伯克利Postgres系统中,每个关系都有一个其使用的存储管理器的ID,现在已经不需要了.将存储管理器与表空间关联起来更合理一些.(一个这篇文档没有写到的特性正在实现中,可能马上会引入到现在的代码中).
这个目录中的文件及其内容是:
smgrtype.c 存储管理器类型--将字符串名称映射为存储器管理器ID,并且提供了简单的比较操作符.这是系统表regproc中队类型"smgr"的支持.(这是遗留的代码,因为系统表中没有smgr的任何列了.)
smgr.c 存储管理器的切换分派代码.这个文件中的例程调用合适的存储管理器去访问硬件以响应后台进程的请求.smgr.c也会管理文件描述符缓存(SMgrRelation表).
md.c 磁盘存储管理器.
注意md.c依赖于src/backend/storage/file/fd.c
关系分支
从8.4版本开始,一个单一的smgr关系可以由多个物理文件组成,称为关系分支(relation forks).这样就允许将例如空闲空间信息等额外的元数据存储在额外的关系分支中.可以单独地对主数据文件进行扩展和截取操作.但仍然在系统表中将其作为一个单一的物理关系.
我们假设主关系分支,即编号为0或MAIN_FORKNUM的关系分支一直都存在.分支编号在src/include/storage/relfilenode.h中指定.smgr.c和md.c中的函数和使用除了relfilenode和块编号的额外的分支编号参数,来标识那个关系.因为很多代码都会访问主分支,为了方便,一个访问MAIN_FORKNUM的ReadBuffer的快捷版本在缓冲区管理器中提供.