影子内存的备份方法及装置转让专利

申请号 : CN200810048590.X

文献号 : CN101339527B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 余鑫张瑞

申请人 : 华中科技大学

摘要 :

本发明公开了一种影子内存的备份方法,包括:当不同事务请求了相同的页面而发生冲突时,将发生冲突的所述事务在影子内存中合并,并将所述事务请求的所有页面加载到当前页链表,执行合并后的事务,执行事务完成后将所述合并后的事务提交。本发明还公开了一种影子内存的备份装置,包括冲突判定模块、合并模块、加载模块、事务执行模块,以及提交模块。本发明通过将访问页面发生冲突的事务合并为一个事务,节省了事务请求页面时发生冲突而等待的时间,保证了实时事务不会因为等待执行而过期;并且减少了加锁转移导致的页面在链表上循环次数,提高了系统的吞吐率。

权利要求 :

1.一种影子内存的备份方法,其特征在于,包括以下步骤:

当一事务开始执行,向内存请求页面,并在日志管理器中写入一个节点;

在当前页链表中查找所述请求的页面,如果找到,则表明所述一事务与同样请求所述页面的其它事务发生冲突,判断所述发生冲突的事务是否适合合并,如果是,则执行事务合并操作;否则继续在当前页链表中查找所述请求的页面;

执行所述合并操作时,将日志管理器中所述发生冲突的事务对应的节点合并,生成新的合并节点,从而构造了一棵倒置的二叉树,该二叉树称为合并树,所述发生冲突事务所请求的页面都并入新的合并节点,并将所述事务请求的所有页面加载到当前页链表,所述合并后的事务请求页面成功后,修改该页面的标记位,对该页面执行相应操作;

操作完成后,再次修改所述标记位;

循环执行对所有请求的页面的操作,直到事务完成;

在所述合并树中找到所述事务的最底层节点,修改该节点的事务完成标记,事务完成后,扫描该事务所属的合并树,如果属于该合并树的所有事务都完成,则利用合并树中记录的事务的ID,返回日志管理器中,将该事务操作所有涉及的页面拷贝至内存;

把该事务在当前页链表中对应的页挂载到备份页链表上,等待后台的线程完成备份;

删除日志管理器中的对应节点,然后删除日志管理器中对应的合并树。

2.根据权利要求1所述的方法,其特征在于,该方法进一步包括:在影子内存中设置日志管理器,维护对事务的管理,在所述日志管理器中,任何事务都存在与其对应的节点。

3.根据权利要求1或2所述的方法,其特征在于,所述判断发生冲突的事务是否适合合并具体包括:如果请求冲突的页面标志位为1,则不能执行合并;

找到发生请求冲突的页面所指向的事务后,在日志管理器中查找,如果找到该事务的合并树,计算该树的合并深度,如果该深度大于等于一阈值,则不能执行合并;

如果所述发生冲突的事务的所有标志位为1,则不能执行合并;

否则,判定所述发生冲突的事务适合合并。

4.根据权利要求3所述的方法,其特征在于,所述一阈值为3。

5.一种影子内存的备份装置,其特征在于,包括:

冲突判定模块,用于判定不同事务请求了相同的页面而发生冲突;当一事务开始执行,向内存请求页面,并在日志管理器中写入一个节点;在当前页链表中查找所述请求的页面,如果找到,则表明所述一事务与同样请求所述页面的其它事务发生冲突,判断所述发生冲突的事务是否适合合并,如果是,则执行事务合并操作;否则继续在当前页链表中查找所述请求的页面;

合并模块,用于将日志管理器中所述发生冲突的事务对应的节点合并,生成新的合并节点,从而构造了一棵倒置的二叉树,该二叉树称为合并树,所述发生冲突事务所请求的页面都并入新的合并节点;

加载模块,用于将所述事务请求的所有页面加载到当前页链表;

事务执行模块,用于执行合并后的事务;修改该页面的标记位,对该页面执行相应操作;操作完成后,再次修改所述标记位;循环执行对所有请求的页面的操作,直到事务完成;在所述合并树中找到所述事务的最底层节点,修改该节点的事务完成标记,提交模块,用于将执行完成的所述合并后的事务提交,事务完成后,扫描该事务所属的合并树,如果属于该合并树的所有事务都完成,则利用合并树中记录的事务的ID,返回日志管理器中,将该事务操作所有涉及的页面拷贝至内存;把该事务在当前页链表中对应的页挂载到备份页链表上,等待后台的线程完成备份;。

6.根据权利要求5所述的装置,其特征在于,该装置进一步包括:日志管理器,用于维护对事务的管理,在所述日志管理器中,任何事务都存在与其对应的节点。

说明书 :

影子内存的备份方法及装置

