本章的内容是开发一个简单的、多用户数据库的C函数库。调用此函数库提供的C语言函数,其他程序可以读取和存储数据库中的记录。绝大部分商用数据库函数库提供多进程同时更新数据库所需要的并发控制,采用建议记录锁、B+树、动态散列实现数据库。

1、函数库

  开发类似ndbm函数库,增加了并发控制机制,从而允许多进程同时更新同一数据库。函数接口如下:

1 #include "apue_db.h"
2 DBHANDLE db_open(const char *pathname, int oflag, .../* int mode */); //返回值:若成功则返回数据库句柄,若出错则返回NULL
3 int db_close(DBHANDLE db); //关闭数据库
4 in db_store(DBHANDLE db, const char *key, const char*data, int flag); //向数据库中加条新的记录
5 char* db_fetch(DBHANDlE db, const char *key);//若成功则返回指向数据的指针,若记录没有找到则返回NULL。
6 int db_delete(DBHANDLE db, const char *key);//返回值:若成功则返回0, 若记录没有找到则返回-1。
7 void db_rewind(DBHANDLE db); //回滚到数据库第一条记录
8 char* db_nextrec(DBHANDLE db, char *key);//返回值:若成功则返回指向数据的指针,若到达数据库的结尾则返回NULL

2、实现概述

  大多数访问数据库的函数库使用两个文件来存储信息:一个索引文件和一个数据文件。数据库实现结构如下图所示:

索引文件和数据文件结构

3、集中式和非集中式

(1)集中式:由一个进程作为数据库管理者,所有的数据库访问工作由此进程完成,其他进程通过IPC机制与此中心进程进行联系。

(2)非集中式:每个函数库独立申请并发控制(加锁),然后调用自己的I/O函数。调用数据库库函数执行I/O操作的用户进程是合作进程,使用字节范围锁机制实现并发访问。

非集中式避免使用IPC机制,速度一般比集中式要快。集中式的优点是能够根据需要来对操作模式进行调整,恢复要比非集中式方法容易。

4、并发

(1)粗锁(coarse-grained locking):将索引文件和数据文件中的一个作为整个数据库的锁,并要求调用者在对数据库进行操作前必须获得这个锁。缺点是限制了最大程度的并发。

(2)细锁(fine-grained locking):要求一个读进程或写进程在操作一条记录前必须先获得此记录所在散列链的读锁或写锁。允许对一条散列链同时可以有多个读进程,而只能有一个写进程。另外,一个写进程在操作空闲区链表(如dbdelete或dbstore)前,必须获得空闲区链表的写锁。最后,当dbstore向索引文件或数据文件加一条新记录时,必须获得对应文件相应区域的写锁。

Unix环境高级编程(二十一)数据库函数库的更多相关文章

  1. UNIX环境高级编程——标准I/O库函数和Unbuffered I/O函数

    以写文件为例,C标准I/O库函数(printf(3) .putchar(3) .fputs(3) )与系统调用write(2) 的关 系如下图所示. 库函数与系统调用的层次关系 open .read ...

  2. UNIX环境高级编程——线程私有数据

    线程私有数据(Thread-specific data,TSD):存储和查询与某个线程相关数据的一种机制. 在进程内的所有线程都共享相同的地址空间,即意味着任何声明为静态或外部变量,或在进程堆声明的变 ...

  3. Unix环境高级编程(二)文件和目录

    本章主要介绍的是文件结构及目录.重点是通过stat函数获取文件的结构信息,然后是文件目录及其遍历.学完本章后,编写了一个输出给的目录下的文件信息的程序. 首先是包含在<sys/stat.h> ...

  4. Unix环境高级编程(二十)伪终端

    1.综述 伪终端对于一个应用程序而言,看上去像一个终端,但事实上伪终端并不是一个真正的终端.从内核角度看,伪终端看起来像一个双向管道,而事实上Solaris的伪终端就是用STREAMS构建的.伪终端总 ...

  5. Unix环境高级编程(三)标准I/O库

    标准I/O库是ISO C的标准,在很多操作系统上面都实现.Unix文件I/O函数都是针对文件描述符的,当打开一个文件的时候,返回该文件描述符用于后续的I/O操作.而对于标准I/O库,操作则是围绕流进行 ...

  6. (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  7. (四) 一起学 Unix 环境高级编程(APUE) 之 系统数据文件和信息

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  8. (十一) 一起学 Unix 环境高级编程 (APUE) 之 高级 IO

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  9. (十二) 一起学 Unix 环境高级编程 (APUE) 之 进程间通信(IPC)

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

随机推荐

  1. 介绍两个非常好用的Javascript内存泄漏检测工具

    内存泄漏对开发者来说一般很难检测因为它们是由一些大量代码中的意外的错误引起的,但它在系统内存不足前并不影响程序的功能.这就是为什么会有人在很长时间的测试期中收集应用程序性能指标来测试性能. 最简单的检 ...

  2. Div+Css实现段落首行缩进两个字符(text-indent标签)

    段落前面空两个字的距离,不要再使用空格了,用CSS实现段落首缩进两个字符.应该使用首行缩进text-indent.text-indent可以使得容器内首行缩进一定单位.比如中文段落一般每段前空两个汉字 ...

  3. IOS之Block讲解

    Block,称为代码块,它是一个C级别的语法以及运行时的一个特性,和标准C中的函数(函数指针)类似,但是其运行需要编译器和运行时支持,从ios4.0开始就很好的支持Block. Block很像匿名方法 ...

  4. scala 学习笔记四 匿名函数

    1.介绍 Scala 中定义匿名函数的语法很简单,箭头左边是参数列表,右边是函数体. 使用匿名函数后,我们的代码变得更简洁了. 下面的表达式就定义了一个接受一个Int类型输入参数的匿名函数: var ...

  5. html 中shadow DOM 的使用

    什么是shadow DOM? An important aspect of web components is encapsulation — being able to keep the marku ...

  6. _com_util::ConvertBSTRToString的使用问题

    #include <comutil.h> 然后调用_com_util::ConvertBSTRToString提示如下错误: error LNK2019: unresolved exter ...

  7. string、wstring、cstring、 char、 tchar、int、dword转换方法(转)

    string.wstring.cstring. char. tchar.int.dword转换方法(转)   最近编程一直头痛这集中类型的转化,明知都可以转却总是记不住,不断的上网查来查去,在这里小结 ...

  8. listView/GridView getChild获取不到的解决方法

    在onCreate或onResume中调用了getChildAt()方法,这时候adapter中的Item还没有放入到AdapterView中去.... 解决方法,当activity获得焦点事件的时候 ...

  9. STL - Map - 运行期自定义排序

    RuntimeStringCmp.cpp #include <string> using namespace std; // function object to compare stri ...

  10. jquery ajax 跨域

    客户端“跨域访问”一直是一个头疼的问题,好在有jQuery帮忙,从jQuery-1.2以后跨域问题便迎刃而解.由于自己在项目中遇到跨域问题,借此机会对跨域问题来刨根问底,查阅了相关资料和自己的实践,算 ...