Jasmine KBMS系统的实现
2024-07-21 02:08:49
供稿:网友
本文来源于网页设计爱好者web开发社区http://www.html.org.cn收集整理,欢迎访问。
jasmine 系统的实现
用户
数据管理
对象管理
应用软件
知识库
1、jasmine系统的总体结构
jasmine是个由数据管理子系统和对象管理子系统组成的层次结构系统。数据管理系统用来有效的存储和访问辅存上的对象。数据管理系统为嵌套关系、元组和页提供操作接口,它是关系数据库的扩展xrdb。而
对象管理系统为这个可扩展的数
据库系统提供对象模型和语言接
口,语言接口包括语言编译器、
执行期支持库、语言解释器。
我这所要介绍的是对象管理
子系统。
2、对象存储结构
在jasmine中类与实例的存储结构
不相同,对象到关系的转换是通过系统
完成的,有关转换的信息也存储在类中。
(1)、通过利用关系来存储实例
根据元组的实例和域的属性,所有参照类自身的实例存储在关系中。多值属性存储在多值域中,这是最简单的嵌套关系的形式。另一种方法,通过分离关系实现多值属性将引起额外的开销。我们在分离关系中存储一个超类自身的实例和超类的子类的实例。如果我们实例化或释放一个类的自身的实例,我们不必到它的超类或子类中去修改任何地方,从而使我们可以有效率地修改对象。
固定长度的字符串和数字存储在固长域中,变长字符串和数字存储在变长域中。而就参考属性,我们仅将对象标志号(oid)存储在固长域中,这实现了非簇聚化的复杂对象。非簇聚化的复杂对象是cad应用软件所需要的,在cad应用软件中复杂对象是自底向上创建的,这样组件对象就可以被重用。当然,用户可以逻辑上对非簇聚化的复杂对象强制实行复杂对象的完整性。具体实现可以通过“after” demon 为整个对象的实例化方法来实例化各个组件对象,也可以增加”befor” demon为整体对象的销毁方法来销毁各组件对象。在属性中,作为关系对象,我们充分使用嵌套关系,将关系对象与内部嵌套关系和他们内部关系域的属性相关联。相应的,关系对象的组件对象不可能脱离他们的整体对象而存在。簇聚化复杂对象通过关系对象来实现,能逻辑上和物理上以单元形式来管理。
oid属性与一个域相关联,但这个类的属性和通用属性不被存储在实例关系中,这是为了增加空间的效率。一个oid由一个知识库id号、一个类号和一个实例id号组成,oid能独自地直接传递给知识库和类信息。根据用户说明,系统在队列、b树和哈希关系中选择用来存储实例。
(2)、用关系来存储类
因为class是class的实例,我们将所有的classes存储在一个关系中,这样有助于有效地访问类对象。然而,类有异种结构,所以我们必须设计一个模式,用来在一个关系中有效地存储类对象。根本上,我们有类对象与一个元组(tuple)相关联。属性分类,如枚举和过程属性,这对所有类是通用的,并且属性有一组固定的侧面(facet),我们在内部关系域中在不同的内部关系和facet中存储枚举和过程属性。
3、面向集合的访问支持
面向集合访问和单值访问都被编译以早绑定并减少执行期费用,然而,一个交互式查询需要解释器来处理而不是编译器。jasmine编译器是用一个c编译器来实现的,在jasmine/c中写的应用程序被预编译成c 程序,产生的c 程序被编译并链接上执行期支持库。预处理被用来达到最优轻便性和c 编译器的代码优化目的。
应用软件
预编译
c 程序
c编译器和链接
执行期支持库
目标代码
(编译)
jasmine
目标代码
知识库
jasmine
用户查询
知识库
(执行) (解释器)
应用程序在三个阶段被翻译成c程序,这三个阶段是:查询图生成、存取方案生成和代码生成。第一个阶段,从用户查询到生成一个查询图,并且将查询图转化为根据使用用户定义的对象模型的一个更有效的查询图。第二个阶段根据查询图生成一系列关系运算和一个最优的方案,这个阶段使用规则库优化技术,最后一个阶段c代码被生成c编译器。
(1)、查询图生成
这个阶段参照对象模型,将查询图与用户查询相关联。这个查询图是一个对象模型的子图,这个对象模型注解有对象和条件信息。在这个阶段,包含不完整的知识访问的用户查询被转换为一个更有效的形式。在jasmine中,用户根据具体化通用类而不是这个具体类来形成一个查询。根据归类原理,用户能用条件来具体化一个非叶节点类,如果给定的条件与一些归类条件相匹配,那么非叶节点类被具体化成一些符合归类条件的组件成员。
(2)、访问方案生成
这个阶段以直接模式方式将查询图翻译成对象运算。翻译规则构建在查询语义学基础上。通过使用对象模型信息如统计数据、访问方法、类到关系的映射,对象运算别转化为扩展关系运算。对象表达式是不同处理的,这依赖于它是否包含有过程属性。
4、单值存取访问和对象缓冲
与面向集合的访问一样,单值存取访问也被编译成c程序,编译时需要连接运行期支持库。
第一次访问一个对象时,会从二级存储器取出对象到页面缓冲区。这样对象就被缓冲存放在活动对象表(aot)中。实际上aot是一个内部哈希表。aot有一个oid键和入口。该入口含有一个指向内部实例结构的指针tid和几个更新标志位。一个实例的内部结构与一个元组类似,这使参考其它对象和修改变得容易。当一个事务结束时,具有更新标志的对象从aot中转存到页面缓冲区和二级存储器。用户可以通过说明aot大小来控制aot中的冲突处理。为了更加有效地存储空间,对象可以从aot中删除,但oid组和tid组仍直接从数据库中取出,这些对象先前从内存中已经丢失。我们将单值存取访问对象表达式翻译成基于aot的访问。例如对象表达式 obj.attr变量obj具有aot的指针。首先,检查aot入口的更新标志位,如果标志指出这个对象已经被删除了,则发生错误。如果一个对象从内存中清除是为了进行空间的管理,那么这个对象会通过tid直接从二级存储器中取出。其它情况下系统会从由aot指针指向的内部实例结构中取attr,对象表达式返回这个值。如果这个属性域含有一个参考对象,即另一个oid。系统通过哈希表在aot中查找具有这个oid的对象。若没有,再通过aot中缓冲存放的oid或tid到二级存储器中查找。这样对象表达式的值是一个指向参考对象的入口指针,它将成为attr属性的值。一般对象表达式obj.attr-1.iattr-n被递归的解释。对象变量具有一个指向aot入口的指针,不是延迟访问的oid。由于避免了基于哈希表的搜索,因此对象存取速度得到了提高。对于基于连接的访问比如超媒体应用,这一点很好。
一般来说,缓冲区和对象存取模式直接相关。页面缓冲具有适合相同类的不同实例存取的结构。aot,对象缓冲区具有适用与不同类的相关实例的存取结构。高级应用例如cad具有这两种模式。就就需要双缓冲策略,包括页面缓冲和对象缓冲,而不仅仅是一个单一缓冲策略,它会包含不必要的对象,也会降低内存利用率。然而,双缓冲方法使得同样一个对象以不同的格式同时出现在不同的缓冲区中,因此我们不得不维护说明同一个实体的两个对象的内部一致性。
5、解释器
系统为程序的高效运行提供了编译器,为应用的快速开发和处理特殊的查询提供了解释器。编译器将查询语句翻译成扩展的关系操作符。解释器将查询语句翻译为扩展的操作符并执行。考虑到实用性,解释器只能执行面向集合的存取,查询的结果送到由一个编译好的程序引用的集合变量。用户可以在一个集成的环境里使用解释器和编译好的程序。由于程序存在与实例中,所以他们可以在一个面向查询中交互访问。程序可以在动态编译之后相互激活,编译器和解释器共享代码,解释器 编译解析器分析输入的查询语句。解释器使用运行时支持库提供的功能产生中间代码。
本文叙述了一个知识库管理系统kbms---jasmine,重点谈论了对象管理子系统。