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。由于避免了基于哈希表的搜索,因此对象存取速度得到了提高。对于基于连接的访问比如超媒体使用,这一点很好。
普通来说,缓冲区和对