技术领域

[0001] 本发明涉及内存的管理技术,特别是影子内存的备份方法及装置。

背景技术

[0002] 目前,对内存等实时数据库的备份主要采取两种技术,一种基于日志,一种是基于影子内存。
[0003] 日志技术主要采用记载的形式描述事务执行前后将产生的影响。此外,日志技术需要结合检查点来完成备份和恢复。影子内存则是用影子拷贝的方法记录事务前印象和后印象完成备份。影子内存是一种非易失性存储器,其存取速度约为内存的一半,远大于磁盘存储器等外存。
[0004] 内存数据库发展初期,主要借鉴磁盘数据库普遍使用的日志技术来做备份,但是日志回写磁盘的方式严重影响了数据库的速度和效率,而且分析日志耗时过大,重载速度慢。
[0005] 影子内存技术一般情况下对事务串行处理,导致其速度优势得不到最大程度的发挥充分利用,内存的管理也需要大量的时间开销。当事务访问页面集中时,事务之间碰撞冲突比较多,事务必须等待执行,事务等待容易使实时事务因为过期而失效。
[0006] 影子内存放在非易失性存储器上,普遍的管理办法是将影子内存分为四个链表:
[0007] 1、当前页链表:是当前事务所涉及页面的镜像拷贝,事务提交前将该事务访问的页面回写到内存中,提交后,这些页从当前页链表中被移除,并挂载到备份页链表上。
[0008] 2、备份页链表:该链表上的页面的特点就是反映出最新的数据库状态,是内存中对应页的完全拷贝,但是这些页上的更新还没有完全反映到磁盘备份上。存在一个后台的线程不断的将备份页链表中的页面转移到磁盘中完成备份,备份线程主要完成拷贝工作,已完成备份的页将会挂载到可用页链表上。
[0009] 3、可用页链表:完成备份的页,这些页上的数据已经成为历史数据,留作备用。在必要的情况下,比如可用页链表已满,则会将新的可用页挂载到空闲页链表上。另一种情况下,例如某事务要访问某页面,会先到可用页链表中查找是否存在该页面,如果没有,会去内存中将该页面拷贝到可用页链表中,从而被直接覆盖成为其他内存页的镜像拷贝。
[0010] 4、空闲页链表:当当前事务操作失败或者备份页与当前页冲突,把该页挂载到空闲页链表上。如果没有空闲页,可以将当前能够使用的页变为空闲页,比如已完成备份的页。备份页与当前页冲突一般发生在一事务对某页面操作后,该修改后的页面被转移到备份页链表,此时,另一事务也对该页面进行了修改,修改后也被转移到了备份页链表中,假如此时前一修改页面还未来得及完成备份,此时在备份页链表中就出现了同一页面的两种形式,显然应该将第二次的修改页面进行备份,所以就应将前一修改页面转移到空闲页链表中,这一处理称为加锁转移。频繁的加锁转移会降低影子内存的运行效率。
[0011] 对于加锁转移,图1是一个加锁转移的应用实例。在图1中,假如一个新的事务Tm请求页面P3和P7。首先查找当前页链表,发现P3正在被另一事务Ta占用,那么则需等待事务Ta执行完毕并提交,事务Ta将请求的页面转移到备份页链表上,Tm才能执行。而且如果当事务Tm执行完毕并提交,页面转移到备份页链表的同时,如果发现备份页链表或者可用页链表上存在相同ID(假设页面P3的ID为3)的页面时,说明该存在的页面属于过期页面,需要退出备份页链表或可用页链表的循环,避免该过期页面被再次调用。调整方法是将给过期页面从备份页链表或者可用页链表上转移到空闲页链表。
[0012] 另外,对于事务访问页面冲突的问题,即多事务同时要求访问相同的页面,目前主要有两种解决的算法,一个就是串行算法,将事务串行化,不用管理开销,事务请求来临后,挂载到一个FIFO(先进先出)的队列上等待执行即可。另一种是并行算法,需要登记事务与该事务所访问页面的对应关系,冲突处理采取回避的方式,只处理访问不同页面的事务,只有不同事务之间访问的页面无交集,才允许事务并行执行。当事务请求的页面与另一事务冲突时,该事务等待,直到前一事务提交。这两种算法的共同问题在于,事务的执行效率较低,有时会出现事务等待时间过长而过期。

发明内容

