专利名称::用于持久和稳固的存储管理的系统和方法
技术领域:
:本发明涉及计算机存储方法和系统,更具体地涉及用于稳固动态存储分配的方法和系统。许多计算机需要动态地分配存储器。操作系统使用动态存储分配为执行程序而分配存储器。动态存储分配的另一个例子可以包括用于存储网络数据的网络服务器。在很多情况下,在发出请求之前,所请求的存储尺寸是不知道的。动态分配的存储块的生命周期也是不知道的。已经花费了相当多的精力来开发主存储器的有效动态存储分配算法。但对盘上的有效动态存储分配算法的开发所花费精力却少得多。有多种理由说明盘上的有效动态存储分配的重要性。在很多情况下,主要的是具有能在时间上持久的即使在关机后也持久的数据。盘存储器提供持久存储。盘存储器也提供容错存储;当系统垮台以致主存储器内容丢失之后,经常仍能保持存于盘上的信息。盘存储器的另一个优点是有可能以比主存储器更合理的价格提供更多的盘存储器。因此它可用于存储主存储器内存放不下的信息。参照图1,最初适配系统分配找到的第一块足够大的能满足存储请求的存储块(的全部或一部分)。对于“7”的存储请求,最初适配返回B1,因为这是遇到的能够满足请求的第一块。最佳适配系统分配足够大以能满足存储请求的最小存储块(的全部或一部分)。图1中,由于“7”在块B3(它的容量为8)中适配得最佳,因此返回B3。参照图2,在二进制伙伴系统中,块尺寸为2的幂(例如4和4,8和8等)。许多动态存储分配器(DSA)保持一个或多个空块表。这类表称为空表,例如空块表。不同尺寸的块有不同的空表。也存在用于分配其他尺寸的块的伙伴系统。在1996年10月在ProceedingsofIEEEFrontiers′96上刊登的ArunIyengar所著的名为“动态存储分配算法的可改变规模性”的文章以及本说明书所附参考文献中都很好地回顾了动态存储分配的现有技术。动态存储分配器(DSA)能够使用不同方法来汇并邻近空块。一个方案是使用立即汇并,其中在释放块时立即将该释放块与邻近空块汇并,如图3所示。在图3中,在每块中都标明块尺寸。正的尺寸值标明空块,而负的尺寸值标明分配块。参照图4,另一个方案包括延迟汇并。当使用延迟汇并时,在释放后邻近的空块并不自动地合并。相反,到一定时候(例如当无法分配一个足够大能满足请求的块时),DSA将扫描存储设备中的各块以及如图4中所示地将邻近块合并。存储碎块是DSA浪费的存储区。内部存储碎块是当使用大于所请求尺寸的空块来满足请求时(例如使用尺寸为32的块来满足对尺寸为25的块的请求时)损失的存储区。当空块与分配块交织时出现外部存储碎块。在这种情况下,即使有大于b字节的空间也无法满足对b字节的分配请求,因为最大的连续空块小于b字节。以上引用的“动态存储分配算法的可改变规模性”文章中所描述的多空表适配Ⅰ(MFLFⅠ)使用多个按照尺寸组织的空表。小块的空表称为快表。大块的空表称为杂表。当保持单个杂表时,MFLFⅠ退化为称为快适配的存储分配系统。参照图5,其中显示快适配技术。在此系统中,尺寸为16以下的块放在快表中;可以改变快表数量以便针对不同请求分布将性能优化。在此例中,当2≤s≤16(2是最小块尺寸)时,通过检查尺寸为s的快表来分配尺寸为s的块。如此表不空,则表中第一块可用于满足请求。注意到可能有对应于单元尺寸的倍数的块尺寸的快表。例如,在图2中,单元尺寸是1。如果单元尺寸是1000,则可以使用块尺寸为1000、2000、3000、…、16000的快表(总共有16个快表)。MFLFⅠ使用延迟汇并。存储区分为工作存储区12和尾区14,如图5中所示。工作存储区12包括释放块和空表中的块。尾区14包括存储区一端的未分配存储区中的连续块。最初,在分配任何块之前,尾区包括所有可分配存储区,及空表是空的。空表包括快表和杂表,其中杂表用于较大存储块。块13包括一个尺寸(由块13中的数目所标示)。当检查一个或多个空表后发现无法满足请求时,可从尾区14中分配从而满足请求。尾区指针(tailptr.)标示尾区14的始端。当释放已分配块时即将它填放入空表。为满足对于快表无法满足的过大块的请求,快适配对杂表进行最初适配搜索。搜索大块可能需要多条指令。为减少此开销,MFLFⅠ可以使用多个杂表而不是如快适配中那样只用一个表,如图6中所示。在图6中,尺寸为17-25的块13有一个杂表,尺寸为26-40的块13有另一个杂表,而尺寸为41-60的块则还有一个杂表。可用不同准则来满足请求,包括图7A和7B中所示的一个准则来使用MFLFⅠ分配“84”。当分配84的请求得到满足时,图7A显示存储区的“以前”简况,而图7B显示“以后”简况。在图7A和7B中,系统将表L2中的第一块进行分配以便满足请求,它划分尺寸为“90”的块并且将多余的尺寸“6”送回至空表。系统检查L2而不是L1,因为L2所允许的最小块的尺寸为89。因此,不需要在L2的第一块之外再进行搜索来满足对其尺寸小于或等于89的请求。虽然以上所述技术对于许多应用场合已经够用,但直接将主存储器的动态存储分配算法使用于盘系统中时往往会导致不良性能,因为访问盘和写盘的等待时间比主存储器大得多。因此,需要盘存储器的动态存储分配方法,用于减少访问盘或写盘的次数。还需要存储分配和释放方法,用于提供更有效的存储和更快的访问时间。一种根据本发明的用于管理包括主存储器和至少一个盘存储设备在内的存储系统中持久存储器的方法包括以下步骤在持久存储器中为多个块保持首部,其中每块的首部包括该块的块尺寸和分配状态,以及在主存储器内保持至少一个数据结构,用于分配和释放持久存储器。使用以下步骤分配存储块通过在主存储器内采用至少一个数据结构来标识存储块,修改主存储器内的至少一个数据结构以及为盘上的块赋予一个分配状态。在盘上为该块赋予一个分配状态及在主存储器内修改至少一个数据结构来释放存储块。在其他方法中,该方法可能包括在系统根据持久存储器的多个首部重新启动后确定主存储器内的至少一个数据结构的步骤。在系统重新启动后确定主存储器内的至少一个数据结构的步骤可能包括持久存储器的至少一个盘访问操作,其中单个盘访问操作读入多个字节。该方法可能还包括以下步骤在系统关机之前自主存储器的至少一个数据结构中输出信息至持久存储器中,以及在系统根据输出的信息重新启动之后确定主存储器中的至少一个数据结构。在持久存储器中保持首部的步骤可能包括提供存于持久存储器的连续区内的多个首部。在持久存储器中保持首部的步骤可能包括保持具有一个指向持久存储器内的一个位置的指针域的首部。该方法可能还包括以下步骤使用各首部内的指针域来保持持久存储器内的块表以及在主存储器内保持至少一个指向块表表首的当今指针。在又一个方法中,可以包括以下步骤在持久存储器内建立一个新块,在持久存储器内为新块设置一个指向主存储器内至少一个当今指针p的值的指针域及将p设置为指向新块。可以使用单个写块操作将新块首部初始化。该方法可能包括周期地将持久存储器内至少一个表首更新为对应于来自主存储器内至少一个当今指针的表的步骤。该表可能包括多个表和这些表还包括对应于连续地保持于持久存储器内的多个表的表首,及该方法可能还包括在单个写块操作中更新这些表首的步骤。第一存储块和第二存储块可能包括相同块。一种用于管理包括主存储器和至少一个盘存储设备在内的存储系统中持久存储器的方法包括以下步骤在持久存储器中为多个块保持首部,其中每块的首部包括该块的块尺寸、分配状态及指针,以及在主存储器内保持至少一个数据结构,用于分配和释放至持久存储器,以及将多块中的第一存储块进行分配。分配步骤包括以下步骤通过在主存储器内采用至少一个数据结构来标识第一存储块,修改主存储器内的至少一个数据结构以及为持久存储器内的第一存储块赋予一个分配状态,通过以下步骤释放多块中的第二存储块在持久存储器内为第二存储块赋予一个分配状态,为第二存储块更新盘上的指针域及在主存储器内修改至少一个数据结构。在其他方法中,可能包括使用各首部内的指针域来保持持久存储器内的块表以及在主存储器内保持至少一个指向块表表首的当今指针的步骤。该方法可能包括响应于故障而检查块表以便清除已分配块的步骤。该方法可能包括当找到块表上的空块时结束检查步骤的步骤。主存储器内至少一个数据结构可能包括对应于持久存储器内块表的至少一个空块表。该方法还可能包括周期地将持久存储器内至少一个表首更新为对应于来自主存储器内至少一个当今指针的块表的步骤。该块表可能包括多个表和连续地保持于持久存储器内的多个首部,及还包括在单个写块操作中更新这些表首的步骤。在又一个方法中,更新指针域的步骤可能包括将指针域中的指针设置为指向主存储器内空块的至少一个表L的表首的步骤,以及释放步骤可能还包括将第二存储块加至主存储器内L的表首的步骤。可以使用单个写块操作将第二存储块的首部更新。该方法可能还包括根据持久存储器内的多个首部将系统重新启动后确定主存储器内的至少一个数据结构的步骤。在系统重新启动后确定主存储器内该至少一个数据结构的步骤可能包括访问盘操作,其中单个访问盘操作读入多个字节。该方法可能包括以下步骤在系统关机之前自主存储器的至少一个数据结构中输出信息至持久存储器中,以及在系统根据输出的信息重新启动之后确定主存储器中的至少一个数据结构。该方法可能包括在持久存储器的连续区内存储多个首部的步骤。第一存储块和第二存储块可能包括相同块。另一个用于管理持久存储系统内的存储器的方法包括以下步骤在主存储器内保持至少一个数据结构,用于分配和释放持久存储器,完全自至少一个数据结构中分配和释放持久存储器而不访问或写至持久存储器,周期地对存储分配信息进行检查点操作并且送至持久存储器以及在根据检查点操作的信息重新启动之后在主存储器内确定至少一个数据结构。又一个用于管理持久存储系统内的存储器的方法包括以下步骤在主存储器内保持至少一个数据结构,用于分配和释放持久存储器,完全自至少一个数据结构中分配和释放持久存储器而不访问或写至持久存储器,在系统关机之前自主存储器的至少一个数据结构中输出信息至持久存储器中,以及在系统根据所述输出信息重新启动之后确定主存储器中的至少一个数据结构。此处描述的这些方法及其步骤可以在可在可由机器读取的程序存储设备上实施,它所确实地实施的程序指令可由机器执行来完成所述这些方法的步骤。通过结合附图阅读以下本发明的阐述性实施例的详细说明,将能清楚地了解本发明的这些和其他目的、特征和优点。下面将参照附图在优选实施例的说明中详细地描述本发明,附图中图1是用于阐述性地显示最初适配分配和最佳适配分配的原理图;图2是用于阐述性地显示根据现有技术的二进制伙伴系统的原理图;图3是用于阐述性地显示存储块的立即汇并的原理图;图4是用于阐述性地显示存储块的延迟汇并的原理图;图5是用于显示根据现有技术的多个空表适配的特殊情况的快适配的例子的原理图;图6是用于显示根据现有技术的多个空表适配(MFLFⅠ)的例子的原理图;图7A和7B阐述根据现有技术的使用MFLFⅠ分配大块的例子的“以前”和“以后”简况;图8是用于显示根据本发明的多个空表适配分配(MFLFⅢ)的框图/流程图;图9是用于显示根据本发明的分配大块的多个空表适配(MFLFⅢ)分配的框图/流程图;图10是用于显示根据本发明将邻近空块汇并的框图/流程图;图11是用于显示根据本发明使用存储管理方法Ⅰ的分配的框图/流程图;图12是用于显示根据本发明使用存储管理方法Ⅰ的释放的框图/流程图;图13是用于阐述根据本发明的存储管理方法Ⅱ的框图/流程图;图14是根据本发明的存储管理方法Ⅱ的阐述性例子;图15是用于阐述根据本发明使用存储管理方法Ⅲ的框图/流程图;图16是根据本发明的存储管理方法Ⅲ的阐述性例子;图17是用于阐述根据本发明使用存储管理方法Ⅳ的框图/流程图;图18是根据本发明的用于管理尾区分配和释放的框图/流程图19是一个实施例的根据本发明的相对于根据现有技术的阐述性测试结果的图表;及图20是一个实施例的根据本发明的相对于根据现有技术的阐述性测试结果的另一个图表。本发明涉及存储管理及分配的系统和方法。此处提出的这些系统和方法与现有技术比较能提供改进的性能,及本发明对盘存储器特别有用。现有技术中用于持久地在盘上存储信息的技术包括使用文件系统和数据库。使用本发明,可以比使用现有技术少得多的开销将信息存于盘上。还有,使用本发明可以存储大量对象。许多文件系统受可以存于一个目录中的文件数所限制;而本发明对于所存对象的数量并无限制。在一个实施例中,提供一种方法,它设计用于使块的划分减至最少而不会显著地浪费多余存储空间。本发明的使用可以延伸至盘分配和主存储器分配两者。本发明提供一种新的和有用的动态存储分配方法,它类似于MFLFⅠ,但包括可用于显著地改进存储管理和盘性能的修改。一项修改包括减少块的划分数量。当例如盘分配中不希望划分块时,减少块划分数量就显得重要。应该理解,图8-19中所示元件可用硬件、软件或它们的组合的不同形式来实施。这些元件最好实施于一个或多个具有处理器和存储器和输入/输出接口的合适地编程的通用数字计算机中的存储设备上。应该理解,在公开本发明时,熟悉技术的人能够如下所述地选配多个普通使用的存储分配算法来实施本发明。因此不应认为下面用于阐述本发明实施例是对本发明施加任何限制。本发明中采用的内存或主存储器系指易失性存储器,例如随机存取存储器或高速缓存,当然也可采用其他类型的存储器。盘或盘存储器系指持久性存储器,它可包括硬盘、软盘、光盘、DVD、盘阵列或其他持久性存储设备。如上所述,MFLFⅠ在分配期间有时将空块划分以便分配一部分块及退回另一部分至空存储区。与MFLFⅠ比较,本发明能够有利地减少划分的块数。这是分配盘存储器的一项重要参数,因为划分块能够造成盘的额外操作(其中操作是读或写)。本发明因此在分配时比MFLFⅠ划分得少。本发明可用于分配主存储器以及盘存储器。现参照附图,其中相同数字表示相同或类似元件,先参照图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系统、最初适配、最佳适配等。在第一阐述性存储管理方法(为简化起见,此后称为方法Ⅰ)中,盘保持首部,它们包括块尺寸以及用于标示该块是空的还是已分配的标志。存储器中保持用于分配和释放的空表数据结构。参照图11,其中显示根据本发明的存储管理方法Ⅰ的分配操作。应该注意到,图11中所示各框可以按照任何顺序完成或执行。在框1105中使用存储器内数据结构来寻找合适空块。一旦找到该块,在框1110中通过修改合适的存储器内数据结构和将盘上的首部标志标为“已分配”而分配该块。如果不划分块,则分配操作只耗费单个盘操作周期。参照图12,其中显示根据本发明的存储管理方法Ⅰ的释放操作。修改合适的存储器内数据结构来释放块。此外,在框1205中将盘上的首部标志标为“已释放”。如果不进行汇并,则释放操作只耗费单个盘操作周期。当在故障或正常关机之后重新启动系统时,可以通过扫描存于盘上的首部来构造DSA所用存储器内数据结构(例如空表)。可以在需要时逐步地读取这类数据而不必一次全部读取,当然也可一次全部读取。在一个实施例中,可以通过在盘存储器的一个或多个连续块中保持多个首部字而减少用于从盘上读取信息的时间。当连续块b1满时,可以将新块b2链接至b1以便包括附加首部。可以比很不连续的信息快得多地读取盘上存储区的连续块。例如,一个(或小量)块读取操作可用于读取数个连续首部。即使不使用块读取,从彼此紧靠的盘区中的多个读取也可能只需少量移动盘头。这能节省时间。在能够在正常关机之后改进启动时间的另一个实施例中,就在关机之前由DSA将主存储器数据结构(例如空表)输出至盘存储器的一个或多个连续块中。在重新启动时,DSA从就在关机之前所写的存储块中读取数据结构。这可能比从首部获得信息要快得多。如上所述,这些实施例可用于以下所述的存储管理方法以及用于存储管理方法Ⅰ。参照图13,其中显示一个根据本发明的用于管理盘上持久存储区的阐述性存储管理方法。为简化起见,此方法今后称为方法Ⅱ或存储管理方法Ⅱ。应该注意到,图13中所示各框可以按照任何顺序完成或执行。该系统保持至少一个盘上块的表(它可能包括空块和已分配块中的一个或它们两者)(框1305)。可以在首部中保持表指针而保持该表。分配操作(框1310)采取的方式如图11中所示及在相伴文本中加以描述。然而方法Ⅱ所保持的存储器内数据结构可能与方法Ⅰ所用的不同(见例如图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)和盘之间使用存储管理方法Ⅱ的存储分配的阐述性例子。存储管理方法Ⅱ可与MFLF算法一起使用。如果如此,则为快表和杂表保持存储器内数据结构。虽然在存储器内表与盘表之间存在着一一对应关系,但并不要求如此。当在故障或正常关机之后重新启动系统时,可以扫描存于盘上的首部,进而或者如存储管理方法Ⅰ中那样检查块尺寸和分配状态,或者检查存于盘上的表,以便构造DSA所用存储器内数据结构(例如空表)。可以在需要时逐步地读取这类数据而不必一次全部读取,当然也可一次全部读取。如图14中所示,阐述了采用本发明的用于多个不同存储操作的存储管理过程。这些过程由随机存取存储器1404和盘1406分担。存储块1408被阐述为矩形。存储块1408包括位于块中第一位置1410处的用于表示尺寸的数字,其正值表示空块而负值表示已分配。主存储器(RAM1404)的存储块1409标有地址,例如a1,a2,a3,…a5,其中对应的块位于盘1406上。表首指向盘1406的表上第一存储块的位置。盘上块1408的地址由块1408的第二位置1412中的地址标记所标示。地址标记1412是为便于解释而标出的,这类地址标记并不需要存于盘上。块1408的最后位置1414指向表中下一个存储块,或者“#”意味着NIL或者表或集合的末端。参照图13描述图14例子中的存储操作。RAM1404只包括空块。保持盘上块的表(框1305)。根据框1310完成对(25)的分配。根据框1320完成对(a2)的释放。根据框1315完成对(90)的分配。注意到,由于分配来自向盘上表的前端移动的尾区,以致表首a1成为过时。如图14中所示,根据框1325的检查点操作将表首更新为a5。参照图15,其中阐述用于管理盘上持久性存储的存储管理方法Ⅲ。应该注意到,图15中所示各框可以按照任何顺序完成或执行。在框1505中系统保持至少一个空块表。可通过保持首部中表指针而保持该表。此表的表首可能成为过时,但可在框1520中检查点操作期间得到更新。在主存储器中保持此表的最新版本。当从表的第一成员中进行分配时此方法特别有用。对于MFLF方法而言,从所有快表及从除最后杂表以外的杂表中进行分配时可从表的第一单元开始,所以这些表本身很适用于存储管理方法Ⅲ。在框1515中,自空表首端分配一块。将存储器内数据结构更新。此外,将该块标为已在盘上分配。然而,为减少盘操作,可让盘上表指针过时。在框1510中,通过将块加至合适的空表的首端及将存储器内数据结构更新即可将块释放。该块标为已在盘上分配及其首部更新为指向空表中下一块。为使将此盘更新操作的开销减至最小,可将分配状态标记和指向下一个表单元的指针彼此紧靠地存于盘上。为有利地减少盘操作,可允许指向表首的盘指针成为过时。为更新盘上head_of_list指针,在框1520中系统周期地进行检查点操作。例如,系统可能每隔n个事务之后就进行检查点操作,其中n是系统参数。此外,通常在系统关机之前完成检查点操作。在框1520的步骤期间,使用存储器中保持的表指针来更新盘空表指针。在具有多个空表的系统中,最好在盘上连续存储位置中保持盘空表指针,以便有效地更新这些指针,例如通过单个写块操作或多个写块操作但却很少移动盘头。注意到如果当盘上一个或多个空表不正确时系统出故障,则这些空表可能包括已分配块。在框1525中,在故障之后将这些空表固定。系统检查盘上由存储管理方法Ⅲ管理的每个空表及消除已分配块。系统通过从头扫描空表及检查首部来做到此点。一旦系统遇到空表中的空块时,系统即停止检查该表,因为表上剩余块应该也是空的。参照图16,其中显示存储管理方法Ⅲ的阐述性例子。如图16中所示,阐述了采用本发明的用于多个不同存储操作的存储管理过程。这些过程由随机存取存储器1604和盘1606分担。存储块1608被阐述为矩形。存储块1608包括位于块中第一位置1610处的用于表示尺寸的数字,其正值表示空块而负值表示已分配。主存储器(RAM1604)的存储块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,其中阐述存储管理方法的另一个实施例,为简化起见,该方法称为存储方法Ⅳ。应该注意到,图17中所示各框可以按照任何顺序完成或执行。系统保持用于管理存储器的存储器内数据结构。这类存储器内数据结构可以包括表。在框1705中通过修改存储器内数据结构而完成分配操作和释放操作。通常在框1705中不进行盘操作。通常分配操作和释放操作可以是快的。在框1710中系统周期地对送至存储器的信息进行检查点操作。例如,系统可能每隔n个事务之后就进行检查点操作,其中n是系统参数。此外,通常在系统关机之前完成检查点操作。就在正常关机之前,系统可以在盘上存储附加信息(例如存储区中空表结构,假定系统正在使用空表),以备稍后读进从而减少启动时间。这类检查点操作允许系统在正常关机或故障之后重新启动。就在正常关机之前,系统可以在盘上存储那些在正常检查点操作期间系统可能不存储的信息。可以稍后读进这类辅助信息从而减少启动时间。当设计者在选择最适合于性能需要的存储管理方法时,可以考虑不同存储管理方法之间的折衷情况。此处所描述的各种存储管理方法提供超过现有技术的许多优点。存储管理方法Ⅰ比存储管理方法Ⅱ和存储管理方法Ⅲ需要较少首部空间。此外,存储管理方法Ⅰ在分配操作和释放操作中所执行的写盘操作比存储管理方法Ⅱ和存储管理方法Ⅲ少。对于存储管理方法Ⅰ而言,盘上信息始终是最新的,并且不需要检查点操作。存储管理方法Ⅱ允许在盘上保持多个表,它们可以在启动期间使用比存储管理方法Ⅰ少的盘读取操作来分配特定尺寸的块。检查点操作采用于存储管理方法Ⅱ,以及盘上表首并不始终是当今值。存储管理方法Ⅲ采用多个空表,以及从空表首端进行所有分配操作从而得到最佳性能。方法Ⅲ可在启动期间用于分配特定尺寸的空块,因而使用比方法Ⅰ和Ⅱ更少的读取操作,因为方法Ⅲ采用多个表。不像存储管理方法Ⅱ,方法Ⅲ的表只包括空块(假定为正常关机)。采用检查点操作,可能需要更新盘上的表,以及在故障之后可能需要固定盘上的表。存储管理方法Ⅳ完成分配操作和释放操作而不需盘操作!然而,方法Ⅳ可能比其他方法(例如方法Ⅰ-Ⅲ)更多地包括检查点操作过程。此外,在故障的情况下,使用方法Ⅳ比使用其他方法更可能使盘存储区过时。现在将要阐述性地描述另一个根据本发明的用于分配存储的方法(管理方法Ⅴ)。当系统通过保持和更新指向第一空字节的指针(尾指针)而从盘存储器的大块(例如图5中的尾区)中分配存储时,此方法特别有用。参照图18,在框1805中系统为各块在盘上保持包括至少一个称为代码字节的字节的首部。应该注意到,图18中所示各框可以按照任何顺序完成或执行。该系统也在存储区内保持用于标示当今尾指针和盘上尾指针的变量。盘上尾指针可能是过时的。在框1810中系统从尾区中分配一块b1。此步骤存于首部中的信息包括一个已分配标记、块尺寸及一个或多个代码字节。盘上尾指针通常不在此步骤中更新。其理由是尾指针可能与盘上b1的首部距离甚远。更新盘上尾指针可能会使用一个额外盘操作。相反,b1的首部字节可以保持于盘上邻近处,因而通常只用少数(在很多情况下,一个即已足够)盘操作来完成对首部的所有更新。存于代码字节中的特殊信息标示该块已不再是尾区的一部分。也可能将用于其他目的的首部字节也用作代码字节,从而减少或节省由代码字节引起的开销。例如,存储管理方法Ⅱ和Ⅲ使用首部字节来存储块尺寸和表指针。这些字节也可用作代码字节。存储区中的尾指针(但不是盘上的)在框1810中更新。在框1825中将块b1释放至尾区。将代码字节修改以便标示b1现在是尾区的一部分。如果盘上尾指针已经高速缓存于存储器内以备检查而不必访问盘及其值是当今值,则将尾指针更新以使它在将b1释放至尾区之后仍然保持当今值。否则允许盘上尾指针依然成为过时。在框1820中周期地将更新的尾指针通过检查点操作送至盘上。例如,系统可能每隔n个事务之后就进行检查点操作,其中n是系统参数。选代地,可以在上一次更新盘上尾指针之后的p次更新至尾区的操作之后由系统进行检查点操作,其中p是系统参数。在正常运行期间通常在系统关机之前完成检查点操作。因此,更新盘上尾指针的费用可以分摊于数个分配和/释放操作之中。本发明可以与先前描述的发明一起使用,例如参照图8和9描述的方法或者存储管理方法Ⅰ、Ⅱ和Ⅲ。如果与存储管理方法Ⅱ和Ⅲ一起使用,则尾区的检查点操作可与空表的检查点操作合并。例如,假设一个MFLF系统需要对尾指针和空表指针进行检查点操作。盘上的尾指针在存储时可以与空表指针邻近。以此方式,可以使用单个写块操作或少量写块操作而不需盘头移动来对尾指针和空表进行检查点操作。如果发生系统故障,则存于盘上的尾指针可能不是当今值。框1815试图在故障后校正尾指针。设t为尾指针的存储值。系统检查对应于在t处开始的块的首部中的代码字节。如果这些代码字节标示t对应于一块,则根据首部来确定块尺寸s。将尾指针增量至t+s,再使该过程一直继续,直至检查到标示存储区不对应于一块的代码字节。更新的尾指针然后存于盘上。在一个阐述性例子中,假设使用存储管理方法Ⅱ。尺寸和指针首部两者都可用作代码字节。在框1815中对有效代码字节的测试可能包括证实尺寸字节存储了合法尺寸及指针指向属于合适的尺寸类的块。图18实施一个概率恢复算法。有可能在框1815中将尾指针不必要地向前移。通过合适地使用代码字节,此概率可以减至任意低的值。在最坏情况下,可能会损失某些尾存储区,但已分配的存储区不会被错误地释放。有可能将图18的方法与若干个使用类似尾区的数据结构的不同DSA例如MFLF算法一起使用。并不是始终必须使用框1825来将块释放至尾区。例如,MFLF算法可能不会正常地尝试将最近释放的块加至尾区。相反,MFLF算法可能会将释放的块加至空表。在汇并时可能将存储区加至尾区。参照图19,发明者把使用存储管理方法Ⅰ的MFLFⅢ与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月ArunIyengar,MassachusettsInstituteofTechnologyLaboratoryforComputerScience的TR-560(博士论文)“多处理器上的动态存储分配”;及2)1996年10月在ProceedingsofIEEEFrontiers′96上ArunIyengar的“动态存储分配算法的可改变规模性”。已经描述了用于持久和稳固存储分配的系统和方法的优选实施例(它们只是阐述性而不是限制性的)之后,注意到,熟悉技术的人可以考虑到以上原理而作出修改和变动。因此应该理解,可以在由所附权利要求书所规定的范围和实质之内对本发明的具体实施例作出改变。已经按照专利法所要求的细节和具体性描述了本发明,在所附权利要求书中将提出权利要求和希望得到保护的内容。权利要求1.一种在包括主存储器和至少一个盘存储设备在内的存储系统中用于管理持久存储器的方法,包括以下步骤在持久存储器中为多块保持首部,其中每块的首部包括该块的块尺寸和分配状态;在主存储器内保持至少一个数据结构,用于分配和释放持久存储器;通过以下步骤分配第一存储块通过在主存储器内采用该至少一个数据结构来标识第一存储块;修改主存储器内的该至少一个数据结构以及为持久存储器内的块赋予一个分配状态;通过为第二存储块在持久存储器内赋予一个分配状态而释放第二存储块;及在主存储器内修改至少一个数据结构。2.权利要求1中所述方法,还包括在系统根据持久存储器的多个首部重新启动后确定主存储器内的至少一个数据结构的步骤。3.权利要求2中所述方法,其中在系统重新启动后确定主存储器内的至少一个数据结构的步骤包括持久存储器的至少一个盘访问操作,其中单个盘访问操作读入多个字节。4.权利要求1中所述方法,还包括以下步骤在系统关机之前自主存储器的至少一个数据结构中输出信息至持久存储器中;及在系统根据输出的信息重新启动之后确定主存储器中的至少一个数据结构。5.权利要求1中所述方法,其中在持久存储器中保持首部的步骤包括提供存于持久存储器的连续区内的多个首部。6.权利要求1中所述方法,其中在持久存储器中保持首部的步骤包括保持具有一个指向持久存储器内的一个位置的指针域的首部。7.权利要求6中所述方法,还包括以下步骤使用各首部内的指针域来保持持久存储器内的块表;及在主存储器内保持至少一个指向块表表首的当今指针。8.权利要求7中所述方法,还包括以下步骤在持久存储器内建立一个新块;在持久存储器内为新块设置一个指向主存储器内至少一个当今指针p的值的指针域;及将p设置为指向新块。9.权利要求8中所述方法,其中使用单个写块操作将新块首部初始化。10.权利要求7中所述方法,还包括以下步骤周期地将持久存储器内至少一个表首更新为对应于来自主存储器内至少一个当今指针的表。11.权利要求10中所述方法,其中该表包括多个表和这些表包括对应于连续地保持于持久存储器内的多个表的表首,及该方法还包括在单个写块操作中更新这些表首的步骤。12.权利要求1中所述方法,其中第一存储块和第二存储块包括相同块。13.一种可由机器读取的程序存储设备,其中明确地实施可由机器执行以便用于管理包括主存储器和至少一个盘存储设备在内的存储系统中持久存储器的方法步骤的程序指令,该方法包括以下步骤在持久存储器中为多个块保持首部,其中每块的首部包括该块的块尺寸和分配状态;在主存储器内保持至少一个数据结构,用于分配和释放持久存储器;通过以下步骤分配第一存储块通过在主存储器内采用该至少一个数据结构来标识第一存储块;修改主存储器内的至少一个数据结构及为持久存储器内的该块赋予一个分配状态;通过在持久存储器内为第二存储块赋予一个分配状态而释放第二存储块;及修改主存储器内至少一个数据结构。14.权利要求13中所述程序存储设备,还包括根据持久存储器内的多个首部将系统重新启动之后确定主存储器内的至少一个数据结构的步骤。15.权利要求14中所述程序存储设备,其中在系统重新启动后确定主存储器内该至少一个数据结构的步骤包括持久存储器内的访问盘操作,其中单个访问盘操作读入多个字节。16.权利要求13中所述程序存储设备,还包括以下步骤在系统关机之前自主存储器的至少一个数据结构中输出信息至持久存储器中;及在系统根据输出的信息重新启动之后确定主存储器中的至少一个数据结构。17.权利要求13中所述程序存储设备,其中在持久存储器内保持首部的步骤包括提供在持久存储器的连续区内存储的多个首部的步骤。18.权利要求13中所述程序存储设备,其中在持久存储器内保持首部的步骤包括一个具有指向持久存储器内一个位置的指针域的首部。19.权利要求18中所述程序存储设备,还包括以下步骤使用各首部内的指针域来保持持久存储器内的块表;及在主存储器内保持至少一个指向块表表首的当今指针。20.权利要求19中所述程序存储设备,还包括以下步骤在持久存储器内建立一个新块;在持久存储器内为新块设置一个指向主存储器内至少一个当今指针p的值的指针域;及将p设置为指向新块。21.权利要求20中所述程序存储设备,其中使用单个写块操作将新块首部初始化。22.权利要求19中所述程序存储设备,还包括以下步骤周期地将持久存储器内至少一个表首更新为对应于来自主存储器内至少一个当今指针的表。23.权利要求22中所述程序存储设备,其中该表包括多个表和对应于连续地保持于持久存储器内的多个表的各表首,及还包括在单个写块操作中更新这些表首的步骤。24.权利要求13中所述程序存储设备,其中第一存储块和第二存储块包括相同块。25.一种在包括主存储器和至少一个盘存储设备在内的存储系统中用于管理持久存储器的方法,包括以下步骤在持久存储器中为多个块保持首部,其中每块的首部包括该块的块尺寸、分配状态以及一个指针;在主存储器内保持至少一个数据结构,用于分配和释放至持久存储器;将多块中的第一存储块进行分配。分配步骤包括以下步骤通过在主存储器内使用该至少一个数据结构来标识第一存储块;修改主存储器内的至少一个数据结构以及为持久存储器内的第一存储块赋予一个分配状态;通过在持久存储器内为第二存储块赋予一个分配状态而释放多块中的第二存储块;为第二存储块更新盘上的指针域;及在主存储器内修改至少一个数据结构。26.权利要求25中所述方法,还包括以下步骤使用各首部内的指针域来保持持久存储器内的块表;及在主存储器内保持至少一个指向块表表首的当今指针。27.权利要求26中所述方法,还包括以下步骤响应于故障而检查块表以便移去已分配块。28.权利要求27中所述方法,还包括当找到块表上的空块时结束检查步骤的步骤。29.权利要求26中所述方法,其中主存储器内至少一个数据结构包括对应于持久存储器内块表的至少一个空块表。30.权利要求26中所述方法,还包括以下步骤周期地将持久存储器内至少一个表首更新为对应于来自主存储器内至少一个当今指针的块表。31.权利要求30中所述方法,其中该块表包括多个表和连续地保持于持久存储器内的多个首部,及还包括在单个写块操作中更新这些表首的步骤。32.权利要求25中所述方法,其中更新指针域的步骤包括将指针域中的指针设置为指向主存储器内空块的至少一个表L的表首的步骤,以及释放步骤还包括将第二存储块加至主存储器内L的表首的步骤。33.权利要求25中所述方法,其中使用单个写块操作将第二存储块的首部更新。34.权利要求25中所述方法,还包括根据持久存储器内的多个首部将系统重新启动后确定主存储器内的至少一个数据结构的步骤。35.权利要求34中所述方法,其中在系统重新启动后确定主存储器内该至少一个数据结构的步骤包括访问盘操作,其中单个访问盘操作读入多个字节。36.权利要求25中所述方法,还包括以下步骤在系统关机之前自主存储器的至少一个数据结构中输出信息至持久存储器中;及在系统根据输出的信息重新启动之后确定主存储器中的至少一个数据结构。37.权利要求25中所述方法,还包括在持久存储器的连续区内存储多个首部的步骤。38.权利要求25中所述方法,其中第一存储块和第二存储块包括相同块。39.一种可由机器读取的程序存储设备,其中明确地实施可由机器执行以便完成方法步骤来管理包括主存储器和至少一个盘存储设备在内的存储系统中持久存储器的程序指令,该方法包括以下步骤在持久存储器中为多个块保持首部,其中每块的首部包括该块的块尺寸、分配状态和一个指针;在主存储器内保持至少一个数据结构,用于分配和释放至持久存储器;通过以下步骤分配第一存储块通过在主存储器内使用该至少一个数据结构来标识第一存储块;修改主存储器内的至少一个数据结构及为持久存储器内的第一存储块赋予分配状态;通过在持久存储器内为第二存储块赋予一个分配状态而释放多块中的第二存储块;为第二存储块更新盘上指针域;及修改主存储器内至少一个数据结构。40.权利要求39中所述程序存储设备,还包括以下步骤使用各首部内的指针域来保持持久存储器内的块表;及在主存储器内保持至少一个指向块表表首的当今指针。41.权利要求40中所述程序存储设备,还包括响应于故障而检查块表以便移去已分配块。42.权利要求41中所述程序存储设备,还包括当找到块表上的空块时结束检查步骤的步骤。43.权利要求40中所述程序存储设备,其中主存储器内至少一个数据结构包括对应于持久存储器内块表的至少一个空块表。44.权利要求40中所述程序存储设备,还包括以下步骤周期地将持久存储器内至少一个表首更新为对应于来自主存储器内至少一个当今指针的块表。45.权利要求44中所述程序存储设备,其中该块表包括多个表和连续地保持于持久存储器内的多个首部,及还包括在单个写块操作中更新这些表首的步骤。46.权利要求39中所述程序存储设备,其中更新指针域的步骤包括将指针域中的指针设置为指向主存储器内空块的至少一个表L的表首的步骤,以及释放步骤还包括将第二存储块加至主存储器内L的表首的步骤。47.权利要求39中所述程序存储设备,其中使用单个写块操作将第二存储块的首部更新。48.权利要求39中所述程序存储设备,还包括根据持久存储器内的多个首部将系统重新启动后确定主存储器内的至少一个数据结构的步骤。49.权利要求48中所述程序存储设备,其中在系统重新启动后确定主存储器内该至少一个数据结构的步骤包括访问盘操作,其中单个访问盘操作读入多个字节。50.权利要求39中所述程序存储设备,还包括以下步骤在系统关机之前自主存储器的至少一个数据结构中输出信息至持久存储器中;及在根据输出的信息重新启动系统之后确定主存储器中的至少一个数据结构。51.权利要求39中所述程序存储设备,还包括在持久存储器的连续区内存储多个首部的步骤。52.权利要求39中所述程序存储设备,其中第一存储块和第二存储块包括相同块。53.一种用于管理持久存储系统中存储器的方法,包括以下步骤在主存储器内保持至少一个数据结构,用于分配和释放持久存储器;完全自至少一个数据结构中分配和释放持久存储器而不访问或写至持久存储器;周期地对存储分配信息进行检查点操作并且送至持久存储器;及在根据检查点操作的信息重新启动之后在主存储器内确定至少一个数据结构。54.一种可由机器读取的程序存储设备,其中明确地实施可由机器执行以便完成如权利要求53中所述方法步骤的程序指令。55.一种用于管理持久存储系统中存储器的方法,包括以下步骤在主存储器内保持至少一个数据结构,用于分配和释放持久存储器;完全自至少一个数据结构中分配和释放持久存储器而不访问或写至持久存储器;在系统关机之前自主存储器的至少一个数据结构中输出信息至持久存储器中;及在系统根据所述输出信息重新启动之后确定主存储器中的至少一个数据结构。56.一种可由机器读取的程序存储设备,其中明确地实施可由机器执行以便完成如权利要求55中所述方法步骤的程序指令。全文摘要一种根据本发明的用于管理包括主存储器和至少一个盘存储设备在内的存储系统中持久存储器的方法包括以下步骤:在持久存储器中为多个块保持首部,其中每块的首部包括该块的块尺寸和分配状态,以及在主存储器内保持至少一个数据结构,用于分配和释放持久存储器。使用以下步骤分配存储块:通过在主存储器内采用至少一个数据结构来标识存储块,修改主存储器内的至少一个数据结构以及为盘上的块赋予一个分配状态。在盘上为该块赋予一个分配状态及在主存储器内修改至少一个数据结构来释放存储块。文档编号G06F12/02GK1309353SQ01104510公开日2001年8月22日申请日期2001年2月14日优先权日2000年2月15日发明者詹姆斯·R.H.·查林杰,阿鲁·K·利恩格尔申请人:国际商业机器公司