设为首页 收藏本站
查看: 1008|回复: 0

[经验分享] PostgreSQL存储引擎源码分析一(不断更新)

[复制链接]

尚未签到

发表于 2016-11-21 10:14:36 | 显示全部楼层 |阅读模式
  PostgreSQL的存储系统作为PostgreSQL的最低层,向下通过操作系统系统接口访问物理数据,向上为存取系统提供由缓冲区页面及页面上的接口函数。
  存储系统的总体架构如下图所示(转自贵州大学硕士黄崇争毕业论文“开放源代码DBMS的分析,比较”)
DSC0000.jpg 注释:Lock Manager是锁管理器,IPC是进程间通信,他们实现了存取层对存储层的互斥访问,操作。

  存储系统各子系统功能如下:
  Page Manager:对缓冲区页面的结构进行定义并提供页面的相关操作。
  Buffer Manager:对共享缓冲区和本地缓冲区进行管理。
  Storage Manager:屏蔽不同物理设备接口函数的差异,向Buffer Manager提供统一的接口。
  File Manager:一般的操作系统只允许一个进程打开256个文件,而PostgreSQL服务器在工作时需要打开的文件会很多,因此,其使用File Manager来封装操作系统文件读写的函数。
  下面对Page Manager的一段代码进行分析:Page Manager模块的功能上面已经讲到过,这里便不再赘述,这个模块主要由三个文件组成:源码根目录下的backend\storage\page路径下的bufpage.c,itemptr.c,以及根目录下include\storage路径的头文件bufpage.h组成。
  页面Page的结构大致如下:页面由页首部,页面存储记录的ID,存储的记录以及特殊空间所组成。其中,页面首部定义在bufpage.h文件中。如下所示:
  typedef struct PageHeaderData
{
XLogRecPtr pd_lsn;   /* XLogRecPtr是定义在/include/access/xlogdefs.h中的一个结构体,定义了存取层所用的日志文件 ,期待其他模块同学的完善。*/
uint16  pd_tli;   /* 善未搞明白。。。*/
uint16  pd_flags;  /* 页首部标志*/
LocationIndex pd_lower;  /* 页面空闲区域起始偏移量 ,LocationIndex 是无符号16位整型数据,下同*/
LocationIndex pd_upper;  /* 页面空闲区域结束偏移量 */
LocationIndex pd_special; /* 页面特殊区域起始偏移量 */
uint16  pd_pagesize_version;/* 页面大小*/
TransactionId pd_prune_xid; /* 不重要的XID, 如果为空则为0 */
ItemIdData pd_linp[1];  /* ItemidData是定义在/include/storage/itemid.h中的结构体,主要定义了元组项的底层特征:元组在页面上的偏移量,元组项指针的状态,元组的比特位长度,这里是定义了一个元组项的一个指针,指向页面不同的元组项(也就是记录) */
} PageHeaderData;
  typedef PageHeaderData *PageHeader;
  下面来分析/backend/storage/page/bufpage.c中的PageInit函数(页面初始化)
  void PageInit(Page page,Size pageSize,Size specialSize)
  {
  PageHeader p = (PageHeader) page;
   specialSize = MAXALIGN(specialSize);//MAXALIGN是常量表达式
   Assert(pageSize == BLCKSZ);//如果页面大小和磁盘块大小相等的话,函数终止,页面初始化失败
Assert(pageSize > specialSize + SizeOfPageHeaderData);//SizeofPageHeaderData是定义在bufpage.h中的宏,即offsetof(PageHeaderData, pd_linp),功能是获得页面首部中pd_linp数组的偏移量,如果页面大小大于特殊空间大小与偏移量之和的话,函数终止。
  MemSet(p, 0, pageSize);//讲页首部初始化,清零。
  p->pd_lower = SizeOfPageHeaderData;//初始化页面空闲区域起始偏移量
p->pd_upper = pageSize - specialSize;//初始化页面空闲区域结束偏移量
p->pd_special = pageSize - specialSize;//初始化特殊区域起始偏移量
PageSetPageSizeAndVersion(page, pageSize, PG_PAGE_LAYOUT_VERSION);//设置页面大小以及页面布局的版本号,这是定义在bufpage.h下的一个宏原型为:#define PageSetPageSizeAndVersion(page, size, version) \
( \
AssertMacro(((size) & 0xFF00) == (size)), \
AssertMacro(((version) & 0x00FF) == (version)), \
((PageHeader) (page))->pd_pagesize_version = (size) | (version) \
)里面基本上是一些位操作:将页面大小的后16位置0,版本号的前16为置0.
  }
  今天就分析到这里,希望大家给出意见,给予改正,谢谢!
  姓名:鲁笛 主题:存储系统之缓冲区页面描述

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-303319-1-1.html 上篇帖子: 数据库服务器 之 Postgresql备份和恢复------SQL转储篇 下篇帖子: postgresql 多版本并发控制(MCC)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表