[0013] 有鉴于此,本发明的目的在于提供影子内存备份的方法及装置,用于减少页面冲突,提高事务的执行效率。
[0014] 为实现上述目的,本发明提供了一种影子内存的备份方法,包括以下步骤:
[0015] 当不同事务请求了相同的页面而发生冲突时,将发生冲突的所述事务在影子内存中合并,并将所述事务请求的所有页面加载到当前页链表,执行合并后的事务,执行事务完成后将所述合并后的事务提交。
[0016] 本发明还提供了一种影子内存的备份装置,包括:
[0017] 冲突判定模块,用于判定不同事务请求了相同的页面而发生冲突;
[0018] 合并模块,用于将所述发生冲突的事务在影子内存中合并;
[0019] 加载模块,用于将所述事务请求的所有页面加载到当前页链表;
[0020] 事务执行模块,用于执行合并后的事务;
[0021] 提交模块,用于将执行完成的所述合并后的事务提交。
[0022] 本发明通过将访问页面发生冲突的事务合并为一个事务,节省了事务请求页面时发生冲突而等待的时间,保证了实时事务不会因为等待执行而过期;并且减少了加锁转移导致的页面在链表上循环次数,提高了系统的吞吐率。

附图说明

[0023] 图1为现有技术中一个加锁转移的应用实例的示意图;
[0024] 图2为本发明的实施例中影子内存备份页面发生访问页面冲突时的流程图;
[0025] 图3为本发明的实施例中对事务进行提交处理的流程图;
[0026] 图4为本发明的实施例中避免出现加锁转移的示意图;
[0027] 图5为本发明的实施例中一种影子内存的备份装置的结构图。

具体实施方式

