Unix环境高级编程009.pdf
上传人:qw****27 上传时间:2024-09-12 格式:PDF 页数:50 大小:4.2MB 金币:15 举报 版权申诉
预览加载中,请您耐心等待几秒...

Unix环境高级编程009.pdf

Unix环境高级编程009.pdf

预览

免费试读已结束,剩余 40 页请下载文档后查看

15 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

39293XINU环境高级编程下载节给出了采用细锁的实现,并详细讨论了锁的实现(粗锁是实现的简化)。在源文件中,直接调用了daer,vdaer,etirwv和etirw。没有使用标准O/I函数库。虽然使用标准O/I函数库也可以使用记录锁,但是需要非常复杂的缓存管理。我们不希望例如stegf返回的数据是01分钟之前读入标准O/I缓存的,而被另一个进程在5分钟之前修改了。我们对并发讨论依据的是数据库函数库的简单的需求。商业系统一般有更多的需要。关于并发更多的细节可以参见]2891[ataD的第3章。16.7源码我们从程序2-61中的头文件h.bd开始。所有函数以及调用此函数库的用户进程都包含这一头文件。程序16-2db.h头文件第61章数据库函数库393下载该程序定义了实现的基本限制。如果要支持更大的数据库的话,这些限制也可以修改。其中一些定义为常数的值也可定义为变量,只是会使实现复杂一些。例如,设定散列表的大小为13731,一个也许更好的方法是让nepo_bd的调用者根据数据库的大小通过参数来设定这个值,然后将这个值存在索引文件的最前面。在BD结构中记录一个打开的数据库的所有信息。nepo_bd函数返回一个BD结构的指针,这个指针被用于其他所有函数。选择用_bd开头来命名用户可调用的库函数,用_bd_开头来命名内部函数。程序3-61中定义了函数nepo_bd。它打开索引文件和数据文件,必要的话初始化索引文件。通过调用colla_bd_来为BD结构分配空间,并初始化此结构。程序16-3db_open函数39493XINU环境高级编程下载第61章数据库函数库593下载如果数据库正被建立,则必须加锁。考虑两个进程试图同时建立同一个数据库的情况。第一个进程运行到调用tatsf,并且在tatsf返回后被内核切换。这时第二个进程调用nepo_bd,发现索引文件的长度为0,并初始化空闲链表和散列链表。第二个进程继续运行,向数据库中添加了一条记录。这时第二个进程被阻塞,第一个进程继续运行,并发现索引文件的大小为0(因为第一个进程是在tatsf返回后才被切换),所以第一个进程重新初始化空闲链表和散列链表,第二个进程写入的记录就被抹去了。要避免发生这种情况的方法是进行加锁,可以使用3.21节readw_lock中的col_wdaerkcol_w,etirwkc和ol_nu这三个函数。db_openepo_bd调用程序4-61中定义的函数colla_bd_来为BD结构分配空间,包括一个索引缓存和一个数据缓存。程序16-4_db_alloc函数索引缓存和数据缓存的大小在h.bd中定义。数据库函数库可以通过让这些缓存按需要动态扩张来得到加强。其方法可以是记录这两个缓存的大小,然后在需要更大的缓存时调用collaer。在函数eerf_bd_(见程序5-61)中,这些缓存将被释放,同时打开的文件被关闭。nepo_bd在打开索引文件和数据文件时如果遇到错误,则调用eerf_bd_释放资源。esolc_bd(见程序6-61)也调用eerf_bd_。函数hctef_bd(见程序7-61)根据给定的关键字来读取一条记录。它调用dnif_bd_在数据库中查找一条索引记录,如果找到,再调用taddaer_bd_来读取对应的数据记录。程序16-5_db_free函数39693XINU环境高级编程下载程序16-6db_close函数程序16-7db_fetch函数函数dnif_bd_(见程序8-61)通过遍历散列链来查找记录。hctef_bdetel,ed_bdero和ts_bd这几个需要根据关键字查找记录的函数都调用它。第61章数据库函数库793下载程序16-8_db_find函数_db_findnif_bd_的最后一个参数指明需要加什么样的锁,0表示读锁,1表示写锁。我们知道,hctef_bd需要加读锁,而eteled_bdero和ts_bd需要加写锁。dnif_bd_在获得需要的锁之前将等待。_db_findnif_bd_中的elihw循环遍历散列链中的索引记录,并比较关键字。函数xdidaer_bd_用于读取每条索引记录。请注意阅读dnif_bd_中的最后一条注释。当沿着散列链进行遍历时,必须始终跟踪当前索引记录的前一条索引记录,其中有一个指针指向当前记录。这一点在删除一条记录时很有用,因为必须修改当前索引记录的前一条记录的链指针。39893XINU环境高级编程下载先来看看dnif_bd_调用的一些比较简单的函数。hsah_bd_(见程序9-61)根据给定的关键字计算散列值。它将关键