berkeleydb 1.86 页面结构



typedef struct _page {//用于记录内存页的信息,位于页面的开头部分,含有 7 个成员变量
	pgno_t	pgno;			/* this page's page number 页面编号*/
	pgno_t	prevpg;			/* left sibling 左兄弟*/
	pgno_t	nextpg;			/* right sibling 右兄弟*/

#define	P_BINTERNAL	0x01		/* btree internal page */
#define	P_BLEAF		0x02		/* leaf page */
#define	P_OVERFLOW	0x04		/* overflow page */
#define	P_RINTERNAL	0x08		/* recno internal page */
#define	P_RLEAF		0x10		/* leaf page */
#define P_TYPE		0x1f		/* type mask */
#define	P_PRESERVE	0x20		/* never delete this chain of pages */
	u_int32_t flags;  //页面类型, 上面的宏定义

	indx_t	lower;			/* lower bound of free space on page 空闲区低端指针*/
	indx_t	upper;			/* upper bound of free space on page 空闲区高端指针*/
	indx_t	linp[1];		/* indx_t-aligned VAR. LENGTH DATA 页面存储实际数据的索引起点*/
} PAGE;
      关于内存页需要关注其具体的部署,上述数据结构存储于页面的开始部分,从 linp 到页面结束用于存储实际的数据,同时这部分分为三个部分,靠近页面开始的部分, 即 linp 开始的部分是索引区,从页面的最高端,即页面结束的地址, 向页面开始方向是数据区,中间的部分是空闲区,空闲区使用 lower 和 upper 划定区间,即如果以 END 标示页面的最高地址 — 结束地址,则 linp-- ( *lower )是索引区,( *lower ) -- ( *upper )是空闲区,( *upper ) --END 是数据区;

       当向页面中写入数据时,首先按照数据的大小在空闲区分配相应的区间,分配方式是将( *upper )向( *lower )方向移动待存入数据大小的空间,然后,将此事 upper 指向的地址记录下来,即索引的值,这就需要为索引分配一个内存空间, 分配的方式是将( *lower )向( *upper )方向移动存放地址的空间。如此完成了对存储数据的分配,对数据的访问通过 linp[] 即可取出对应的 index 的值, 从而访问需要的数据。至于访问时如何知道数据的大小,数据的开始 4 个字节构成的无符号整数记录的数据的实际大小。





Overflow Page的结构, Overflow page 用于存储一条记录的数据大小大于bt_ovflsize时,就将数据的一部分保存于overflow page.




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值