读书笔记:《Transaction Processing》Chapter 13 Buffer Management

缓冲区管理

数据库缓冲区的工作原理

TP中对缓冲区作用的一个比较好的概述)

       数据库缓冲区是基本文件系统和面向元祖的文件系统之间的调解器。缓冲区管理器的主要目的是使得页面在主存中可以寻址,并且同日志管理程序和恢复管理器一致地向磁盘写页面。它也应该减小为做这些事情而进行的实际磁盘存取次数。

 

       在磁盘和缓冲池之间移动页面是缓冲区管理器的基本职能。

 

真实情况下的缓冲区管理器:

1、  每个文件的缓冲区:缓冲区不只是针对一片存储区域,可以是任意一个文件;

2、  每个页面尺寸的缓冲区:不同大小的页面会有不同的缓冲区,以此避免缓冲区大小不合适带来的空间分配问题和磁盘上的区段分配问题;

3、  每个文件类型的缓冲区:一些系统依据存取模式给文件提供缓冲区,并且用一种按他们各自的文件组织方式是最优的方法来管理其中的每一个文件。

数据库缓冲区的简单数据结构:

#define buffersize MANY

#define hashsize PRIME

Struct {

       PAGE_HEADER page_header;

       Char              page_body[];

       }     bufferpool[buffersize];

 

高层模块和缓冲区管理器的相互作用的原理:

一、该模块发现需要存取存储在页面P上的偏移O地址上的数据。由于偏移O为页面内部的相对地址,该模块以P为参数调用该页面;

二、缓冲区处理:

1、  在缓冲区内搜索。如果找到,将对应的帧(frame)号返回给调用者。

2、  寻找空闲帧。如果需要的页面不在缓冲池内,检查是否有一个不包含有效页面的frame。(如果有则抛弃frame中的原有页面,后续从磁盘中读入所需的page

3、  决定被替换的页面。如果没有空闲frame存在,需要确定一个能被移除缓冲区的页面,以便重新使用它的frame。(决定页面替换的算法需要慎重考虑)。

4、  写已经修改过的页面。如果一个被选定的将要被替换出去的页面在缓冲区中被修改了,需要按照WAL协议把它写回到磁盘块。如果没有没修改则可以简单地覆盖之即可。

5、  建立帧地址。现在需要确定用哪个frame来容纳所请求的page。该frame的起始地址记做F

6、  确定块的地址。利用文件目录和基本文件描述项,把请求的PAGEID P转换成一个FILEID和一个块号。检查文件是否是打开的,把该块读到所选择的frame中。

7、  返回。将frame地址F返回给调用者。

 

注意:打开文件由单独的函数完成,而不是由缓冲区管理器来执行。

 

 

       基于以上描述,解释下传统的文件缓冲区和数据库缓冲区之间的区别:

1、  不将调用者请求的页面返回到自己的地址空间,而只是将返回一个在缓冲区管理器区域内的存取相应页的地址。目的是为了避免“丢失更新”。所有调用者共享数据,不可以有自己的私有副本,所有的变更都必须反映到公共数据区。

2、  普通文件系统的借口和缓冲区管理器接口的不同。缓冲区管理器对各种访问、修改操作都“登记在案”,缓冲区管理器对客户的行为了如指掌,事务的行为被很好地控制。而普通文件系统则会发生请求未涉及的页面别修改的情况,也就是说与申请事务无关的页面被修改了

缓冲区管理器提供:

1、  共享 缓冲区是一个所有运行数据库代码的进程都可存取的共享虚存区域;

2、  可寻址能力 每一个存取模块返回一个缓冲池中的地址,该地址是容纳所请求页面的frame的起始地址

3、  信号量保护 当许多进程同时对同一页面提出访问请求的时候,缓冲区管理器提供相同的frame地址。并且,缓冲区管理器为每个页面提供一个信号量,以便利用它实现枷锁协议。

4、  永久存储 如果存取模块的页面存取操作造成了一个页面的更新,则它们通知缓冲区管理器。(实际的写操作有缓冲区管理器在更新事务的更新操作结束后的较长一段时间后完成)。

 

 

原文地址:https://www.cnblogs.com/YFYkuner/p/1609876.html