分类: LINUX
2012-05-18 21:38:16
++++++APUE读书笔记-20应用++++++
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)库,这个库支持三种形式的访问:(a)面向记录。(b)哈希。(c)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的时间。
参考:
2、应用2——与网络打印机通信
================================================
这里对应原书中的第21章,讲述开发了一个可以和网络打印机通信的程序,以及期间需要考虑的问题。具体请参见原文参考资料,这里只给出一些简单的说明。
(1)简介
这里,我们开发了一个可以和网络打印机通信的程序。这些打印机可以通过以太网连接到多台计算机上面,提供明文文件或者附笔(PostScript)文件。应用程序通常使用因特网打印协议(IPP)和这些打印机进行交,当然也有一些可选的通信协议。
我们将要讲述两个程序:一个是print spooler 守护进程,它给printer发送作业和提交打印作业的命令给spooler守护进程。print spooler需要用到许多功能(例如和提交作业的客户进程进行通信,和printer进行通信,读取文件,扫描目录等等),所以我们需要用到前面讲述的很多函数。例如,我们使用线程(11章和12章)来简化print spooler的设计,使用sockets(16章)进行调度打印文件的程序与print spooler之间的交互,以及print spooler和网络printer之间的交互。
(2)实现
本章具体内容,属于应用开发的范围了,这里不再进行讲述。具体参见参考资料。这里只给出一个简单的图形,描述这里开发的程序:
Printer spooling 的组成
+---------+ +------------+
| print |<------------>| printd |
| command | | printer |
+^------^-+ | spooler |<----
/ \ +^-----^-----+ \ queue of files to be printed
/ \ ------/ | \
/ \ / | +-v-----+ +-------+ +-------+
+---------+ +--------+ | | file1 |--->| file2 |--->| file3 |
| file to | | config | | +-------+ +-------+ +-------+
| print | | file | |
+---------+ +--------+ |
+-----v----+
| printer |
+----------+
(3)总结
这章对两个完整的程序进行了详细的讲述:print spooler守护进程,用于给网络printer发送打印作业;以及一个可以用来提交被打印的作业到spooling守护进程的命令。这样,我们可以看到之前章节中讲到的许多的内容的应用(例如线程,多I/O,文件I/O,套接字I/O,信号等)。
参考: