管理链接表数据结构的方法和装置的制作方法

文档序号:6415555阅读:164来源:国知局
专利名称:管理链接表数据结构的方法和装置的制作方法
技术领域
本发明总体涉及计算机软件程序领域,更具体地说,本发明涉及一种对由计算机程序保持和访问的链接表数据结构进行管理的方法。
链接表数据结构存储数据元素的序列,具有快速地对这种序列进行增、删数据元素的功能。链接表数据结构的特点在于,它的每个数据元素都包括一个指向链接表中下一个顺序排列的元素的指针。因此应当明白,向链接表数据结构增加一个元素或者从中删除一个元素都要求修改与该元素直接相邻的前一个元素的指针内容,以反映链接表数据结构的变化。
多线程程序包括许多线程,其中的许多线程可能要求访问某特定的链接表数据结构。这种线程对链接表数据结构既可能进行非改变性操作例如GET(获取),也可能进行改变性操作例如ADD(增加)。为了防止许多线程同时访问一个对象,诸如链接表数据结构,通常的做法是让这类线程执行所谓的“同步化”方法(method),对目标对象进行锁定,这样就能防止任何其它方法在目标对象被活动方法释放之前访问到目标对象。
如果目标对象是链接表数据结构,一般来说整个数据结构都要被同步化方法锁定,直到方法完成。这样就能禁止不同线程同时访问一个链接表数据结构。
根据本发明的第一个方面,提供一种管理链接表数据结构的方法。链接表数据结构包括由数据部分和指针部分组成的第一个元素。该方法要求通过插入或删除第二个元素来修改链接表数据结构。然后更新第一个元素的指针部分,以反映对链接表数据结构的修改。对第一个元素的指针部分的更新包含一个原子操作。与对链接表数据结构修改的同时执行的,是对链接表数据结构的非同步遍历。在一个实施例中,遍历操作是一种非修改性操作,包含一个数据读和/或检索操作。
根据本发明的第二个方面,提供一种计算机可读介质,其上存储的指令序列被处理器执行时,使处理器执行如上所述的该方法的诸步骤。
根据本发明的第三个方面,提供一种面向对象的编程环境中的链接表对象。该对象包括一种链接表数据结构和一种通过插入或删除第一个元素来修改链接表数据结构的修改方法。该对象还包括一种为了反映修改方法对链接表数据结构的修改而对第二个元素的指针部分进行更新的更新方法。该更新方法执行的更新步骤中包含一个原子操作。该对象还包括一种遍历方法,在通过修改方法对链接表数据结构修改的同时,执行对链接表数据结构的非同步遍历。遍历可作为原子操作对第一个元素的指针部分进行检查。
阅读下文中的附图、详细说明和权利要求,本发明的其它特点也显而易见。
本发明是通过举例说明的,并不局限于附图中的各图示。附图中用类似的参照号来标示一些成分,其中

