公开/公告号CN101676906A
专利类型发明专利
公开/公告日2010-03-24
原文格式PDF
申请/专利权人 中兴通讯股份有限公司;
申请/专利号CN200810216191.X
申请日2008-09-18
分类号G06F17/30(20060101);G06F12/02(20060101);
代理机构
代理人
地址 518057 广东省深圳市南山区高新技术产业园科技南路中兴通讯大厦法务部
入库时间 2023-12-17 23:44:22
法律状态公告日
法律状态信息
法律状态
2016-01-20
专利权的转移 IPC(主分类):G06F17/30 登记生效日:20151231 变更前: 变更后: 申请日:20080918
专利申请权、专利权的转移
2013-06-05
授权
授权
2011-09-07
实质审查的生效 IPC(主分类):G06F17/30 申请日:20080918
实质审查的生效
2010-03-24
公开
公开
技术领域
本发明涉及内存数据库系统的管理方法,尤其涉及一种利用位图对内存数据库空间进行高效管理的方法。
背景技术
传统的数据库管理系统把所有数据都放在磁盘上进行管理,所以称做磁盘数据库。磁盘数据库需要频繁地访问磁盘来进行数据的操作,由于对磁盘读写数据的操作一方面要进行磁头的机械移动,另一方面受到系统调用时间的影响,当数据量很大,操作频繁且复杂时,就会暴露出很多问题。
近年来,内存容量不断提高,价格不断下跌,计算机进入了64位时代后,操作系统已经可以支持更大的地址空间,同时业界对数据库系统实时响应能力要求日益提高,充分利用内存技术提升数据库性能成为数据库领域一个重要的发展方向。
在数据库技术中,目前主要有两种方法来使用大量的内存。一种是在传统的数据库中,增大缓冲池,将一个事务所涉及的数据都放在缓冲池中,组织成相应的数据结构来进行查询和更新处理,也就是常说的共享内存技术,这种方法优化的主要目标是最小化磁盘访问。另一种就是内存数据库技术,就是重新设计一种新的数据库管理系统,对查询处理、并发控制与恢复的算法和数据结构进行重新设计,以更有效地使用CPU和内存,这种技术把整个数据库放进内存中,因而会产生一些根本性的变化。
内存数据库系统带来的优越性能不仅仅在于对内存读写比对磁盘读写快上,更重要的是,从根本上抛弃了磁盘数据管理的许多传统方式,基于全部数据都在内存中管理进行了新的体系结构的设计,并且在数据缓存、索引算法、并行操作方面也进行了相应的改进,从而使数据处理速度比传统数据库的数据处理速度快若干数量级。
通过以上介绍可以了解到,内存数据库完全工作于内存中,如何充分而高效地管理庞大的内存空间就成为内存数据库设计中一个极其重要的问题。
在一个性能良好的数据库系统中,内存一定是分页(即page;有些系统称之为块,block)使用的,页的大小可以是4k,8k,16k,32k……等等。使用分页管理的好处是可以取得一个比较适中的度量单位,在兼顾灵活性和易管理性的前提下同时满足极少量或者海量的内存需求,既不浪费空间又不增加管理上的负担。
传统的页管理模式是完全基于链表的,按照页的当前状态(空闲、已占用等)划分成若干链表。类似地,在页内按照记录的不同状态也划分成若干链表。页和记录的分配与回收都依靠链表操作。
这种完全依赖于链表的管理方式有很大的缺陷:
1、链表本身的性质决定了对链表的读写操作都需要加锁,多个线程不能同时读写链表,这将导致线程等待。在多任务数据库系统中,链表锁的争用将成为系统的重要瓶颈。并且管理的空间越大,链表就越长,争用越严重,整体空间管理效率就越低。
2、大量的链表结构耗费了很大内存空间,降低了内存空间的利用率,并且空间越大,浪费越多。
3、对大量链表进行管理的逻辑非常复杂,大大降低了整个系统的可靠性与可维护性。
因而,现有技术还有待于改进和提高。
发明内容
本发明的目的在于解决以上全链表式管理中存在的问题,提出一种新的对内存数据库空间进行管理的方法,实现控制数据页和记录的分配和回收。
本发明的技术方案包括:
一种利用位图对内存数据库空间进行管理的方法,其中,包括在系统内存区内的以下操作步骤:
A、建立一级位图区;
B、建立一级位图区辅助链表;
C、建立二级位图区;
D、分配数据页;
E、分配记录;
F、释放记录;
G、释放数据页。
所述的方法,其中,所述的步骤A包括:
按照系统需要管理的总内存区大小开辟所述一级位图区并全部初始化为未分配状态。
所述的方法,其中,所述步骤A还包括以下步骤:
A1、在数据库系统配置中设定将使用m MB的内存,其中,m为正整数;并由主机支持分配此容量的内存;同时设定每页的大小为p KB,其中,p为正整数;
A2、数据库系统启动后通过开辟共享内存分配出m MB内存;假设该内存段首地址为g,其中,g为自然数;
A3、计算所需要的一级位图区大小为b1=(m*1024)/(p*8)字节;
A4、在总内存段的开头保留b1字节的空间,作为一级位图区,对位图区初始化为全0。
所述的方法,其中,所述的步骤B包括:
建立所述一级位图辅助链表并初始化,将所述一级位图区中所有空闲bit域都记录进来。
所述的方法,其中,所述的步骤C包括:
C1、根据数据页偏移地址对该页进行初始化,记录页头控制信息,并按照该页需要存放的记录的长度等信息估算所需要的二级位图区长度;
C2、初始化该页的二级位图区,将所有bit域标记为未使用。
所述的方法,其中,所述的步骤D包括以下步骤:
D1、访问所述一级位图辅助链表的首节点,从中获取第一个空闲的bit域,并标记为已分配;
D2、检测步骤D1中找到的bit域所在的辅助链表的节点,如果该节点对应的所有bit域都为已分配状态,则将该节点移出链表;
D3、根据步骤D1中找到的空闲bit域的位置,计算出相应数据页在整个数据区中的位置偏移地址。
所述的方法,其中,所述的步骤D1包括以下步骤:
D11、上层业务发来请求,申请数据页,并指明该页中每条记录长度≤r字节;其中,r为正整数;
D12:定位到辅助链表首节点,若发现链表为空,则向调用者返回无空闲数据页错误,否则转下一步骤;
D13:搜索首节点的第一个空闲bit,搜索到则设该bit为1,表示已占用;假设该bit是g开始的第n个bit,n为从1开始的计数自然数;检查此节点对应的一级位图区是否已经为全1,是则从链表摘除此节点。
所述的方法,其中,所述的步骤D3包括以下步骤:
D31:在数据区中定位到第n个bit对应的数据页首地址h,h=g+b1字节偏移+(n-1)*p字节偏移;
D32:对h偏移处的页进行页头初始化,记录必要管理信息;并计算二级位图区长度b2;假设页头的长度为q字节,则b2=(p*1024-q)/(r*8)字节;其中,q为正整数;
D33:定位到h+q字节偏移处,对此后b2字节的区域初始化为全0;
D34:向调用者返回成功结果和页偏移n。
所述的方法,其中,所述步骤E包括:
E1、定位到需要分配记录的数据页内二级位图区,使用一定的算法搜索到该位图区第一个空闲的bit域,将该bit域状态修改为已分配;
E2、通过一定的算法定位到步骤E1分配的bit域所对应的记录地址,对该记录进行初始化。
所述的方法,其中,所述步骤E1包括:
E11、上层业务发来请求,要求在第n个数据页中申请一条记录空间;
E12、按照D31和D32步骤的算法定位到该数据页的二级位图区首地址;寻找此区域第一个可用的bit,若找到即设定为1,表示已分配,并返回成功;若没找到转到下一步骤;
E13、向调用者返回本页无剩余空间的错误信息。
所述的方法,其中,所述步骤F包括:
定位到该记录所在的数据页内二级位图区,搜索到该记录对应的bit域,将该bit域状态修改为空闲。
所述的方法,其中,所述步骤F还包括如下步骤:
F1、上层业务发来请求,要求释放第m个数据页中的第n条记录空间;其中,m为自然数;
F2、定位到该数据页的二级位图区首地址,定位到第n个bit,并设定为0,表示已回收,并返回成功;若没找到转到下一步骤;
F3、向调用者返回页号或者记录号非法的错误信息。
所述的方法,其中,所述步骤G包括:
G1、根据待释放页的偏移地址,通过一定算法定位到该页在一级位图区中的对应bit域,将该域设置为空闲;
G2、检查bit域所在的一级位图辅助链表节点,如果该节点不在链表中,则加入链表。
所述的方法,其中,所述步骤G1包括以下步骤:
G11、上层业务发来请求,要求释放第m个数据页;其中,m为自然数;
G12、从一级位图首地址g开始计算其中,g为自然数,定位到第m个bit处,若未找到,则向调用者返回页号非法的错误信息;否则将此bit设定为0,表示已回收。
本发明所提供的一种利用位图对内存数据库空间进行管理的方法,由于利用二级位图结构,同时结合一个辅助链表来控制数据页和记录的分配和回收的管理方法,克服了全链表结构管理的结构复杂,链表锁瓶颈、内存空间利用率低等问题;提高了多任务性能,运行速度快,内存空间利用率高,管理内存量大,采用位运算效率高,性能恒定,并使数据库具备良好的扩展性。
附图说明
图1为本发明一级位图及其辅助链表结构示意图;
图2为本发明二级位图结构示意图;
图3为本发明初始化和数据页分配流程示意图;
图4为本发明记录区分配流程示意图;
图5为本发明记录区回收流程示意图;
图6为本发明数据页回收流程示意图。
具体实施方式
以下结合附图介绍本发明的若干实施例。
本发明提出的一种利用二级位图结构对内存数据库空间进行管理的方法,利用二级位图结构,结合一个辅助链表来实现控制数据页和记录的分配和回收。
首先,划定一块特定的位图区域来控制所有数据页的使用,该位图区为每个数据页保留若干bit,用于记录此页的状态。数据页的分配和回收只需要修改相应bit位的值即可。这样的位图区称之为“一级位图”,详见图1。
然后,在每一个数据页中划定一块特定的位图区域来控制该页所有记录的使用,该位图区为每条记录保留若干bit,用于保存该记录的状态。一条记录的分配和回收只需要修改相应bit位的值即可。这样的位图区称之为“二级位图”,详见图2。
为一级位图区建立一个辅助链表,链表的每一个节点对应于一级位图区的若干bit,如果这若干bit都已经被占用,则将相应节点移出链表,否则就加入链表。当需要在一级位图区中分配空闲bit时,只要访问该链表的第一个节点即可。体现了“空间换时间”的概念,详见图1。
本方法具体步骤如下:
1、系统初始化
(a)按照系统需要管理的总内存区大小开辟一级位图区并全部初始化为“未分配”状态;
(b)建立一级位图辅助链表并初始化,将一级位图区中所有空闲bit域都记录进来。
2、分配数据页
(c)访问一级位图辅助链表的首节点,通过一定的算法从中获取第一个空闲的bit域,并标记为“已分配”。
(d)检测(c)中找到的bit域所在的辅助链表的节点,如果该节点对应的所有bit域都为“已分配”状态,则将该节点移出链表。
(e)根据(c)中找到的空闲bit域的位置,通过一定的算法计算出相应数据页在整个数据区中的位置偏移地址。
(f)根据(e)中得到的数据页偏移地址对该页进行初始化,记录页头控制信息,并按照该页需要存放的记录的长度等信息估算所需要的二级位图区长度。
(g)初始化该页的二级位图区,将所有bit域标记为“未使用”
3、分配记录
(h)定位到需要分配记录的数据页内二级位图区,使用一定的算法搜索到该位图区第一个空闲的bit域,将该bit域状态修改为“已分配”
(i)通过一定的算法定位到(h)步骤分配的bit域所对应的记录地址,对该记录进行初始化。
4、释放记录
(j)定位到该记录所在的数据页内二级位图区,使用一定的算法搜索到该记录对应的bit域,将该bit域状态修改为“空闲”
5、释放数据页
(k)根据待释放页的偏移地址,通过一定算法定位到该页在一级位图区中的对应bit域,将该域设置为“空闲”
(l)检查bit域所在的一级位图辅助链表节点,如果该节点不在链表中,则加入链表。
请注意:以上(a)到(l)步骤并非一定是连续地顺序地执行,而应当按照实际情况的需要执行。
这样,通过对以上两种位图区以及一个链表的组合操作,就实现了对所有数据页以及页内记录区的高速分配和回收。
实施例1,如图3所示,在一个典型的应用场景中,初始化并分配一个数据页的完整过程包括以下步骤:
步骤A1:数据库系统配置中设定了将使用m MB的内存,其中,m为正整数;并且主机支持分配此容量的内存。同时设定每页的大小为p KB;其中,p为正整数。
步骤B1:数据库系统启动后通过开辟共享内存或者类似方式分配出mMB内存。假设该内存段首地址为g,其中,g为自然数。
步骤C1:计算所需要的一级位图区大小b1=(m*1024)/(p*8),单位字节。
步骤D1:在总内存段的开头保留b1字节的空间,作为一级位图区,对位图区初始化为全0。
步骤E1:为一级位图辅助链表分配空间,链表含有b1个节点,头尾相连初始化。
步骤F1:上层业务发来请求,申请数据页,并指明该页中每条记录长度≤r字节。其中,r为正整数。
步骤G1:定位到辅助链表首节点,若发现链表为空,则向调用者返回“无空闲数据页”错误,否则转H1步骤。
步骤H1:搜索首节点的第一个空闲bit,搜索到则设该bit为1,表示已占用。假设该bit是g开始的第n个bit,n是从1开始的计数自然数。检查此节点对应的一级位图区是否已经为全1,是则从链表摘除此节点。
步骤I1:在数据区中定位到第n个bit对应的数据页首地址h,h=g+b1字节偏移+(n-1)*p字节偏移。
步骤J1:对h偏移处的页进行页头初始化,记录必要管理信息。并计算二级位图区长度b2,单位byte。假设页头的长度为q字节,则b2=(p*1024-q)/(r*8),其中,q为正整数。
步骤K1:定位到h+q字节偏移处,对此后b2字节的区域初始化为全0。
步骤L1:向调用者返回成功结果和页偏移n。
实施例2,如图4所示,在一个典型的应用场景中,申请一条记录空间的完整过程包括以下步骤:
步骤A2:上层业务发来请求,要求在第n个数据页中申请一条记录空间。
步骤B2:按照I1和J1步骤的算法定位到该数据页的二级位图区首地址,按照一定算法寻找此区域第一个可用的bit,若找到即设定为1,表示已分配,并返回成功;若没找到转到C2步骤。
步骤C2:向调用者返回“本页无剩余空间”的错误信息
实施例3,如图5所示,在一个典型的应用场景中,释放一条记录空间的完整过程包括以下步骤:
步骤A3:上层业务发来请求,要求释放第m个数据页中的第n条记录空间。其中,m、n为自然数。
步骤B3:按照I1和J1步骤的算法定位到该数据页的二级位图区首地址,定位到第n个bit,并设定为0,表示已回收,并返回成功;若没找到转到C3步骤。
步骤C3:向调用者返回“页号或者记录号非法”的错误信息。
实施例4,如图6所示,在一个典型的应用场景中,释放一个数据页的完整过程包括以下步骤:
步骤A4:上层业务发来请求,要求释放第m个数据页。其中,m为自然数。
步骤B4:从一级位图首地址g开始计算,其中,g为自然数,定位到第m个bit处,若未找到,则向调用者返回“页号非法”的错误信息;否则将此bit设定为0,表示已回收。
步骤C4:检查第m个bit所在的一级位图辅助链表节点,如果该节点不在链表中,则加入链表。
以上附图及实施例详细介绍了本发明利用二级位图结构对内存数据库空间进行管理的方法,说明了利用二级位图结构,结合一个辅助链表来控制数据页和记录的分配和回收的过程和步骤。
本发明利用二级位图结构,同时结合一个辅助链表来控制数据页和记录的分配和回收的管理方法,其重要特点在于:
1、位图区是一块物理存在的区域,该区域各部分之间没有关联,多个byte可以同时被修改,因此该机制能够很好地支持多线程并发操作,任一时刻均可以有多个数据页和记录区被并发地分配和释放,这样就彻底避免了全链表架构中同时只能有一个线程操作的问题,极大地提高了多任务性能,这一点对于以超高性能为主要目标的内存型数据库来说是至关重要的。
2、位图机制可以用若干bit控制一个页或者一条记录,因此管理部分所耗费的内存空间极小,几乎可以忽略不计。在一个典型的应用场景中,管理20GB总内存仅需耗费12.66MB空间,即真正用于存储数据的空间占总空间的99.938%以上,内存空间利用率极高。
3、本方法可以管理的内存空间仅仅受制于主机的内存大小,主机支持多大的内存,本方法就可以管理多大内存,而且用于控制部分的内存占总内存的比例随着总内存的增大而降低。
4、位运算对于任何架构的cpu来说都是极高效的运算,而位图管理方式主要依靠位运算,只有极少量的链表操作,因此位图管理方式的效率是远远超过全链表方式的。
5、本方法使用了两级位图,将数据页和页中记录同时纳入位图管理,在页面层和记录层同时避免了性能瓶颈。
6、本方法的性能是恒定的,不管管理的空间有多大,分配和回收一个页或者记录的运算次数是固定的。这意味着数据库将具备良好的扩展性。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改,等同替换,改进等,均应包含在本发明的保护范围之内。本发明的专利保护范围应以所附权利要求为准。
机译: 利用至少一种存储空间共享方案来管理视频播放操作所利用的存储空间的方法及其相关视频播放装置
机译: 一种用于利用havi架构和具有可见窗口的剪切区域在分布式ieee 1394网络上对屏幕上显示的图形数据进行位图动画的方法和装置
机译: 用于同步从具有个人虚拟空间的用户终端生成的信息的系统和方法,特别是用于通过使用短消息服务和多媒体消息服务实时向每个用户传输各种信息到Web的已分配空间并对其进行管理,和通过无线互联网和网络利用信息