Berkeley DB 1.8.6源代码学习(二)

函数信息

数据库

db.c 文件

dbopen 函数:

参数:

fname :数据库文件名;

flags :打开数据库的标志;

mode :访问数据库文件的方式,只读、读写等;

type :数据树采用的数据结构: B 树、哈希表、 RECNO 算法等;

openinfo :数据库的基本信息,根据使用不同的数据结构而不同;

返回值:成功则数据库指针;

伪代码:

根据 type 分别采用不同的打开数据库的方式,将参数传给相关的函数;这些函数可以在各自的 open.c 中找到。

 

缓冲池

mpool.c 文件

mpool_open 函数

参数:

key :暂时未发现其作用;

fd :缓冲池待缓冲的文件描述符,即数据库文件;

pagesize :缓冲池页面大小;

maxcache :缓冲池中页面的最大数量;

返回值:成功则返回缓冲池指针;

伪代码:

获取缓冲文件信息;

为缓冲池结构分配内存并初始化其中的 lru 队列和哈希表;

根据参数设置最大缓冲页数;

计算缓冲池需要缓冲的页面数,即缓冲文件中含有的页面总数;

设置缓冲池页面大小;

设置缓冲池缓冲文件的描述符;

 

mpool_new 函数:用于创建一个新的内存页

参数:

mp :缓冲池指针;

pgnoaddr :用于返回新创建的页面编号

flags :页面编号的产生方式,递增、指定等;

返回值:成功则返回新创建的页面;

伪代码:

如果当前文件的页面超出允许的最大值则创建失败;

使用 mpool_bkt 函数创建一个页面 bp

根据 flags 参数设置 bp 编号,同时将页面总数加 1

将新页面插入到哈西表对应队列的头部;

将新页面插入到 lru 队列的尾部;

 

mpool_delete 函数

参数列表:

mp :缓冲池指针;

page :页面地址;

返回值:成功返回 RET_SUCCESS;

伪代码:

取出页面信息(参照 PAGE 结构可知);

分别从哈西表和 lru 队列中删除页面相关信息;

释放页面所占内存;

 

mpool_get 函数:获取一个页面

参数列表:

mp :缓冲区指针;

pgno :待获取页面的编号;

flags :传递一些辅助信息,主要是是否忽略 PIN 标志;

返回值:成功则返回页面指针;

伪代码:

检查待去页面是否在缓冲区;

如果在缓冲区则将其移动到哈西表对应队列的头部,并将其移动到 lru 对应队列的尾部,这是缓冲区的调度思想;将页面标记为 PIN 页面;

如果页面不在缓冲区,则使用 mpool_bkt 获取一个内存页面以备从文件中读入待读取的页面;

根据页面编号将文件的读取指针移动到对应的便宜量,从文件中读出对应的页面到内存中刚获取的页中;

更新内存中的页面信息,同时根据调度思想将页面插入到哈西表的头部和 lru 队列的尾部;

由于文件中的字节大小端可能和内存中实际使用的不一致(譬如从其他机器或网络上复制过来的数据库文件可能和本地机器不一致),使用读入过滤器修订页面中的字节顺序;

 

mpool_put 函数:关闭 PIN 标记,根据参数决定是否设置 MPOOL_DIRTY 标记;

参数列表:

mp :缓冲池指针;

page :页面指针;

flags :指示标记;

返回值:成功则返回会成功;

伪代码:

获取页面基本信息;

取出 PIN 标记;

如果 flags 参数设置了 MPOOL_DIRTY 标记,则将页面设置 MPOOL_DIRTY 标记;

 

mpool_close 函数:关闭缓冲池

参数列表:

mp :缓冲池指针;

伪代码:

释放缓冲池中的页面;

释放缓冲迟结构;

 

mpool_sync 函数:同步内存与磁盘;

参数列表:

mp :缓冲池指针;

伪代码:

遍历 lru 队列,将其中所有的页面检查一次,如果页面具备 MPOOL_DIRTY 标志,则使用 mpool_write 函数将其写入到文件中;

将文件缓冲区中的数据写回磁盘;

 

mpool_bkt 函数:从缓存中取得一个页面(新创建或按照调度方案替换);

参数列表:

mp :缓冲池指针;

返回值:成功则返回 BKT 指针;

如果当前缓冲池所用的内存并未达到上限,则可以新创建一个页面;

新创建一个页面首先为页面及其 BKT 分配内存,设置 BKT 的属性,将缓冲池所占页面数加 1

如果缓冲池可用内存已满,则需要调度一个页面到磁盘上去;

按照调度方案,将 lru 队列中第一个没有 PIN 标记的页面调度出去,如果需要,将页面内容写回磁盘;

如果 lru 中没有可用的页面,而且缓冲吃内存已满,则继续分配内存,创建新的页面,不再管缓冲池最大缓冲内存的限制;

 

mpool_write 函数:将缓冲池中页面写回;

参数列表:

mp :缓冲池指针;

bp :待写回页面的 BKT

伪代码:

使用过滤器作写磁盘前的转换;

根据页面编号移动文件读写指针;

写回页面;

取消页面的 MOPPL_DIRTY 标记;

 

mpool_look 函数:在缓冲池中查找指定页面;

参数列表:

mp :缓冲池指针;

pgno :查找页面的编号;

返回值:页面信息 BKT

伪代码:

根据哈西函数获取页面所在队列的头指针;

遍历对应的队列,找到对应编号的页面,并检测其是否设置了 MPOOL_INUSE 标记,若满足则返回该页面;

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值