背景技术
许多计算机需要动态地分配存储器。操作系统使用动态存储分配为执行程序而分配存储器。动态存储分配的另一个例子可以包括用于存储网络数据的网络服务器。在很多情况下,在发出请求之前,所请求的存储尺寸是不知道的。动态分配的存储块的生命周期也是不知道的。
已经花费了相当多的精力来开发主存储器的有效动态存储分配算法。但对盘上的有效动态存储分配算法的开发所花费精力却少得多。
有多种理由说明盘上的有效动态存储分配的重要性。在很多情况下,主要的是具有能在时间上持久的即使在关机后也持久的数据。盘存储器提供持久存储。盘存储器也提供容错存储;当系统垮台以致主存储器内容丢失之后,经常仍能保持存于盘上的信息。盘存储器的另一个优点是有可能以比主存储器更合理的价格提供更多的盘存储器。因此它可用于存储主存储器内存放不下的信息。
参照图1,最初适配系统分配找到的第一块足够大的能满足存储请求的存储块(的全部或一部分)。对于“7”的存储请求,最初适配返回B1,因为这是遇到的能够满足请求的第一块。最佳适配系统分配足够大以能满足存储请求的最小存储块(的全部或一部分)。图1中,由于“7”在块B3(它的容量为8)中适配得最佳,因此返回B3。
参照图2,在二进制伙伴系统中,块尺寸为2的幂(例如4和4,8和8等)。许多动态存储分配器(DSA)保持一个或多个空块表。这类表称为空表,例如空块表。不同尺寸的块有不同的空表。也存在用于分配其他尺寸的块的伙伴系统。在1996年10月在Proceedings of IEEE Frontiers′96上刊登的Arun Iyengar所著的名为“动态存储分配算法的可改变规模性”的文章以及本说明书所附参考文献中都很好地回顾了动态存储分配的现有技术。
动态存储分配器(DSA)能够使用不同方法来汇并邻近空块。一个方案是使用立即汇并,其中在释放块时立即将该释放块与邻近空块汇并,如图3所示。在图3中,在每块中都标明块尺寸。正的尺寸值标明空块,而负的尺寸值标明分配块。
参照图4,另一个方案包括延迟汇并。当使用延迟汇并时,在释放后邻近的空块并不自动地合并。相反,到一定时候(例如当无法分配一个足够大能满足请求的块时),DSA将扫描存储设备中的各块以及如图4中所示地将邻近块合并。
存储碎块是DSA浪费的存储区。内部存储碎块是当使用大于所请求尺寸的空块来满足请求时(例如使用尺寸为32的块来满足对尺寸为25的块的请求时)损失的存储区。当空块与分配块交织时出现外部存储碎块。在这种情况下,即使有大于b字节的空间也无法满足对b字节的分配请求,因为最大的连续空块小于b字节。
以上引用的“动态存储分配算法的可改变规模性”文章中所描述的多空表适配I(MFLF I)使用多个按照尺寸组织的空表。小块的空表称为快表。大块的空表称为杂项表。当保持单个杂项表时,MFLF I退化为称为快适配的存储分配系统。
参照图5,其中显示快适配技术。在此系统中,尺寸为16以下的块放在快表中;可以改变快表数量以便针对不同请求分布将性能优化。在此例中,当2≤s≤16(2是最小块尺寸)时,通过检查尺寸为s的快表来分配尺寸为s的块。如此表不空,则表中第一块可用于满足请求。注意到可能有对应于单元尺寸的倍数的块尺寸的快表。例如,在图2中,单元尺寸是1。如果单元尺寸是1000,则可以使用块尺寸为1000、2000、3000、…、16000的快表(总共有16个快表)。MFLF I使用延迟汇并。存储区分为工作存储区12和尾区14,如图5中所示。工作存储区12包括分配块和空表中的块。尾区14包括存储区一端的未分配存储区中的连续块。最初,在分配任何块之前,尾区包括所有可分配存储区,及空表是空的。空表包括快表和杂项表,其中杂项表用于较大存储块。块13包括一个尺寸(由块13中的数目所标示)。当检查一个或多个空表后发现无法满足请求时,可从尾区14中分配从而满足请求。尾区指针(tail ptr.)标示尾区14的始端。当释放已分配块时即将它填放入空表。
为满足对于快表无法满足的过大块的请求,快适配对杂项表进行最初适配搜索。搜索大块可能需要多条指令。为减少此开销,MFLF I可以使用多个杂项表而不是如快适配中那样只用一个表,如图6中所示。在图6中,尺寸为17-25的块13有一个杂项表,尺寸为26-40的块13有另一个杂项表,而尺寸为41-60的块则还有一个杂项表。可用不同准则来满足请求,包括图7A和7B中所示的一个准则来使用MFLF I分配“84”。当分配84的请求得到满足时,图7A显示存储区的“以前”简况,而图7B显示“以后”简况。在图7A和7B中,系统将表L2中的第一块进行分配以便满足请求,它划分尺寸为“90”的块并且将多余的尺寸“6”送回至空表。系统检查L2而不是L1,因为L2所允许的最小块的尺寸为89。因此,不需要在L2的第一块之外再进行搜索来满足对其尺寸小于或等于89的请求。
虽然以上所述技术对于许多应用场合已经够用,但直接将主存储器的动态存储分配算法使用于盘系统中时往往会导致不良性能,因为访问盘和写盘的等待时间比主存储器大得多。
因此,需要盘存储器的动态存储分配方法,用于减少访问盘或写盘的次数。还需要存储分配和释放方法,用于提供更有效的存储和更快的访问时间。
附图说明
通过结合附图阅读以下本发明的阐述性实施例的详细说明,将能清楚地了解本发明的这些和其他目的、特征和优点。
下面将参照附图在优选实施例的说明中详细地描述本发明,附图中:
图1是用于阐述性地显示最初适配分配和最佳适配分配的原理图;
图2是用于阐述性地显示根据现有技术的二进制伙伴系统的原理图;
图3是用于阐述性地显示存储块的立即汇并的原理图;
图4是用于阐述性地显示存储块的延迟汇并的原理图;
图5是用于显示根据现有技术的多个空表适配的特殊情况的快适配的例子的原理图;
图6是用于显示根据现有技术的多个空表适配(MFLF I)的例子的原理图;
图7A和7B阐述根据现有技术的使用MFLF I分配大块的例子的“以前”和“以后”简况;
图8是用于显示根据本发明的多个空表适配分配(MFLF III)的框图/流程图;
图9是用于显示根据本发明的分配大块的多个空表适配(MFLF III)分配的框图/流程图;
图10是用于显示根据本发明将邻近空块汇并的框图/流程图;
图11是用于显示根据本发明使用存储管理方法I的分配的框图/流程图;
图12是用于显示根据本发明使用存储管理方法I的释放的框图/流程图;
图13是用于阐述根据本发明的存储管理方法II的框图/流程图;
图14是根据本发明的存储管理方法II的阐述性例子;
图15是用于阐述根据本发明使用存储管理方法III的框图/流程图;
图16是根据本发明的存储管理方法III的阐述性例子;
图17是用于阐述根据本发明使用存储管理方法IV的框图/流程图;
图18是根据本发明的用于管理尾区分配和释放的框图/流程图;
图19是一个实施例的根据本发明的相对于根据现有技术的阐述性测试结果的图表;及
图20是一个实施例的根据本发明的相对于根据现有技术的阐述性测试结果的另一个图表。
具体实施方式
本发明涉及存储管理及分配的系统和方法。此处提出的这些系统和方法与现有技术比较能提供改进的性能,及本发明对盘存储器特别有用。现有技术中用于持久地在盘上存储信息的技术包括使用文件系统和数据库。
使用本发明,可以比使用现有技术少得多的开销将信息存于盘上。还有,使用本发明可以存储大量对象。许多文件系统受可以存于一个目录中的文件数所限制;而本发明对于所存对象的数量并无限制。
在一个实施例中,提供一种方法,它设计用于使块的划分减至最少而不会显著地浪费多余存储空间。本发明的使用可以延伸至盘分配和主存储器分配两者。
本发明提供一种新的和有用的动态存储分配方法,它类似于MFLFI,但包括可用于显著地改进存储管理和盘性能的修改。一项修改包括减少块的划分数量。当例如盘分配中不希望划分块时,减少块划分数量就显得重要。
应该理解,图8-19中所示元件可用硬件、软件或它们的组合的不同形式来实施。这些元件最好实施于一个或多个具有处理器和存储器和输入/输出接口的合适地编程的通用数字计算机中的存储设备上。
应该理解,在公开本发明时,熟悉技术的人能够如下所述地选配多个普通使用的存储分配算法来实施本发明。因此不应认为下面用于阐述本发明实施例是对本发明施加任何限制。本发明中采用的内存或主存储器系指易失性存储器,例如随机存取存储器或高速缓存,当然也可采用其他类型的存储器。盘或盘存储器系指持久性存储器,它可包括硬盘、软盘、光盘、DVD、盘阵列或其他持久性存储设备。
如上所述,MFLF I在分配期间有时将空块划分以便分配一部分块及退回另一部分至空存储区。与MFLF I比较,本发明能够有利地减少划分的块数。这是分配盘存储器的一项重要参数,因为划分块能够造成盘的额外操作(其中操作是读或写)。本发明因此在分配时比MFLFI划分得少。本发明可用于分配主存储器以及盘存储器。
现参照附图,其中相同数字表示相同或类似元件,先参照图8和9,这些是用于显示盘的分配和存储管理的系统/方法的框图。表(例如快表、杂项表或空表)通常具有最小(min)和最大(max)尺寸,它们表示可在表中存储的最小和最大块(对于其单元尺寸为1的快表而言,其min和max尺寸可以相等)。在具有最大块尺寸的系统中,最后的杂项表的max尺寸可以是最大块尺寸。在没有最大块尺寸的系统中,最后的杂项表不能有最大尺寸。
设s为所请求尺寸。在框807内判断s是否大于用于存储最大块的表的min尺寸。如果是,则处理过程进至图9的框905。如果不是,则处理过程进至框805。在框805中,系统选择一个合适的表来检查。选择其最小min尺寸为1min(其中1min≥s)的表L.在选择表时也可使用其他准则。处理过程进至框810。在框810中,判断表L是否为空。如果是,则从尾区中分配一块尺寸为1min的块并且用它来满足框815中的请求。如果表L不空,则在框820中用表L中的第一块满足请求而不划分任何存储块。当表L包括不同尺寸的块时,对于熟悉技术的人而言,直截了当的反应是对表L作某些搜索,以便得到更好的适配块和/或划分所选块以便分配从而减少内部碎块。
参照图9,显示一种根据本发明的用于分配大块的策略。设L为用于存储大块的杂项表。在框905中,检查L来分配第一块其尺寸≥s但≤s+a(阈值)的块(例如acceptable_waste)。acceptable_waste是一个参数,它在某些分配的情况下用于划分块以便减少内部碎块。如果找到一块合适块,则在框910中分配该块而不必划分。如果找不到这种块,则有两种可能性。如果在L上没有能够满足请求的足够大的块,则在框930中从尾区中分配尺寸为s的块。如果L包括足够大的块,则在L上的其尺寸大于s的最小块划分为其尺寸分别为s和r的碎块f1和f2(框935)。
f1用于满足请求。f2被放置于对应于它自己尺寸的空表的开始处。acceptable_waste参数可以动态地变动。一个直截了当的变动方案是使用函数来替代acceptable_waste参数,该函数可以接受例如请求尺寸作为参量。
根据本发明的释放是直截了当的。各释放块放置于对应于它们尺寸的空表的开始处。在一个实施例中采用延迟汇并。当将本发明用于主存储器分配时,汇并是直截了当的。
本发明包括能完成用于管理盘存储器的动态存储分配器(DSA)的延迟汇并的新颍方法,它可以与许多不同方法一起使用,包括但不限于最初适配、最佳适配、伙伴系统、MFLF系统等。
存储块包括首部。首部包括块尺寸以及用于标示块是空的还是已分配的标记。首部信息保持于盘上以便在系统垮台或关机时能够保存住。首部信息也可高速缓存于主存储器中以供快速存取之用。首部信息也可用不同方式保持于盘上。一个方法是将块的指定字节(例如初始字节)用于首部信息。另一个方法可以是在连续存储区的单块中存储多块的首部信息。
参照图10,其中显示一个用于将邻近空块汇并的优选方法。在框1005中将汇并所需数据结构初始化。例如,许多DSA利用空表。这些DSA使用框1005来将空表初始化(例如将一个或多个空表腾空)。框1010、1020和1025形成一个循环,其中系统扫描首部块及合并邻近空块。该系统从存储区一端处的块开始,读取对应于第一块的首部。系统接着顺序地扫描首部以及将邻近空块合并。对于利用空表的存储系统而言,在空块已经汇并之后,将它们加至合适的空表中。在框1025中,系统将汇并操作进入持久性存储设备中的地方记录下来,从而对汇并操作进行检查点操作。检查点操作的一个目的是减少系统故障时所需工作量。本发明采用检查点操作来更新过时信息。
在系统故障的情况下,很可能损失主存储器内容而可能保持盘存储器内容。在系统故障的情况下,检查点操作可以不再需要重新再做大部分或全部早已完成的汇并工作。相反,现有技术中的方法在故障后要求从头重新扫描首部。有利的是,通过提供对首部的顺序扫描和检查点操作,可以提供一个更为稳固和持久的存储系统。此外,可以减少或节省故障后重新汇并时浪费的时间,例如可以节省50%或更多的汇并时间,在很多情况下可以节省100%的汇并时间。可以合适地改变进行检查点操作的频度,例如可以根据事务数量来进行或者在预先设定的时间过去后进行检查点操作。频繁的检查点操作可以减少故障后需要重新进行的工作量。
在框1015中完成最后清除和整理操作。例如,如果工作存储区的尾端包括一个空块,则可以在此步中将该空块加至尾区中。
现在将要更详细地描述根据本发明的用于有效地分配和释放持久性存储器的方法。本发明可与不同DSA一起使用,它们包括但不限于MFLF系统、最初适配、最佳适配等。在第一阐述性存储管理方法(为简化起见,此后称为方法I)中,盘保持首部,它们包括块尺寸以及用于标示该块是空的还是已分配的标志。存储器中保持用于分配和释放的空表数据结构。
参照图11,其中显示根据本发明的存储管理方法I的分配操作。应该注意到,图11中所示各框可以按照任何顺序完成或执行。在框1105中使用存储器内数据结构来寻找合适空块。一旦找到该块,在框1110中通过修改合适的存储器内数据结构和将盘上的首部标志标为“已分配”而分配该块。如果不划分块,则分配操作只耗费单个盘操作周期。
参照图12,其中显示根据本发明的存储管理方法I的释放操作。修改合适的存储器内数据结构来释放块。此外,在框1205中将盘上的首部标志标为“已释放”。如果不进行汇并,则释放操作只耗费单个盘操作周期。当在故障或正常关机之后重新启动系统时,可以通过扫描存于盘上的首部来构造DSA所用存储器内数据结构(例如空表)。可以在需要时逐步地读取这类数据而不必一次全部读取,当然也可一次全部读取。
在一个实施例中,可以通过在盘存储器的一个或多个连续块中保持多个首部字而减少用于从盘上读取信息的时间。当连续块b1满时,可以将新块b2链接至b1以便包括附加首部。可以比很不连续的信息快得多地读取盘上存储区的连续块。例如,一个(或小量)块读取操作可用于读取数个连续首部。即使不使用块读取,从彼此紧靠的盘区中的多个读取也可能只需少量移动盘头。这能节省时间。
在能够在正常关机之后改进启动时间的另一个实施例中,就在关机之前由DSA将主存储器数据结构(例如空表)输出至盘存储器的一个或多个连续块中。在重新启动时,DSA从就在关机之前所写的存储块中读取数据结构。这可能比从首部获得信息要快得多。如上所述,这些实施例可用于以下所述的存储管理方法以及用于存储管理方法I。
参照图13,其中显示一个根据本发明的用于管理盘上持久存储区的阐述性存储管理方法。为简化起见,此方法今后称为方法II或存储管理方法II。应该注意到,图13中所示各框可以按照任何顺序完成或执行。该系统保持至少一个盘上块的表(它可能包括空块和已分配块中的一个或它们两者)(框1305)。可以在首部中保持表指针而保持该表。分配操作(框1310)采取的方式如图11中所示及在相伴文本中加以描述。然而方法II所保持的存储器内数据结构可能与方法I所用的不同(见例如图14)。释放操作(框1320)采取的方式如图12中所示及在相伴文本中加以描述。
可能需要建立新的存储块(框1315)。当在MFLF算法中从尾区中分配一块时可能会如此。在将一块划分后也可能如此。当建立新存储块b时,在框1315中将其盘首部初始化,这包括块的分配状态和块尺寸及指向表中下一块的指针。为使盘操作最少,可以将这些首部域保持于盘存储区的连续字节中。以此方式,可以有效地将首部更新,例如通过单个写块操作或多个写块操作但却很少移动盘头。b加至空表的表首。也可在主存储器中保持head_of_list指针;如果这样,则将它更新为指向b。为将盘操作减至最少,可以不在框1315中更新指向表首的盘指针。这意味着指向表首的盘指针可能成为过时。为更新这些盘指针,在框1325中系统周期地进行检查点操作。例如,系统可能每隔n个事务之后就进行检查点操作,其中n是系统参数。事务可以包括分配、释放或者其他存储操作。
选代地,系统可以每当建立了m个新块之后就进行检查点操作,其中m是系统参数。在正常运行的情况下通常在关机之前进行检查点操作。
在执行框1325中的步骤期间,根据保持于主存储器中的head_of_list指针来更新盘的head_of_list指针。在具有多个盘表的系统中,希望在盘上的连续存储位置中保持盘head_of_list指针以便有效地更新head_of_list指针,例如通过完成单个写块操作或多个写块操作但很少移动盘头。
参照图14,其中显示用于阐述在随机存取存储器(RAM)和盘之间使用存储管理方法II的存储分配的阐述性例子。存储管理方法II可与MFLF算法一起使用。如果如此,则为快表和杂项表保持存储器内数据结构。虽然在存储器内表与盘表之间存在着一一对应关系,但并不要求如此。
当在故障或正常关机之后重新启动系统时,可以扫描存于盘上的首部,进而或者如存储管理方法I中那样检查块尺寸和分配状态,或者检查存于盘上的表,以便构造DSA所用存储器内数据结构(例如空表)。可以在需要时逐步地读取这类数据而不必一次全部读取,当然也可一次全部读取。
如图14中所示,阐述了采用本发明的用于多个不同存储操作的存储管理过程。这些过程由随机存取存储器1404和盘1406分担。存储块1408被阐述为矩形。存储块1408包括位于块中第一位置1410处的用于表示尺寸的数字,其正值表示空块而负值表示已分配。主存储器(RAM1404)的存储块1409标有地址,例如a1,a2,a3,…a5,其中对应的块位于盘1406上。表首指向盘1406的表上第一存储块的位置。盘上块1408的地址由块1408的第二位置1412中的地址标记所标示。地址标记1412是为便于解释而标出的,这类地址标记并不需要存于盘上。块1408的最后位置1414指向表中下一个存储块,或者“#”意味着NIL或者表或集合的末端。
参照图13描述图14例子中的存储操作。RAM 1404只包括空块。保持盘上块的表(框1305)。根据框1310完成对(25)的分配。根据框1320完成对(a2)的释放。根据框1315完成对(90)的分配。注意到,由于分配来自向盘上表的前端移动的尾区,以致表首a1成为过时。如图14中所示,根据框1325的检查点操作将表首更新为a5。
参照图15,其中阐述用于管理盘上持久性存储的存储管理方法III。应该注意到,图15中所示各框可以按照任何顺序完成或执行。在框1505中系统保持至少一个空块表。可通过保持首部中表指针而保持该表。此表的表首可能成为过时,但可在框1520中检查点操作期间得到更新。在主存储器中保持此表的最新版本。当从表的第一成员中进行分配时此方法特别有用。对于MFLF方法而言,从所有快表及从除最后杂项表以外的杂项表中进行分配时可从表的第一单元开始,所以这些表本身很适用于存储管理方法III。
在框1515中,自空表首端分配一块。将存储器内数据结构更新。此外,将该块标为已在盘上分配。然而,为减少盘操作,可让盘上表指针过时。在框1510中,通过将块加至合适的空表的首端及将存储器内数据结构更新即可将块释放。该块标为已在盘上分配及其首部更新为指向空表中下一块。为使将此盘更新操作的开销减至最小,可将分配状态标记和指向下一个表单元的指针彼此紧靠地存于盘上。为有利地减少盘操作,可允许指向表首的盘指针成为过时。
为更新盘上head_of_list指针,在框1520中系统周期地进行检查点操作。例如,系统可能每隔n个事务之后就进行检查点操作,其中n是系统参数。此外,通常在系统关机之前完成检查点操作。在框1520的步骤期间,使用存储器中保持的表指针来更新盘空表指针。在具有多个空表的系统中,最好在盘上连续存储位置中保持盘空表指针,以便有效地更新这些指针,例如通过单个写块操作或多个写块操作但却很少移动盘头。注意到如果当盘上一个或多个空表不正确时系统出故障,则这些空表可能包括已分配块。在框1525中,在故障之后将这些空表固定。
系统检查盘上由存储管理方法III管理的每个空表及消除已分配块。系统通过从头扫描空表及检查首部来做到此点。一旦系统遇到空表中的空块时,系统即停止检查该表,因为表上剩余块应该也是空的。
参照图16,其中显示存储管理方法III的阐述性例子。如图16中所示,阐述了采用本发明的用于多个不同存储操作的存储管理过程。这些过程由随机存取存储器1604和盘1606分担。存储块1608被阐述为矩形。存储块1608包括位于块中第一位置1610处的用于表示尺寸的数字,其正值表示空块而负值表示已分配。主存储器(RAM 1604)的存储块1611包括一个空表1607,它包括一个表示具有尺寸例如此例中的“3”的块的索引1609。一个地址,例如a1,a2,a3,a4包括于表1607中,其中在盘1606上分配一块相应块。盘上块1608的地址由块1608的位置1612中的地址标记所标示。地址标记1612是为便于解释而标出的,这类地址标记并不需要存于盘上。块1608的位置1614指向表中下一个存储块,或者“#”意味着NIL或者表的末端。
参照图15述图16例子中的存储操作。保持盘上块的表(框1505)。根据框1515完成对(3)的分配并且送回指针至a1。同时再根据框1515同样地完成对(3)的分配。根据框1510完成对(a3)的释放。用指向块地址a3的地址a2和a4将块1608标记。这由检查点操作所固定。根据框1520的检查点操作将空表1609更新以便将具有地址a4和a3的块保持于空表中。
参照图17,其中阐述存储管理方法的另一个实施例,为简化起见,该方法称为存储方法IV。应该注意到,图17中所示各框可以按照任何顺序完成或执行。系统保持用于管理存储器的存储器内数据结构。这类存储器内数据结构可以包括表。在框1705中通过修改存储器内数据结构而完成分配操作和释放操作。通常在框1705中不进行盘操作。通常分配操作和释放操作可以是快的。在框1710中系统周期地对送至存储器的信息进行检查点操作。例如,系统可能每隔n个事务之后就进行检查点操作,其中n是系统参数。此外,通常在系统关机之前完成检查点操作。就在正常关机之前,系统可以在盘上存储附加信息(例如存储区中空表结构,假定系统正在使用空表),以备稍后读进从而减少启动时间。
这类检查点操作允许系统在正常关机或故障之后重新启动。就在正常关机之前,系统可以在盘上存储那些在正常检查点操作期间系统可能不存储的信息。可以稍后读进这类辅助信息从而减少启动时间。
当设计者在选择最适合于性能需要的存储管理方法时,可以考虑不同存储管理方法之间的折衷情况。此处所描述的各种存储管理方法提供超过现有技术的许多优点。存储管理方法I比存储管理方法II和存储管理方法III需要较少首部空间。此外,存储管理方法I在分配操作和释放操作中所执行的写盘操作比存储管理方法II和存储管理方法III少。对于存储管理方法I而言,盘上信息始终是最新的,并且不需要检查点操作。
存储管理方法II允许在盘上保持多个表,它们可以在启动期间使用比存储管理方法I少的盘读取操作来分配特定尺寸的块。检查点操作采用于存储管理方法II,以及盘上表首并不始终是当今值。
存储管理方法III采用多个空表,以及从空表首端进行所有分配操作从而得到最佳性能。方法III可在启动期间用于分配特定尺寸的空块,因而使用比方法I和II更少的读取操作,因为方法III采用多个表。不像存储管理方法II,方法III的表只包括空块(假定为正常关机)。采用检查点操作,可能需要更新盘上的表,以及在故障之后可能需要固定盘上的表。
存储管理方法IV完成分配操作和释放操作而不需盘操作!然而,方法IV可能比其他方法(例如方法I-III)更多地包括检查点操作过程。此外,在故障的情况下,使用方法IV比使用其他方法更可能使盘存储区过时。
现在将要阐述性地描述另一个根据本发明的用于分配存储的方法(管理方法V)。当系统通过保持和更新指向第一空字节的指针(尾指针)而从盘存储器的大块(例如图5中的尾区)中分配存储时,此方法特别有用。
参照图18,在框1805中系统为各块在盘上保持包括至少一个称为代码字节的字节的首部。应该注意到,图18中所示各框可以按照任何顺序完成或执行。该系统也在存储区内保持用于标示当今尾指针和盘上尾指针的变量。盘上尾指针可能是过时的。在框1810中系统从尾区中分配一块b1。此步骤存于首部中的信息包括一个已分配标记、块尺寸及一个或多个代码字节。盘上尾指针通常不在此步骤中更新。其理由是尾指针可能与盘上b1的首部距离甚远。更新盘上尾指针可能会使用一个额外盘操作。相反,b1的首部字节可以保持于盘上邻近处,因而通常只用少数(在很多情况下,一个即已足够)盘操作来完成对首部的所有更新。存于代码字节中的特殊信息标示该块已不再是尾区的一部分。也可能将用于其他目的的首部字节也用作代码字节,从而减少或节省由代码字节引起的开销。例如,存储管理方法II和III使用首部字节来存储块尺寸和表指针。这些字节也可用作代码字节。
存储区中的尾指针(但不是盘上的)在框1810中更新。在框1825中将块b1释放至尾区。将代码字节修改以便标示b1现在是尾区的一部分。如果盘上尾指针已经高速缓存于存储器内以备检查而不必访问盘及其值是当今值,则将尾指针更新以使它在将b1释放至尾区之后仍然保持当今值。否则允许盘上尾指针依然成为过时。
在框1820中周期地将更新的尾指针通过检查点操作送至盘上。例如,系统可能每隔n个事务之后就进行检查点操作,其中n是系统参数。选代地,可以在上一次更新盘上尾指针之后的p次更新至尾区的操作之后由系统进行检查点操作,其中p是系统参数。在正常运行期间通常在系统关机之前完成检查点操作。
因此,更新盘上尾指针的费用可以分摊于数个分配和/释放操作之中。本发明可以与先前描述的发明一起使用,例如参照图8和9描述的方法或者存储管理方法I、II和III。如果与存储管理方法II和III一起使用,则尾区的检查点操作可与空表的检查点操作合并。例如,假设一个MFLF系统需要对尾指针和空表指针进行检查点操作。盘上的尾指针在存储时可以与空表指针邻近。以此方式,可以使用单个写块操作或少量写块操作而不需盘头移动来对尾指针和空表进行检查点操作。
如果发生系统故障,则存于盘上的尾指针可能不是当今值。框1815试图在故障后校正尾指针。设t为尾指针的存储值。系统检查对应于在t处开始的块的首部中的代码字节。如果这些代码字节标示t对应于一块,则根据首部来确定块尺寸s。将尾指针增量至t+s,再使该过程一直继续,直至检查到标示存储区不对应于一块的代码字节。更新的尾指针然后存于盘上。
在一个阐述性例子中,假设使用存储管理方法II。尺寸和指针首部两者都可用作代码字节。在框1815中对有效代码字节的测试可能包括证实尺寸字节存储了合法尺寸及指针指向属于合适的尺寸类的块。图18实施一个概率恢复算法。有可能在框1815中将尾指针不必要地向前移。通过合适地使用代码字节,此概率可以减至任意低的值。在最坏情况下,可能会损失某些尾存储区,但已分配的存储区不会被错误地释放。
有可能将图18的方法与若干个使用类似尾区的数据结构的不同DSA例如MFLF算法一起使用。并不是始终必须使用框1825来将块释放至尾区。例如,MFLF算法可能不会正常地尝试将最近释放的块加至尾区。相反,MFLF算法可能会将释放的块加至空表。在汇并时可能将存储区加至尾区。
参照图19,发明者把使用存储管理方法I的MFLF III与DB2TM对照来测试性能特性,其中DB2TM可从IBM买到。对于5300个各具有100字节尺寸的项目完成读取和写操作。所报告的时间包括初始化时间。测试运行包括以下:
-(A)在一次执行中进行所有测试,包括单功能测试。
-(R)每个项目从数据库中读取一次(键控查表)。
-(Wp)将每个项目写一次至空数据库中(将数据库准备好)。
-(Wn)将每个项目写一次至满数据库中(在准备好的数据库中替代每个项目)。
-(I)对于数据库中每个项目执行迭代操作(非键控查表)。
注意到由于测试A的初始化时间加上额外功能测试,(R+Wp+Wn+I)加起来还不到A。数据库包括一个具有带索引的主键(串)和数据对象(LOB)的表。只有在完成所有更新之后才更新基本测试。如图19中所示,在每次更新或每五次更新之后实行辅助更新。每五次更新就需要对DB2实际地进行测试,及DB2需要数个调谐参数来完成测试。基本测试结果显示于图19中。以秒表示的标以1900的本发明测试时间显示出比标以1902的DB2测试时间的显著改进。在大部分情况下,能够获得一个数量级的改进。
参照图20,DB2用数种模式运行。例如,如图20中所示,可以手动执行、自动执行或每隔五次更新执行对DB2的测试。本发明的Wp和Wn测试的操作时间(以秒计)大于一个数量级及在某些情况下大于两个数量级。
熟悉技术的人可以对本发明作出各种不同改变。例如,DSA可以并行地进行以便并发地处理多个事务。这对于盘阵列而言可能是合适的。以下参考资料中描述了完成并行处理的技术:
1)1992年12月Arun Iyengar,Massachusetts Institute ofTechnology Laboratory for Computer Science的TR-560(博士论文)“多处理器上的动态存储分配”;及
2)1996年10月在Proceedings of IEEE Frontiers′96上ArunIyengar的“动态存储分配算法的可改变规模性”。
已经描述了用于持久和稳固存储分配的系统和方法的优选实施例(它们只是阐述性而不是限制性的)之后,注意到,熟悉技术的人可以考虑到以上原理而作出修改和变动。因此应该理解,可以在由所附权利要求书所规定的范围和实质之内对本发明的具体实施例作出改变。已经按照专利法所要求的细节和具体性描述了本发明,在所附权利要求书中将提出权利要求和希望得到保护的内容。