[0028] 本发明的实施例通过将访问页面发生冲突的事务合并为一个事务,节省了事务请求页面时发生冲突而等待的时间,保证了实时事务不会因为等待执行而过期;并且减少了加锁转移导致的页面在链表上循环次数,提高了系统的吞吐率。
[0029] 为使本发明的目的、技术方案和优点更加清楚,下面结合附图对本发明作进一步的详细描述。
[0030] 在本发明实施例中,影子内存备份页面发生访问页面冲突时执行的流程如图2所示:
[0031] 步骤101、当一事务开始执行,向内存请求页面,此时,在日志管理器中写入一个节点。日志管理器保存在影子内存中,在优选实施例中大小为1M。在日志管理器中保存的是针对事务的操作,每个事务在其中都对应有一个节点,该节点包括对该事务的操作,事务开始执行时建立该事务对应的节点,一旦对该事务进行了操作,则更新节点,增加相关的操作信息。
[0032] 步骤102、在当前页链表中查找所请求的页面,如果有,则执行步骤103;否则执行步骤104。
[0033] 步骤103、判断执行该页面的事务是否适合合并,如果是,则执行步骤104;否则执行步骤102,直到请求页面的事务适合合并。如果该事务与其它事务发生请求页面冲突,必然会在当前页链表中发现冲突的页面,表明该页面正被其它事务执行操作。但并不一定该事务请求的所有页面都会与其它事务冲突,在合并操作前,还需将其它不冲突的页面找到并放入当前页链表。查找其它页面的操作包括先到可用页链表中加载,如果可用页链表中没有则需到内存中去拷贝相应页面。
[0034] 步骤104、循环查找可用页链表,在可用页链表中查找所述事务请求的页面,如果找到,则把该页面加载到当前页链表中,并在日志管理器中更新相应节点;否则在内存中查找该页,将该页面拷贝到空闲页链表中,并加载到当前页链表。
[0035] 此外,还存在一种较为极端的情况,就是在页面不够时,需要在内存中查找该页,将该页拷贝到一个暂时没有使用的可用页上,并加载到当前页链表。该情况因为较少出现,在图1中并未示出。
[0036] 步骤105、将该事务与发生冲突的事务进行合并执行。在执行合并时,将发生冲突事务的节点合并,生成一个新的合并节点,从而构造了一棵倒置的二叉树,该二叉树称为合并树,叶子节点是被合并的事务,根节点是合并后的新的合并节点,被合并事务所请求的页面都并入新的合并节点。合并树的结构会在随后的实施例中解释。
[0037] 步骤106、事务请求页面成功,修改该页标志位为1,执行事务。该事务是新的合并后的事务,该事务对请求的页面进行操作时,页面的标志位应修改为1,表示该页面正被修改,对于标志位为1的页面所属事务是不能执行合并操作的。
[0038] 步骤107、完成在页面上的操作后,再次修改该页面的标志位为0,完成对所有请求的页面的操作,直到事务完成。
[0039] 步骤108、事务完成后,在合并树中找到该事务的最底层节点,即合并的节点,修改事务完成标记。
[0040] 步骤109、进行事务提交处理。
[0041] 事实上,并非发生冲突的事务都可以立即执行合并,在步骤103中,判断执行该页面的事务是否适合合并,有以下几个原则:
[0042] 1、如果请求冲突的页面标志位为1,表明该事务正在被修改,此时是不允许其它事务对该页面进行任何操作的。
[0043] 2、在步骤103中,找到发生请求冲突的页面所指向的事务后,在日志管理器中查找,如果找到该事务的合并树,计算该树的合并深度,如果该深度大于等于3,则合并非法。这是因为,对某事务的合并是不能无限的进行下去的,例如两个请求冲突页面的事务合并了,合并后又出现了新的请求冲突页面的事务,于是再次合并,一种极端的情况是,总是在合并进行时出现新的请求冲突页面的事务,如果不加以限制,而是任其合并下去,就会导致合并次数太多,最初的合并前的事务等待时间过久,严重影响系统的执行效率。因此,有必要对合并的次数,即合并深度加以限制,在本实施例中是3,即对同一事务不能执行3次以上的合并。在具体应用中,该深度可以根据应用场景自主设定。
[0044] 3、如果该合并事务的所有标志位为1,表示该事务正在提交阶段,此时合并为非法。这种做法同样是为了提高事务的执行效率,避免事务在提交时又不断进行合并而影响该事务的完成。
[0045] 在以上这三种情况下,可以认为合并操作是非法的。
[0046] 最后,在步骤109中,对事务进行提交处理的流程如图3所示,包括以下步骤:
[0047] 步骤1091、事务完成后,扫描该事务所属的合并树,如果属于该合并树的所有事务都完成,则利用合并树中记录的事务的ID,返回日志管理器中,将该事务操作所有涉及的页面拷贝至内存。
[0048] 步骤1092、把该事务在当前页链表中对应的页挂载到备份页链表上,等待后台的线程完成备份。
[0049] 步骤1093、删除日志管理器中的对应节点,然后删除日志管理器中对应的合并树。
[0050] 通过以上流程,能够将访问页面发生冲突的事务合并成一件事务,对其整体对待,节省了事务的请求时等待执行的时间,保证了大部分实时事务不会因为等待执行而过期。
[0051] 事务合并的方法,使得事务冲突减少,减少事务访问的页面同时出现在一个链表的概率,这样便减少了一个链表因为不能同时存在相同ID的页面而必须进行加锁转移的次数,缓解了系统备份锁的压力,所有事务均通过该备份锁执行,具有很大实际意义。
[0052] 需要说明的是,在本实施例中,日志管理器采用的是倒置的二叉树,也就是一次只合并两个事务。在实际应用中,并非仅限于两个,一次也可以合并多个发生冲突的事务,执行流程同上。
[0053] 下面列举一个应用的实例,来具体阐述本发明实施例的影子内存备份页面的方法。
[0054] 如图4所示,应用本发明实施例的影子内存备份页面的方法,能够避免加锁转移的发生。假设依然是事务Tm访问页面,其中P3处于当前页链表中,表明事务Tm与当前调用P3的事务Ta冲突时,直接将Ta与Tm合并成事务Tam,在日志管理器中将之前写入的节点A和M合并为一个新的节点AM,形成一棵合并树,合并树结构如图5所示。把Tm需要另外访问的页面P7页调入当前页链表上,当事务Tam都执行完毕并提交后,将页面P3和P7转移到备份页链表上,后台线程备份完成后,又将所有页面转移到可用页链表上。
[0055] 在此流程中,避免了事务Tm的冲突等待,请求的页面在链表上只循环一次,并且减少了事务Tm的等待时间。流程改进的代价就是事务Ta完成后需要延迟提交。如果在一定程度上允许事务延迟提交,或者单方面追求吞吐量,那么改进的优势是明显的。
[0056] 图5本发明实施例中一种影子内存的备份装置的结构图,包括:
[0057] 冲突判定模块51,用于判定不同事务请求了相同的页面而发生冲突;
[0058] 合并模块52,用于将所述发生冲突的事务在影子内存中合并;
[0059] 加载模块53,用于将所述事务请求的所有页面加载到当前页链表;
[0060] 事务执行模块54,用于执行合并后的事务;
[0061] 提交模块55,用于将执行完成的所述合并后的事务提交。
[0062] 较佳的,该装置进一步可以包括:
[0063] 日志管理器56,用于维护对事务的管理,在所述日志管理器中,任何事务都存在与其对应的节点。
[0064] 通过以上装置,能够将访问页面发生冲突的事务合并成一件事务,对其整体对待,节省了事务的请求时等待执行的时间,保证了大部分实时事务不会因为等待执行而过期。
[0065] 该装置实现事务合并,使得事务冲突减少,减少事务访问的页面同时出现在一个链表的概率,这样便减少了一个链表因为不能同时存在相同ID的页面而必须进行加锁转移的次数,缓解了系统备份锁的压力,所有事务均通过该备份锁执行,具有很大实际意义。
[0066] 总之,以上所述仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。