zoukankan      html  css  js  c++  java
  • 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。

  • 相关阅读:
    squid反向代理
    LVM逻辑卷管理
    磁盘分区
    磁盘阵列
    apache基本配置
    LNMP简要配置
    高性能Web服务器Nginx
    samba文件共享服务配置(multiuser机制)二 (共两节)
    samba文件共享服务配置一(共2节)
    linux 批量修改文件名 文件名只保留部分,去掉部分
  • 原文地址:https://www.cnblogs.com/YFYkuner/p/1677645.html
Copyright © 2011-2022 走看看