设为首页 加入收藏

TOP

第十一章数据库管理类的实现(一)
2015-07-24 10:46:18 来源: 作者: 【 】 浏览:2
Tags:十一 数据库 管理 实现
第十一章 数据库管理类的实现


文件目录系统是一个类;它的方法表只有一个,而属性表较为特殊,可以包含很多类的对象;并是可以动态增长的;可以说文件目录系统是一个多类的对象集。数据库是文件目录系统中的一个子目录;从某种角度看,我们也可以将文件目录系统看是一个数据库。其实,很多资源管理都具有数据库的特征;如内存、磁盘空间,进程,一个进程中的线程、对象、类、打开的文件号、消息等等的管理。我们把这些等等、都看作是系统对象,那么如何管理这些系统对象?它们的抽象点是什么?无论如何,对象都是由表、从而数据变量、子表构成;而数据都是位的容器;只是大小和保存方式不一样吧。表由一些变量组成,而变量也可能是另一个表或动态表;动态表的成员也可能是一个表;这样会有2种基本形式:
1、表中表、表再表…树状结构,典型的就是文件目录系统。
2、动态变化的表,即是成员数变化的表;如果动态表的成员都具有相同的类型,称为线性表。

2种形式都有,典型的是我们常用的数据库;数据库作为一个目录节点,而子节点就是目录下的一堆表文件。文件表通常是由文件头属性表和文件体属性表构成;如果我们把一个表的基本不变部分的属性放在文件头,而线性表作为文件体;那就是表文件。这时,线性表的成员通常叫为记录。目录就可以看作是一个线性表;它的成员记录就是文件。

理论上,动态表是不可穷尽的;但资源是有限的。在APO中,一个卷下的文件和目录数、也即是i节点数是不能超过4G个的。一个目录下的文件和子目录数不能超过4G个。一个动态表的成员数大小不能超过4G个;动态表的成员也可以是一个表。所以,一个线性表的记录如超过4G个;你可放到另一个表文件。理论上,一个数据库可以16E个记录,实际上不行;因为不能超过一个卷的磁盘空间4G个数据块 = 8PB。

动态表有2种模式:大模式,成员数大小不超过4G个;小模式,成员数大小不超过64K个。对资源的管理,2种模式都可能使用到。比如,本地内存的管理:本地内存有64K个块,以连续块分配、释放的管理模式就是小模式。每个数据块有64K个行,以连续行分配、释放的管理模式就是大模式。又比如通常的数据库:线性表文件数、线性表中的记录数是使用大模式;而一个表的字段数则是用小模式。又比如一个卷的磁盘空间4G个数据块的管理:一个单元是64K个数据块,一个卷有64K个单元。一个页域有64个页区,一个页区有64K个页;一个页是256行,即256H。所以,以连续单元、连续页区分配、释放的管理模式就是小模式。以连续数据块、连续页分配、释放的管理模式就是大模式。不管如何,对表中的成员进行操作的基本方法有4种:增加、删除、修改、查询。后2种方法通常是不同的应用程序去实现的,前2种方法是可以抽象为普式的方法。从另一个角度看,增加、删除可以看作是对资源的分配、释放。如果我们用一个二进制位来表示一个资源单位;资源单位可能是一段连续行、或一段连续数据块、或一条记录、或一个文件、或一个进程、或一个进程中的一个线程、或一段连续页、或一段连续页区、或一段连续单元、或一个i节点、或进程中的一个打开的文件号、或线性表中的一个字段、或进程中的一个类号、或进程中的一个对象号、或一个消息号、或一个过程号等等。这样,对应于小模式,需要64K个位来表示;也即BU64K A; 64K位的位图变量A就对应一个小模式。而大模式则需要64K个64K位的位图变量来描述。一个64K位的位图变量只是占存储空间256H,并不多;但大模式需要占存储空间256个数据块,就比较多了。为减少空间的浪费;对于大模式,我们通常是动态生成的。最初只是分配一个位图变量数据块,该块有256个64K位的位图变量;可以管理大模式中的16M个单位。如果还不能满足时,再申请分配一个位图变量数据块。。。最终会生成有n个(n <= 256)位图变量数据块。只要我们编写了大、小模式的分配、释放方法放于系统方法表内;那么,所有的程序类都将受益;无须重复的代码。增加、删除数据库表中的一条记录,或目录下的一个文件,或磁盘空间中的一段连续数据块,或数据库下的一个表文件,或磁盘空间中的一段连续页,或磁盘空间中的一个i节点,或本地内存中的一段连续行等等;都是调用大模式下的分配、释放方法。增加、删除数据库表中的一个字段,或一个进程中的一个对象号或类号或线程号或过程号或消息号或打开的文件号,或磁盘空间中的一段连续单元,或一个进程,或磁盘空间中页域下的一段连续页区,或本地内存中的一段连续数据块等等;都是调用小模式下的分配、释放方法。APO中的位图是位为1,表示空闲;位为0表示占用。增加、删除只是对位图变量的操作,而不是对对象的具体内容进行。比如,删除一个文件;只是对代表文件所占磁盘空间的位图变量中的一些位做释放;如果,这些空间没有被其它文件占用;那么空间还是原来文件的内容。

