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。