SWFCDB的研究与探索 第4页

SWFCDB的研究与探索 第4页
接口从内存中先取得一块“足够大”的内存空间,并将其分成若干小块,服务器运行过程中,内存管理接口负责分配发送、接收数据缓冲区以及套接字“单句柄数据”缓冲区,并负责回收以上数据空间。由于每次分配数据都是以固定小块形式分配,在该内存块中不会产生内存碎片,因此能够提高系统的稳定性。
 
图 3 7
B. 完成端口服务器线程
完成端口服务器线程负责接受、关闭客户端连接,发送和接收数据,但不处理接收的数据,而是将接收的数据放入接收数据队列中,供数据处理线程处理;当发送数据时,对第一次没有发送成功的数据,将该数据放入未成功发送数据队列中,等待网络空闲时发送,如果再次未发送成功则丢失该数据。
C. 数据处理线程池
数据处理线程池主要负责对接收数据的处理,并提交待发送数据。数据处理线程池由线程池管理者线程和线程池工作者线程组成。空闲工作者线程入空闲工作者线程队列,管理者线程通过空闲工作者线程队列和未处理数据队列负责分派空闲工作者线程要处理的任务,如果未处理数据队列中有未处理数据,则将某个空闲工作者线程推出空闲工作者线程队列,而工作者线程完成任务后,通知管理者线程任务已完成,然后管理者线程检查任务队列中是否有未完成的任务,如果有则重新给工作者线程分配任务,如果没有,则将工作者线程阻塞,并推入空闲工作者线程队列中,待任务队列中有未完成的任务时再将工作者线程激活。
D. CIocp完成端口管理类
CIocp类管理并协调完成端口内存管理接口、完成端口服务器线程和数据处理线程池的正常工作,监视三者的工作状态,提供控制信息,并提供两种方案实现对接受的数据的处理,分别是回调机制和多态(即派生类重写CIocp类虚函数IOCPRecv()实现)。回调函数原型为:
typedef void (*LPIOCP_RECV_CALLBACK)(const LPTASK_QUEUE_ITEM pTQI, CIocp* pIocp);
3.4.2 客户端接口设计思想
客户端采用异步的Event Select I/O 模型[8],该模型允许应用程序在一个或多个套接字上,接收以事件为基础的网络事件通知。通过注册程序“感兴趣”的网络事件类型,来通知程序“感兴趣”的事件发生,以此为基础完成与服务器的通讯。对客户端来说,“感兴趣”的事情一般是接收(FD_READ)数据通知和服务器关闭(FD_CLOSE)通知。

 
4 自主知识产权数据库--系统实现
4.1 开发环境
目前比较流行的软件开发语言有Java,C#,VB,C,C++等语言。与C语言相比,二者都有较好的可移植性,同时C++是面向对象的程序设计语言,是C语言的一个向上兼容扩充,具有C语言的高效和面向对象语言的快速开发的特点。而与Java,C#或VB等基于虚拟机或解释性的语言相比,虽然它们能够给开发人员带来更快速的开发,但是这种开发的快速却带来了执行效率的大大降低,而数据库是基于系统底层的一项技术,对执行效率有严格的要求,综合考虑运行效率,开发效率和移植性等因素,这里选择C++语言来作为系统实现的首选语言。编译器选择 Microsoft Visual Studio C++ .Net 。
4.2 第一层实现
4.2.1 代码维护与更新
2005届张蓉,曹亚玲同学完成了CreateTable(),InsertOneRecord(),DeleteOneRecord(),FindSomRecord(),UpdateOneRecord(),UpdateSomeRecord(),DeleteSomeRecord(),DeletetOneFiled(),InsertOneFiled()等函数的定义和基本实现。
对CreateTable()进行了部分更新,为第一层添加了几种数据类型(如 short, long, float, double, char),并实现将各字段名及各字段数据类型存入建库信息。
对InsertOneRecord()进行了大量修改,使其能够实现插入记录时,保证数据记录文件中每页的利用率至少为50%。实现思想是这样的:页内记录按照主关键字大小由小到大链式存储,第一级索引中的页头结点中记录了该页的最大关键字。当插入一条记录时,程序先获得待插记录的关键字,并在第一级索引(目前为链式存储页头结点,各页头结点按页关键字大小,由小到大顺序链式存储)中查找并比较待插入的记录的关键字是否小于页中的最大关键字,如果找到待插入关键字小于某页的最大关键字,则将待插入记录插入该页;否则,将待插入记录插入记录页的最后一页,并修改该页的最大关键字。
新增页分裂函数SplitPage()。该函数主要实现页内记录已存储满时,将该页记录分裂成两页存储。实现思想为:先从索引文件中的空页链头中取出一空页(如果没有空页,则在文件尾部新建4空页),然后将满页中按关键字排序的后半段记录存入新页中(页内记录是按关键字由小到大链式存储),最后修改第一级索引链表。
新增函数ReturnAllRows()。该函数实现遍历数据库中的所有记录,与FindSomeRecord()函数类似,提供快速遍历。
第一层实现代码见:FirstLayer.h 和 FirstLayer.cpp 。
4.2.2 B+树索引
完成B+树算法[7][11][13]的实现。将B+树算法封装在类CBPTreeIndex 类中。B+树结点结构的定义为:
typedef struct BPTNode
{
 int keyNum;      //B+树中关键字个数
 long lAddress;     //自己节点在索引文件中的位置
 long lParent;      //父结点在文件中索引的位置
 KeyType key[m+1][KSIZE];   //0 空间未用,关键字数组
 long lPtr[m+1];     //子树在索引文件位置数组
Record rec[m+1];    //0 空间未用,该数组存储对应关键字,在数据文件中的起始位置
 BPTNode()      //构造函数
 {
  keyNum=0;
  lAddress=-1;
  lParent=-1;
  for(int i =0;i<(m+1); i++)
   lPtr[i]=-1;
 }
}BPTNode,*PBPTNode;
提供以下八个方法对B+索引树进行操作(其他方法为类内部实现,对外隐藏):
bool CreateBPTreeIndex(FILE *_file, long _lIndexStartPos, long _lIndexLength );
//此函数为索引文件创建B+树索引。file:(in) 文件指针,

上一页  [1] [2] [3] [4] [5] [6] [7] [8] [9] 下一页

Copyright © 2007-2012 www.chuibin.com 六维论文网 版权所有