单位是指空间的划分单位。一个单位,如果是表示xx号,就很好办;它对应大、小模式中的一个位;结果就是位序号。无论如何,一个单位就是一种规定的位容器。内存、磁盘空间的位容器规格是固定的,有:行H、数据块64KH、页256H、页区64K页、单元64K个数据块、页域64K个页区、卷64K个单元。不过,似数据库表中的一条记录等;单位就不一定是固定的。一条记录或许是600H,或许是一页,或许是10个数据块等等。不管如何,它们最终都是需要磁盘空间、内存空间的固定位容器来装载。一条记录的单位大小,第0号记录在内存空间的开始地址会在表文件头表现、第0号记录在磁盘空间的开始地址会在表文件的目录项体现。为何要用连续单位分配、释放?目的是要取消低速的链表方式。如果一个表文件大小是1G个数据块,如果用链表方式;你大约要1G次I/O及磁道定位,才能找到最后的记录;差不多用3000小时。就算你把链表头指针放在公共文件来提高速度,也要多占4GB的空间。使用连续单位分配,空间、时间都要省得多;1G个数据块可以分配连续16K个单元;即使是逐步生成的,也不会有多少段;链表可以很小。为何文件的磁盘空间定位、大小放在目录项?假如要删除一个具有1G个文件或子目录的目录;那么只是对一个目录文件进行I/O及释放;否则,3000小时都算是快的了。

对应小模式:
数据库表中的一个字段,或一个进程中的一个对象号或类号或线程号或过程号或消息号或打开的文件号,或磁盘空间中的一段连续单元,或一个进程,或磁盘空间中页域下的一段连续页区,或本地内存中的一段连续数据块。将空间划分成一个单位是1/64K。

对应大模式:
数据库表中的一条记录,或目录下的一个文件,或磁盘空间中的一段连续数据块,或磁盘空间中的一段连续页,或磁盘空间中的一个文件i节点,或本地内存中的一段连续行。将空间划分成一个单位是1/4G。


1、小模式管理

APO的内核中,集成有64K位的多功能辅助硬件模块;分配、释放都在一个方法内执行。请求分配、或释放一段连续单位;我们需要先把64K位的位图变量拷贝进硬件模块,之后执行分配、或释放命令;完了再把64K位的位图变量回传。尽管,硬件模块的执行时间只是10ns;但来回拷贝整个位图256行却需要256ns。所以,我们需要考虑;只是拷贝需要的那一行(只需1ns)进硬件模块,来增加速度。为此,增加一个变量BU32 A1; A1的高16位表示位图中的最大连续为1的数值,而低16位表示该数值所在的行序号。这样,我们一开始先判断A1H是否满足要求;是,我们只拷贝A1L这行开始的相关行来进行分配;否,拷贝256行的整个位图,来进行分配;A1重新设定。释放相对来说要简单,只是需要拷贝相关的行。对于非连续单位,即一个位的管理;就简单多了。我们先拷贝16行,SS1;如成功才耗36ns,失败拷贝下16行;最多循环16次。

小模式属性表:
XMUB{ // 256H + 3W。
BU64K XMUWT; // 小模式管理位图变量;256H。
BU1W MAXLX1; // 位图变量中的最大的连续为1的位数及起始位号所属的行号。
BU1W KSXYU; // 位图变量管理的空闲单位数。
BU1W UIJIU; // 位图变量管理的实际单位数。
}

分配:入口,申请的连续单位数或说是位数;出口,返回连续单位数的开始单位号、和位图的最大连续单位数的开始单位号。失败,状态寄存器PSR的标志,PSR.YJ = 0。
释放:入口,释放的连续单位数和开始单位号;出口,返回位图的最

首页 上一页 1 2 3 4 下一页 尾页 1/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇JDBC数据库编程 下一篇对触发器的思考

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·Libevent C++ 高并发 (2025-12-26 00:49:30)
·C++ dll 设计接口时 (2025-12-26 00:49:28)
·透彻理解 C 语言指针 (2025-12-26 00:22:52)
·C语言指针详解 (经典 (2025-12-26 00:22:49)
·C 指针 | 菜鸟教程 (2025-12-26 00:22:46)