1、应用1——用于操作数据库的库
这里对应原书中的第20章,讲述了一个用来操作数据库的库的开发,以及期间需要考虑的问题。具体请参见原文参考资料,这里只给出一些简单的说明。
(1)简介
在20实际80年代早期,UNIX系统非常不适合运行多用户的数据库系统。早期的系统,例如Version 7,确实在这个方面有较大的困难。因为这些系统不提供任何形式的IPC(当然除了半双工管道)并且不提供任何形式的字节范围内的锁。后来这些缺陷都被克服了。在20世纪晚期,UNIX体统可以提供一个可靠的,用于多用户数据库系统的环境了。然后,大量的商业公司,开始提供这样的数据库系统。
在本章中,我们开发了一个简单的多用户的数据库c函数库,任何程序都可以调用其中函数向一个数据库中存取或者从中获取记录。这些C函数库只是一个完整的数据库系统的一小部分,我们并没有开发诸如请求语言等其他方面的内容,这些可以参见相关的书籍。我们只关注一个数据库函数库到底需要UNIX系统提供哪些接口,以及那些接口如何与我们前面提到的内容相关联(例如14章3节中字节范围的记录锁)。
(2)历史背景
有一个在UNIX系统下面比较流行的数据库库函数,叫做dbm(3)库。这个库由Ken Thompson开发,使用动态哈希策略实现。这个库原来由Version 7提供,并且出现在所有的BSD发行版当中。它也被SVR4的BSD兼容库提供。BSD开发者将这个dbm库进行了扩展,然后将它称做ndbm。ndbm库被BSD以及SVR4包含。ndbm的函数在SUS的XSI扩展中被标准化。
Seltzer 和 Yigit曾经详细叙述了dbm以及其它库所使用的动态哈希算法。这些库也包括gdbm(dbm库的GNU版本)。然而,所有这些库的实现,都无法支持多进程之间同时进行数据更新,因为它们没有提供同步控制(例如记录锁)。
4.4BSD提供了一个新的db(3)库,这个库支持三种形式的访问:
1)面向记录。
- 哈希。
- B-tree。
但是它也没有提供同步机制(这也被db(3)用户手册作为其BUGS列出)。
Sleepycat Software提供了db库版本,可以支持同步访问,锁,以及事务处理。
多数数据库库提供同步控制,用于多进程同时进行数据库的更新。这些系统一般使用建议锁(如我们14.3所述)。但是他们一般实现自己的锁元素,以避免系统调用的开销,以请求一个没有争议的锁。这些商业系统一般通过B+树来实现他们自己的数据库,有些也使用动态哈希技术(例如线性哈希,或者扩展的哈希)。
下表列出了本书中四个系统经常看到的数据库库。需要注意的是,在Linux上面,gdbm库同时提供了dbm和ndbm函数的支持。
各种平台对数据库库的支持情况
+--------------------------------------------------------------------------------+
| Library | POSIX.1 | FreeBSD 5.2.1 | Linux 2.4.22 | Mac OS X 10.3 | Solaris 9 |
|---------+---------+----------------+--------------+----------------+-----------|
| dbm | | | gdbm | | • |
|---------+---------+----------------+--------------+----------------+-----------|
| ndbm | XSI | • | gdbm | • | • |
|---------+---------+----------------+--------------+----------------+-----------|
| db | | • | • | • | • |
+--------------------------------------------------------------------------------+
本章具体内容,讲述一个类似ndbm库的设计和实现,属于应用开发的范围了,这里不再进行详细讲述,具体参见参考资料。
(3)总结
本章首先对这个数据库函数库进行了设计。虽然见谅保持其简洁,但是它也包含了记录锁的功能,可以让多个进程进行访问。
我们也通过使用没有锁,建议锁(细粒度和粗粒度),和强制锁来对比,看到了这个函数库的执行情况,我们可以看到,建议锁相对没有锁的情况,只增加了不到10%的始终时间,强制锁却相对建议锁增加了33%到66的时间。
译者注
原文参考
参考: APUE2/ch20.html
网友评论