SimpleDBM 组件分析 (一)

A、Object Registry

  主要思想:Object Registry中维护有一个table,此table为一个映射表(map),每种类型对应一个typecode(2-byte),位于每个对象之前。在从bytestream中提取对象的时候,先读取typecode,然后在Object Registry的map中找到对应的类型描述,用然后提取出一个指定类型的对象。

  两大功能:1、从bytestream中重建对象;

       2、复杂的对象处理;针对Singleton,一个类型只有一个对象(而Factory则是用类型去生成对个对象);

  在object 与bytestream的转换过程中

               marshalling

                                   | ------------------>

          object  |             | bytestream

                                    <------------------| 

               unmarshing

  Object Registry提供的借口负责unmarshing,而marshing的过程交给Storable即接口实现;每个要用到Object Registry的类都要实现Storable接口。

  要求:1、对象必须可以预测自己的长度(bytelength);

     2、需要对象自己能将自己转成ByteBuffer;

B、Storage Factory

  负责存储,逻辑上的file 对 实际中file实现的抽象。实际中的实现可能是disk frame后者raw device。

  DBMS关心的是能提供一种支持随机访问的存储容器。

  在SimpleDBM中,每个table、index都对应一个Storage Container,且Write Ahead Log用Storage Container来存储数据。

  Storage Container作为一个层次,屏蔽了具体的存储实现,所有在SimpleDBM中对存储的需求,指向Storage Cintainer后便不在深入,底层的东西留给Storage Container自己去封装。Storage Container呈现给DBMS的就是一个支持随机访问的存储容器。

  对于Storage Factory,则是组织起这些Storage Container来。在这个组织结构中,一个Storage Container对应一个integer,用integer作为identifier。

  Storage Container Factory维护一个Storage Container的列表,由Storage Manager管理。

  一个Storage Container在构造是有两个要素:1)、对应的整数identifier,2)Storage Container的名称

  在使用的时候,由Storage Manager.getInstance(ID)获取Storage Container。

C、Latch Manager

  Latch 用来管理对物理结构的并发访问。

  Latch类似于Mutex,它还支持Share-Lock,Update-Lock。

  SimpleDBM中,Latch分两类ReadWrite Latch,ReadWriteUpdate Latch。

           |-----Share-Mode       SvS(only)

  ReadWrite Latch  |

           |-----Exclusive-Mode

 

               |-----Share -Mode     SvS    (SvU)X

  ReadWriteUpdate Latch  |-----Exclusive-Mode    

               |-----Update-Mode     UvS   (UvU)X  (UvX)X

 

  U upgrade X  X  downgrade U    U downgrade S

 

  ReadWrite Latch 基于Java自有的原语实现。

  ReadWriteUpdate Latch用Lock Manager的子集实现。

  (前者是个正宗的Latch,而后者更像是一个Lock)

  ReadWrite Latch比ReadWriteUpdate Latch更加有效。

  实现与性能优化:

  1、一个Latch是被它的Client所知道,因此不需要查找;而lock则是要在哈希表中动态地查找。每一个Latch的实例都是一个锁,Client拥有对Latch的一个引用。

  2、在这里不支持锁的多种持续周期(即,从持续周期(duration)上讲,所有的的锁都是一样的)。

  3、除了锁转换(conversion)和锁降级(downgrade)之外,这里还支持锁升级(upgrade)。

    一个锁升级就像一个锁转换:除了1)它是一个显示的请求 2)不引起Client 的reference count的改变。

    因此,锁转换与锁升级(锁降级)最主要的区别在于Client使用锁的方式不同。

    对于普通的锁转换,Client试图将没课请求看做一个独立的请求,然后释放锁的次数与请求锁的此时相同。而锁升级(锁降级)则不改变Client的引用计数(reference count)。

  4、与Lock Manager不同,Latch的拥有者是事先定义好的,拥有者总是正在请求的线程,因此不需要额外提供一个拥有者。  

  5、Latch不支持死锁预防。实现上用一个10 s的超时限制来界定一个死锁。由于Latch的死锁常常由于代码的 BUG,不应该在运行中出现。死锁可以通过按一定的顺序请求和释放Latch来避免。

 

  用Factory实现一个Latch的实例。默认实现的是 ReadWrite Latch。

posted @ 2010-03-03 22:31  郝玉琨  阅读(530)  评论(0编辑  收藏  举报