管理共享内存的方法 本发明涉及共享内存中数据的管理,该内存是计算机主存,其中众多进程同时执行。每个进程本身一般由众多基本任务组成,这些基本任务可能互相竞争对数据的存取以便读取它们或修改它们。这类管理方法由称为“数据管理程序”的软件所实施。一个计算机包括一个主存和一个海存,主存的容量有限但它的所有单元都可直接存取因此可很快地存取,而海存一般由具有很大容量的硬盘所组成,但它的存取慢得多,因它需选择道并等待道上所需单元移至面对读头的位置。常规情况下计算机操作系统只将给定时刻实际需要的数据装入主存,而装载是通过称为高速缓存的专用快速小型存储器实现的,依靠预测机制造成使硬盘存取加速的印象,该预测机制利用一般应用程序顺序地使用数据这一事实。常规数据管理程序考虑数据通过高速缓存这一事实从而得到优化。
半导体存储器技术所取得的进展有可能提供一个具有大得足够接收计算机中执行的所有进程所分享的所有数据的容量的主存,甚至可供处理大量数据的应用程序使用。于是硬盘保持主存内所有数据地更新复制内容而只用于将这些数据后备。将所有数据都装载入主存的做法对并非顺序地使用数据的应用程序特别有利,高速缓存对这类应用程序用处不大。这尤其适用于控制通信交换机的应用程序。因此需要设计用于管理全部装入主存的数据的优化的数据管理程序。
面向对象数据库内所用数据管理程序已知是关系数据库中所用数据管理程序。
有两种存取数据的类型:读取和写存。已知对于每一种存取类型有两种在数据管理程序和基本任务之间传送信息的传送模式:按值传送模式和按指针传送模式。
在读取或写存变量值时,按值传送模式包括在包含变量当前值的内存单元处读写或写变量值;而按指针传送模式包括将称为“指针”的地址提供给请求读或写的任务,该指针指明其中存有待读值的内存单元或其中准备写存值的内存单元,只要该任务拥有该指针,该任务随时都可在此单元中读或写。当任务按指针模式存取一个变量时,已知可为所述任务将称为“保持”的锁栓分配给包括所述变量当前值的内存单元,以便保持每个任务所用数据的一致性。只要不释放该保持,该保持是唯一具有存取所述变量当前值的权利者。
在面向对象数据管理程序中已知按指针传送模式。它所提供的优点是有可能快速存取。它允许数据作为编程语言的变量进行处理。但是对象数据管理程序的缺点或是不提供多任务事务(因此也就没有竞争),或是不提供对象的锁栓(任何竞争的结果是将负面锁住并将页面全部复制至记录区中。这种基粒度级别因而增大费用)。
使用按值传送模式时不必管理存取竞争。存取竞争是由数据库的数据管理程序应用的“事务性”协议管理的。
与众多变量相关的并由一个任务所请求的在同一请求中的一组读操作和/或写操作称为“事务”。在事务中,每个操作可用按值传送模式也可用按指针传送模式完成。任务事务可分为三个阶段:
—启动阶段,在此期间数据管理程序向启动事务的任务提供单个事务标识符,该标训符指明一个包含事务描述符的内存单元。
—存取阶段,在此期间由启动事务的任务执行读操作或写操作,但除此事务外用户看不到这些操作;及在此期间由实际事务调用的讨论中的内存单元上的读锁栓和写锁栓被分配给该事务。在一种已知存取方法中,当事务完成写存时,它临时地将新变量值输入称为“记录区”并分配给所述变量的事务的内存单元中。此记录区只能由所述事务存取。
—结束或验证阶段,在此期间对写和读进行验证。在上述已知方法中,新值(包含于分配给事务的记录区中)被输入至包含相应当前值的单元中,同时能被所有任务看见。待读值被实际上读取。
可将锁栓分配给包含变量当前值或新值的内存单元以阻止其它操作可能会危及数据一致性。锁栓可分配给整个数据表。有两类锁栓:
—分配给一个给定事务的给定内存单元的读锁栓是一个分配给事务的非唯一权利,授权所述事务读取存于该内存单元中的值和不让其它希望写入内存单元的事务得到验证。
—分配给一个给定事务的给定内存单元的写锁栓是一个分配给事务的唯一权利,授权所述事务也只有所述事务将值写入内存单元。
在一定系统中,当两个事务竞争对变量完成不同操作时,可分配优先级给变量以使一种操作类型(读或写)具有比其它类型高的优先级。请求较高优先级操作的事务称为所述变量的“优先”事务。
读锁栓或写锁栓可为可流产也可为不可流产:
—如它是可流产的,当一个与拥有可流产锁栓的事务竞争的事务具有高的优先级时,该锁栓被释放。拥有该锁栓的事务即被流产。
—如它是不可流产的,当一个与拥有可流产锁栓的事务竞争的事务具有高的优先级时,该锁栓不被释放。拥有该锁栓的事务不被流产。
当拥有可流产锁栓的事务得到验证时,该可流产锁栓进入不可流产状态。与此同时,进行竞争的事务的可流产锁栓被释放,同时该进行竞争的事务即被流产。
一定事务性协议有可能完成一个事务并同时保证称为“ACID”的四个特性:
—体性(由一个事务请求的存取或全部处理或一个都不处理);
—一致性(所有数据自一个稳态变为另一个稳态);
—隔离性(在事务结束之前,在事务外部看不见变量新值);
—持久性(一旦事务得到验证,变量新值能经受存放它们的站的故障,因为所述新值在盘上或处于工作状态中的另一站中有后备);以及
—串行性(如众多事务并行地发生,则它们的结果如同它们是连续地发生一样)。
专利申请FR2,727,222描述这样一个事务性协议。已知的数据管理程序保证“ACID”性质但具有不能提供按指针存取的缺点。因此现有技术提供不出完全满意的方法。
本发明一个目的是提供一种管理共享内存中数据的方法,它通过提供按指针存取而平均来说达成对数据的极快存取而尽管如此仍在事务完成期间保证“ACID”性质。
本发明提供一种管理共享内存中数据的方法,内存中包含的数据由不同进行竞争的过程所共享,每个过程一般由众多进行竞争的任务所组成;所述方法的特征在于:
●不在事务内部,
—对于每个待读变量,读操作包括分配一个称为“保持”的锁栓给待读变量,如先前并无其它保持分配给所述变量,则该保持阻止对所述变量的任何存取;如已有先前保持分配给所述变量,则等到先前保持被释放后,分配新保持给所述变量;以及或者包括向请求所述读操作的过程提供一个指明包含所述变量当前值的内存段的指针;或则包括提供变量当前值并以整体方式将它复制入属于请求所述读操作的任务的内存单元中;以及然后包括释放该保持;以及
—对于每个待写变量,写操作包括下列步骤:
--如已有保持分配给变量当前值,则等待该保持被释放;以及
--如没有或不再有保持分配给变量,则在需要写存变量时分配保持给该变量,以及:
---如有写锁栓,则释放该保持,等待该锁栓被释放,并将新的保持分配给该变量;以及
---如没有或不再有写锁栓,以及:
----如有读锁栓,及如请求所述读操作的任务的优先级高于任何写任务,则等待它被释放,或否则释放该读锁栓并使它所属的事务流产;以及
----如没有或不再有读锁栓,则分配一个不可流产的阻止任何写操作的写锁栓;以及
或者包括向请求所述读操作的任务提供一个指明一个包含变量当前值的内存段的指针;或则包括为每个待写变量提供一个新值,包括将新值复制入所述记录区,然后包括释放该不可流产写锁栓及最后包括释放所述保持;以及
●在事务内部,
—对每一个待读变量,读操作包括完成下列步骤:
--如没有为事务分配记录区给该变量;
---如有保持分配给变量,则等待该保持被释放;以及
---如没有或不再有保持分配给变量,则在需读变量时分配一个保持给该变量;
----如没有不可流产写锁栓分配给该变量,则分配一个可流产读锁栓给该变量;如读任务的优先级高于任何写任务则此可流产读锁栓阻止任何不在事务内部的写操作,否则所述可流产读锁栓被释放;以及
----如有写锁栓分配给该变量,则释放该保持并等待不可流产写锁栓被释放,及然后重复前面的操作;以及
或者包括向请求所述读操作的任务提供每个待读变量的指针,该指针指明包含变量值的记录区;或包括提供变量值和包括以整体方式将它复制入属于请求所述读操作的过程的内存段中;及然后释放该保持;
--如已为此事务分配记录区给变量:
---如有保持分配给该变量,则等待该保持被释放;以及
---如没有或不再有保持分配给该变量,则在需读所述变量时分配一个保持给该变量;以及
或者包括向请求所述读操作的任务提供待读变量的指针,该指针指明包含所述变量值的内存段;或包括提供自记录区中读取的值和包括以整体方式将它复制入属于请求读操作的过程的内存段中;以及然后包括释放该保持;
—对于每个待写变量,写操作包括下列步骤:
--如没有供此事务用的记录区;
---如有保持分配给所述变量值,则等待保持被释放;及
---如没有或不再有保持分配给变量当前值,则在需写新值时分配一个保持给变量当前值,及然后:
----如有写锁栓,则释放该保持,等待写锁栓被释放,然后分配一个新保持;
----如没有或不再有写锁栓,则分配一个用于阻止其它任何写操作的可流产写锁栓,如事务被流产则将该锁栓释放;及分配一个记录区给该变量,然后分配一个保持给所述记录区;将变量当前值写入记录区;及释放先前分配给变量当前值的第一保持;以及
或者包括为每个待写变量提供一个指针,该指针指明记录区,或包括将新值复制入记录区中,然后包括释放该保持;
--如对于此事务存在一个记录区,则:
---如有保持分配给包含变量新值的记录区,则等待保持被释放;以及
---如没有或不再有保持分配给包含变量新值的记录区,则分配一个保持给所述的记录区;以及
或者包括提供一个指明记录区的指针;或包括为每个待写变量提供一个新值,及包括将新值复制入记录区中,然后包括释放该保持。
以此方式表现其特征的方法平均来说达成对数据的更快存取,因为有可能使用指针存取变量,而如可能使变量涉及众多任务,则允许管理竞争。当两个不同任务分别请求对同一变量进行读取和写存,或两个写存时,上面所给规则能解决出现的矛盾。
以此方式表现其特征的方法提供的优点是对存取提供整体性:如按指针存取则使用保持,或如按值存取使用读锁栓或写锁栓。
以此方式表现其特征的方法因而保证事务所需四个特性(整体性,一致性,隔离性和持久性),因为保持提供整体性,锁栓提供一致性,记录区提供隔离性,和用于验证每个值的修改的协议提供持久性。
参照附图所作对本发明数据管理程序例子的下列描述能使本发明更好地被理解和发现其它细节,附图中:
图1是不在事务内部读取时所涉及步骤的流程图;
图2是在事务内部读取时所涉及步骤的流程图;
图3是不在事务内部写存时所涉及步骤的流程图;以及
图4是在事务内部写存时所涉及步骤的流程图。
下面表格总结了在两个事务之间出现竞争时,根据本发明的可用规则:对于同一个变量,第一锁栓早已分配给第一事务,第二锁栓即将分配给第二事务;而该表格标志出第二锁栓的分配是可能的(是)或是被拒绝(否)。
表一 分配第二锁栓 的可能性 第一锁栓 读锁栓 可流产 读锁栓不可流产 写锁栓 可流产 写锁栓不可流产 第 二 锁 栓 读锁栓 可流产 是 是 是 否 读锁栓 不可流产 是 是 是 否 写锁栓 可流产 是 是 否 否 写锁栓 不可流产 否 否 否 否
在结束事务时,分配给第一事务的第一锁栓与分配给第二事务的第二锁栓之间的矛盾作为这两个事务的相应优先级的函数而加以解决,它们的优先级预先为每个变量确定。有两个明确的方法用于实施本方法,这决定于当可流产写锁栓转换为不可流产写锁栓时所设置的规则。
下列表格总结在实施本发明中转换第二锁栓的可能性。
表二 转换第二锁 栓的可能性 读锁栓 可流产 读锁栓 不可流产 写锁栓 可流产 第 二 锁 栓 读锁栓 可流产 → 不可流产 是 是 是 写锁栓 可流产 → 不可流产 —如优先级 给予写者: 则流产第一 锁栓及其事 务。 —如优先级 给予读者: 则转换不可 能。 不论优先级 如何: 转换不可能 不可能有此 情况
图1至4显示数据管理程序如何对应于本发明方法的这种实施进行操作。
图1显示不在事务内部读取时数据管理程序完成的一系列步骤1。当请求读取的任务在同一请求中并不请求任何其它存取时,不在事务内部完成按值或按指针读取变量。
首先,数据管理程序完成步骤10,其中测试确定是否有保持为此变量分配给一个任务:
—如存在保持,在步16中等待分配给该变量的保持被释放;以及
—如不存在或不再存在分配给所述变量的保持,在步11中分配一个保持给所述变量;由于此保持阻止其它任务的任何存取,它能保证数据不被其它任务修改;然后在步12中测试确定读取是否为按指针读取:
--如读取是按指针的,则在步15中向请求读操作的任务提供一个指明包含变量当前值的内存单元的指针;以及
--如读取不是按指针的,而是按值读取,则在步13中以整体方式将变量当前值复制入对于请求读取的任务是特定的内存单元中;以及最后在步14中释放由步11分配的保持。
图2是在事务内部读取时数据管理程序所完成步骤的流程图。当请求读取的任务在同一请求中也请求其它存取时,在事务内部完成按值或按指针读取变量。
首先步20中测试确定是否存在分配给该变量的用于暂时存放所述变量新值的记录区:
—如存在这一记录区,则数据管理程序完成与上面参照图1描述过的不在事务内部读取的一系列步骤1完全相同的一系列步骤1’;以及
—如不存在分配给该变量的记录区,步21中测试确定是否存在一个分配给变量当前值的保持;
--如有保持分配给变量当前值,则步30中等待保持被释放;以及
--如不存在或不再存在分配给所述变量当前值的保持,则步22中在需读取变量时分配一个保持给所述变量当前值;由于此保持阻止其它任务进行任何存取,它保证了操作的整体性;然后步23中测试确定是否存在分配给变量当前值的不可流产写锁栓:
---如有分配给变量当前值的不可流产写锁栓,则步29中释放该保持并等待该不可流产写锁栓被释放,因设置写锁栓与不可流产写锁栓的存在是不兼容的(见表一中左列),然后重新启动步21、22、23可能还有步30;以及
---如没有不可流产写锁栓,然而可能会有可流产写锁栓,及如请求读取的任务所具有优先级高于任何进行竞争的写任务,则步24中分配一个可流产读锁栓给变量当前值(如表一中所标明的,当早已存在可流产写锁栓时,有可能分配一个可流产或不可流产写锁栓);及步25中确定该读取是按指针读取还是按值读取:
----如它是按指针读取,则步28中向请求读操作的任务提供待读变量的指针,该指针指明包含所述变量当前值的内存单元;以及
----如它是按值读取,步26中提供变量当前值和以整体方式将它复制入对请求读操作的任务为特定的内存单元中;并最后释放该保持。
图3显示不在事务内部写操作时数据管理程序所完成的步骤。当请求写存的任务在同一请求中并不请求其它存取时,不在事务内部完成按值或按指针写变量。
步30中首先测试确定是否存在分配给变量的保持:
—如有保持,则步41中等待保持被释放,然后重新启动步30;以及
—如不存在或不再存在保持,则步31中分配一个保持给所述变量;然后步32中确定是否存在分配给所述变量的可流产或不可流写锁栓:
--如有写锁栓,则步40中释放由步31分配的保持,然后等待写锁栓被释放,同时重复步30、31、32可能还有41;以及
--如不存在或不再存在写锁栓,则在步33中确定是否有可流产或不可流产的读锁栓:
---如没有读锁栓,则步34中分配不可流产写锁栓给所述变量,该锁栓阻止其它任务的任何写或读操作;然后步35中确定该写存是按值写存还是按指针写存:
----如它是按值写存,则步36的一系列操作中将位于属于请求写操作的任务的内存单元中的新值复制入分配给变量的内存单元中,然后释放该写锁栓,然后再释放该保持;以及
----如该写存是按指针写存,则步37中向请求写操作的任务提供一个指明包含变量当前值的内存段的指针,该任务然后能将新值输入此单元中;以及
---如至少有一个读锁栓,步42中测试确定该锁栓是否可流产:
----如它是可流产读锁栓,即如至少有一个进行竞争的读任务,则步38中确定该至少一个进行竞争的读任务所具有的优先级是否高于任何其它读任务(应用位于表二的第二列中的规则):
-----如至少一个进行竞争的任务所具有的优先级高于任何写任务,则完成步40(撤消该保持并等待该读锁栓被释放);以及
-----如没有一个进行竞争的读任务具有优先级,则步39的一系列操作中释放分配给进行竞争的任务的每个可流产读锁栓,及将读锁栓所属的事务流产(遵照表二);然后完成步34(设置一个不可流产写锁栓);以及
----如该读锁栓不是可流产的,则完成步40。
图4是在事务内部写存时数据管理程序所完成步骤的流程图。当请求写操作的任务在同一请求中还请求其它存取时,在事务内部完成按值或按指针写存变量。
在第一步50中确定是否存在着分配给讨论中的变量的记录区,对于讨论中的写存事务:
—如不存在这类记录区,在步51中确定是否存在分配给变量当前值的保持:
--如不存在或不再存在保持,则步52中分配一个保持给变量当前值;此保持使该操作具备整体性;然后完成步53,步53中确定是否存在分配给该变量的写锁栓:
---如没有写锁栓,则在步54的一系列操作中向讨论中的事务的变量当前值分配一个可流产的写锁栓(如果讨论中的事务与其它事务相竞争)(表一的规则允许);然后分配一个记录区给此当前值,分配一个保持给记录区,该保持使复制变量当前值入记录区的操作整体化;再复制变量当前值入记录区;然后释放分配给当前值的保持;及最后在步55中确定写操作是按指针还是按值写操作:
----如它是按值写操作,则在步56的一系列操作中将变量新值复制入记录区,然后释放分配给记录区的保持;以及
----如它是按指针写操作,则在步57中向写任务提供指明记录区的指针,该指针允许将新值写入记录区;然后一旦事务得到验证后新值即被转送至当前值的内存单元中;以及
---如早已存在一个分配给变量当前值的可流产或不可流产的写锁栓,则步58中释放该保持和等待写锁栓被释放,及重新启动步51;以及
--如步51确定存在一个分配给变量当前值的保持,则步59中等待该保持被撤消,重新启动步51;以及
—如步50确定对于讨论中的事务存在着一个分配给变量的记录区,则在步61中确定是否存在分配给所述记录区的保持:
--如存在一个分配给所述记录区的保持,则步67中通过重复操作61等待保持被撤消;以及
--如不存在分配给所述记录区的保持,则步62中分配一个保持给记录区,该保持阻止对记录区的任务存取;然后在步63中确定写操作是按指针还是按值;
---如它是按值写操作,则在步64的一系列操作中提供新值给变量,将新值复制入记录区,然后释放该保持;以及
---如它是按指针写操作,则在步66中向写任务提供一个指明记录区的指针以便所述任务能在其中写入新值。