图1是表示在面向对象的程序环境中运行的多线程程序的框图。
图2是链接表数据结构的图解表示。
图3a和3b的示意图分别表示对图2的链接表数据结构进行的元素插入和删除操作。
图4是一种按照本发明管理链接表数据结构的方法的流程图。
图5是表示一种散列表的结构的框图。
图6是表示按照本发明的一个实施例构造的一系列散列表对象的框图。
图7是表示一个计算机系统的框图,该系统包括一种计算机可读介质,其上存储的指令序列被处理器执行时,使处理器执行按照本发明一个实施例的管理链接表数据结构的方法。
现在说明一种计算机实现的管理链接表数据结构的方法。为了解释的需要,以下说明中陈述了许多具体细节,目的是透彻地阐明本发明。不过本领域的熟练人员显然清楚,没有这些具体细节,本发明也可以实施。特别是,尽管下文描述的一个示范实施例是用一种面向对象的编程语言实现的,但是本发明并不受这种或任何其它类型的编程语言的限制。
参见图1,图中显示的用一种面向对象的编程语言设计的多线程程序(10)的框图,该编程语言例如是美国加州Mountain View的Sun Mircosystems公司开发的JavaTM程序设计语言。如图所示,程序10保持着一个线程队列12,包括14b、14c和14d,它们都要求访问对象16。图中示出线程14a正在访问对象16。多线程程序10的特点在于每个线程14共享数据,因此可以访问相同的数据和变量,这些数据和变量则可以包容在诸如对象16的某个对象中。例如,采用JavaTM程序设计语言,Java虚拟机(JVM)任何时刻都可以支持多个执行线程。这些线程中每一个都独立地执行对在共享内存中存储的值和对象进行操作的Java程序码。支持多线程的手段可以是,采用多个硬件处理器、对单一硬件处理器的时间分片、对多个硬件处理器的时间分片。
活动的线程14可以对其引用的任何对象进行访问。例如,线程14a~d中的每个线程都有一个指向对象16的索引。如果两个或更多的线程访问同一个对象时,可以想见,这些线程所执行的操作可能会相互冲突,导致有关对象的不可靠或者某个或多个线程的操作不正常。为了解决这个问题,通常的做法是规定多线程对共享对象进行“同步”访问。具体来说,“同步”一词指保证一个线程没有中断地完成对一个对象-无论变量还是数据-的操作的能力。信号量和mutexes可以用来实现同步。另一种替代方法是,可以通过采用“监控器”来获得线程访问之间的同步,其中监控器是这样的高级工具,它们只允许每次有一个线程执行由相关监控器保护的一部分代码。在JavaTM语言中,将能够封锁线程、并在其变得可用时再次通知被封锁线程的对象,称为监控器对象。例如参见图1,对象16就可以是个监控器对象,如果这样,当线程14a访问该对象时,它就封锁线程14b~c,当线程14a完成对对象16的访问时,它将通知线程队列12。由其它线程作出的对访问某对象的封锁这个操作,称为进行“锁定”(lock);由另一个线程作出的再次允许访问某对象这个操作,称为“解锁”(unlocked)操作。
应当理解,执行同步化方法(method)的线程存在着性能上的缺陷,因为任何时刻只允许由一个线程访问某个对象,某些并发操作会被禁止。
对象16内的包含的通常的数据结构类型是图2所示的链接表数据结构20。链接表数据结构20包含一个有序的元素序列22a~22n,这种结构有利于快速地向序列插入元素或从其删除元素。每个元素22包括数据项24和指向链接表数据结构20中下一个顺序元素22的指针26。数据结构20中的最后元素22n的指针内容为零,表示该表的结尾。
图3a和3b表示对链接表数据结构20的修改。具体来说,图3a表示将元素22(n+1)插入数据结构20中22(n)与22(n+2)之间。图3b类似地表示将元素22(n+1)从链接表数据结构20删除。首先参见图3a,能访问一个包括链接表数据结构20的对象的活动线程可能希望插入元素22(n+1)。向链接表数据结构20插入(添加)这个元素要求与元素22(n+1)要插入位置直接相邻的前一个元素22(n)的指针内容,由原来指向顺序元素22(n+2)更新为指向新近插入的元素22(n+1)。元素22(n)的指针的更新由箭头28表示。元素22(n+1)的指针也必须设置为指向元素22(n+2)。
在本发明的一个实施例中,每个指针26含有一个32位地址。如果假设两个线程会同时访问链接表数据结构20,显然需要在程序中进行同步。具体来说,假设第一个线程插入元素22(n+1),将元素22(n)的指针26内容更新为指向元素22(n+1)。与此同时,第二个线程可能正在通过检查由指针规定的数据路径执行对数据结构20的遍历操作。具体来说,第二个线程可能正在遍历数据结构20,目的是检索某预定数据项24。由于第二个线程要依靠每个元素的指针来指引其向序列中下一个元素的搜索,所以不难理解,对部分改变了的指针的读操作,会对第二个线程对数据结构20的遍历产生严重错误。为了防止发生上述情况,通常做法是对访问链接表数据结构20的对象的方法(methods of objects)进行同步,以便任意时刻只有一个线程或方法能访问数据结构20。具体来说,可以利用同步来锁定引用链接表数据结构的数据结构,诸如散列表,或者直接锁定链接表数据结构20本身。然而应当明白,每次只允许一个线程访问链接表数据结构并不能达到最佳效能。为了理解本发明的重要性,首先必须考察在链接表数据结构20上的三种可能操作,它们是1.插入(添加)操作。如图3a所示,该操作将元素添加到链接表数据结构20。
2.移出(删除)操作。如图3b所示,该操作从链接表数据结构20删除元素。
3.遍历操作。该操作检查链接表数据结构20内元素的内容,目的是确定其中是否存在某数据项和/或可能提取这个数据项。
遍历操作与插入和删除操作的不同在于它不会改变数据结构20。本发明提出的方法中,对链接表数据结构20的非改变性遍历是与其它遍历操作以及与修改操作不同步的。采用非同步遍历操作的优点在于修改和遍历操作可以同时进行,并且可以同时对链接表数据结构20进行许多非同步的遍历操作。这样,在有多个线程主要对链接表数据结构20进行遍历操作的程序中,就能由大量的这种线程同时地访问数据结构20。通过规定由线程对元素22的指针26的原子读写操作,方便了非同步遍历操作的实现。具体来说,原子操作是功能上不能分割的操作,因此是有完成保证的操作。现在具体参照图3a和3b来说明本发明的方法。图3a所示的插入方法是(与其它同步方法)同步的,主要包含如下步骤1.检查要插入的元素是否在链接表数据结构20中已经存在。如果是,则插入操作中止。
2.在一个原子操作中,将被插入元素22(n+1)的指针更新为指向下一个顺序元素22(n+2)。此步骤完成时,两个元素22(n)和22(n+1)的指针都指向元素22(n+2)。
3.在一个原子操作中,将元素22(n)的指针更新为指向被插入元素22(n+1)。
与此类似,从链接表数据结构20删除元素22的同步方法主要包含如下步骤
1.执行检查操作,确定链接表中是否确实存在有关数据项;2.在一个原子操作中,元素22(n)的指针更新为指向元素22(n+2)。
应当注意的是在上述执行的操作中,对元素22的指针26的修改操作包含原子操作。因此就能保障在插入或删除操作期间任何对链接表数据结构20进行的遍历操作的方法都能检查有效的数据路径。正是这种对有效数据路径的保障,便利了采用非同步遍历操作的方法对链接表数据结构20的访问。然而,在一个实施例中,要理解的是仍然需要同步的修改操作来防止这些修改操作之间的冲突。这样,采用非同步遍历操作的方法就能允许包含这些非同步遍历方法的多个线程同时访问单一的链接表数据结构20,从而优化了计算机程序的性能。
本发明进一步特别适合应用于能够实现所谓的“标记与清除无用存储单元收集”(mark and sweep garbage collection)的程序设计语言。具体来说,这种标记与清除无用存储单元收集技术,不要求采用引用计数器机制来保持对某特定对象的引用的跟踪。采用引用计数的无用存储单元收集收集方案,要求用同步操作,并会因此限制用本发明方法执行同步无用存储单元收集操作而取得的性能优点。
现在参见图4,图中表示了一种按照本发明管理含有许多元素22的链接表数据结构的方法30。该方法从步骤32开始后,并行地执行两组操作。具体来说,方法30允许第一个线程在步骤34通过插入或删除元素22来修改链接表数据结构20。然后,方法30继续到步骤36,原子地修改数据结构20中有关元素22的指针,以反映步骤34所作的修改。在本发明的一个实施例中,用于对指针26进行原子修改操作和读取操作的程序设计语言是JavaTM程序设计语言。在执行步骤34和36的同时,本发明的方法30允许在步骤38同时执行任意次数的对链接表数据结构20的非同步遍历操作。
图5表示一种散列表40,该表中有许多项或散列表元,每个散列表元分别指向一个链接表数据结构20。在散列表数据结构中,作为对象的数据项(例如雇员纪录)是用键字来标识的。例如,链接表数据结构20a的第一个元素22的数据项是由键字“AAA”标识的。散列表40由键字计算出一个整数值,称为散列码。因此由示例中的键字“AAA”生成的散列码为零(0)。因此用散列表40便于生成紧凑的阵列索引。所含键字生成了相同散列码的数据项被视为包容在同一个散列表元中,并且可能包含诸如图5所示的任一种链接表数据结构20。本发明可用于管理散列表40所引用的链接表数据结构20。
图6表示根据本发明的一系列对象50,它们包含类52的对象。图中的每个对象50都包含一个指向许多链接表数据结构20的散列表数据结构40。每个对象进一步包括三个非同步遍历方法,即“CONTAINS”(包含)方法60、“CONTAINS KEY”(包含键字)方法62和“GET”(读取)方法64。“CONTAINS”方法60测试线程提供的键字是否与散列表数据结构40中的特定值匹配。“CONTAINSKEY”方法62测试特定对象是否是散列表数据结构40中的键字,而“GET”方法64向其键字在散列表数据结构40有匹配值的线程返回一个数据项。每个对象进一步包括一个同步“PUT”(插入)方法66,它负责按照上文所述方法向链接表数据结构20插入元素22。每个对象50还包括一个同步“REMOVE”(删除)方法68,它负责按照上文所述方法从链接表数据结构20删除元素22。当然应当明白,上述的对象50仅仅是示例性的,本发明原理可以运用到任意数量、种类各异的结构中。
现在参见图7,图中的计算机系统70包括处理器72、静态存储器74和主存储器76。处理器72与存储器74及76通过总线78互相通讯,并与许多外围设备通讯。外围设备包括视频显示器80(诸如阴极射线管CRT或液晶显示器LCD)、字母数字输入设备82(诸如键盘)、光标控制设备84(诸如鼠标器)、驱动单元86及其容纳的计算机可读介质88、信号发生设备90(例如一对扬声器)、网络接口设备94。本发明中的“计算机可读介质”一词系指可容纳在驱动器单元86的磁性存储介质、主存储器76、静态存储器74、处理器72或任何能从其中读取数据用于处理器72执行的其它介质。散列表对象92中包含诸如上文讨论的方法,如图所述,散列表对象92全部或部分地驻留在计算机可读介质88、主存储器76或处理器72本身中。散列表对象92包括一个指令序列,该指令序列被处理器72执行时,使处理器72至少执行上文介绍图4时所述的步骤。
网络接口设备94可以是调制解调器、网络适配器卡或其它任何将计算机系统70与计算机网络连接的设备。网络接口设备94可用于生成或接收所编码的计算机数据信号的载波。计算机数据信号可被翻译后生成执行时实现本发明的程序码。
本文至此描述了一种管理链接表数据结构的方法。尽管本发明是结合具体的示范性实施例说明的,显然,在不偏离本发明的精神和范围的情况下能对这些实施例作出各种修改和改进。所以本说明书和各附图应视为是示例性的而不是限制性的。
权利要求
1.一种计算机实现的管理链接表数据结构的方法,其中,链接表数据结构包括由数据部分和指针部分组成的第一个元素,该方法包括下列步骤修改链接表数据结构;更新第一个元素的指针部分以反映对链接表数据结构的修改,更新步骤包含一个原子操作;在对链接表数据结构修改的同时,执行对链接表数据结构的非同步遍历。
2.权利要求1的计算机实现的方法,包括同时执行多个对链接表数据结构的非同步遍历的步骤。
3.权利要求1的计算机实现的方法,其中,修改链接表数据结构的步骤包括向链接表数据结构添加第二个元素,其中的原子操作包括将第一个元素的指针部分修改为指向第二个元素。
4.权利要求1的计算机实现的方法,其中的原子修改操作包括将第一个元素的指针部分修改为指向第三个元素。
5.权利要求1的计算机实现的方法,其中,修改链接表数据结构的步骤包括从链接表数据结构删除第二个元素,其中的原子操作包括将第一个元素的指针部分从指向第二个元素修改为指向第三个元素。
6.权利要求1的计算机实现的方法,包括在修改和更新操作的同时对链接表数据结构执行标记与清除无用存储单元收集操作的步骤。
7.权利要求1的计算机实现的方法,其中,修改链接表数据结构的步骤是一个同步操作。
8.权利要求1的计算机实现的方法,其中,非同步遍历包含提取链接表数据结构内某元素的数据部分的提取操作。
9.在一种面向对象的编程环境中的链接表对象,包括一个包括多个元素的链接表数据结构,其中每个元素各自都有数据部分和指针部分;一种通过插入或删除第一个元素来修改链接表数据结构的修改方法;一种为反映对链接表数据结构的修改而用原子修改操作更新第二个元素的指针部分的更新方法;一种在用修改方法对链接表数据结构修改的同时,执行对链接表数据结构的非同步遍历的遍历方法。
10.一种计算机可读介质,其上存储的指令序列被处理器执行时,使处理器执行以下步骤通过插入或删除第二个元素,修改含有由数据部分和指针部分组成的第一个元素的链接表数据结构;更新第一个元素的指针部分,以反映对链接表数据结构的修改,更新步骤包含一个原子操作;在对链接表数据结构修改的同时,执行对链接表数据结构的非同步遍历。
11.权利要求10的计算机可读介质,其存储的指令序列使处理器在对链接表数据结构修改的同时,执行多个对链接表数据结构的非同步遍历。
12.权利要求10的计算机可读介质,其存储的指令序列使处理器向链接表数据结构添加第二个元素,其中的原子操作包括将第一个元素的指针部分修改为指向第二个元素。
13.权利要求10的计算机可读介质,其中的原子操作包括将第一个元素的指针部分修改为指向第三个元素。
14.权利要求10的计算机可读介质,其存储的指令序列使处理器从链接表数据结构删除第二个元素,更新步骤包含原子地将第一个元素的指针部分从指向第一个元素修改为指向第三个元素的步骤。
15.权利要求10的计算机可读介质,包括在修改和更新操作的同时对链接表数据结构执行标记与清除无用存储单元收集的操作的步骤。
16.权利要求10的计算机可读介质,其中的修改链接表数据结构的步骤是同步操作。
17.一种计算机实现的管理链接表数据结构的方法,其中链接表数据结构一个由数据部分和指针部分组成的元素,该方法包括下列步骤对链接表数据结构执行第一种操作;在执行第一种操作的同时,执行对链接表数据结构的非同步遍历,其中非同步遍历包括执行对元素的指针部分的读操作,该读操作按原子操作执行。
18.权利要求17的计算机实现的方法,其中的第一种操作是对链接表数据结构的进一步非同步遍历。
19.权利要求17的计算机实现的方法,其中的第一种操作是对链接表数据结构的进一步同步修改。
20.一种计算机可读介质,其上存储的指令序列被处理器执行时,使处理器执行以下步骤对链接表数据结构执行第一种操作;在执行第一种操作的同时,执行对链接表数据结构的非同步遍历,其中非同步遍历包括执行对元素的指针部分的读操作,该读操作按原子操作执行。
21.权利要求20的计算机可读介质,其中的第一种操作是对链接表数据结构的非同步遍历。
22.权利要求20的计算机实现的方法,其中的第一种操作是对链接表数据结构的进一步同步修改。
23.一种体现为载波并代表一个指令序列的计算机数据信号,该指令序列被处理器执行时,使处理器执行以下步骤通过插入或删除第二个元素来修改链接表数据结构,其中链接表数据结构包括含有数据部分和指针部分的第一个元素;更新第一个元素的指针部分以反映对链接表数据结构的修改,更新步骤包含一个原子操作;在对链接表数据结构修改的同时,执行对链接表数据结构的非同步遍历。
24.一种体现为载波并代表一个指令序列的计算机数据信号,该指令序列被处理器执行时,使处理器执行以下步骤对包含一个由数据和指针部分组成的元素的链接表数据结构执行第一种操作;在执行第一种操作的同时,执行对链接表数据结构的非同步遍历,其中非同步遍历包括执行对元素的指针部分的读操作,该读操作按原子操作执行。
全文摘要
本文介绍一种管理链接表数据结构(20)的方法。链接表数据结构(20)有许多元素(22a、22b…22n),每个元素包括数据项(24a、24b… 24n)和顺序指向下一个元素的指针(26a、26b…26n)。该方法允许通过插入或从中删除元素来修改链接表数据结构(20),并允许同时执行对链接表数据结构(20)的非同步遍历操作。具体来说,该方法要求用原子操作(36)来修改链接表数据结构(20)内元素(24a、24b…24n)的指针(26a、26b…26n),以反映对链接表数据结构(20)的任何修改。采用原子操作(36)来更新指针(26a、26b…26n),能保障非同步遍历操作(38)检查的是有效的数据路径。
文档编号G06F9/46GK1236453SQ98801186
公开日1999年11月24日 申请日期1998年6月30日 优先权日1997年6月30日
发明者K·L·克鲁格 申请人:太阳微系统有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1