行级锁是比较高级的功能,在各个操作系统都有提高,但没有统一标准。在POSIX规范中,提供一个文件级的锁,本文就是提供一种方案,利用文件级的锁来实现行级的锁。
有人会觉得这个没有什么必要,因为可以直接调用操作系统的接口。这样也可以,不过由于POSIX和标准C库是跨多个平台,我们利用标准库的接口来实现,就不会有平台的问题。如果在性能方面要求不是太苛刻的话,这个方案实际上相当不错。这个方案是应用程序级的,跟系统级会有一定的差距。
这个方案的核心思想就是将系统中调度部分移到应用程序级。我们先描述下这个命题:
假设多个进程P1....PN要共享访问文件F,现在程序库中只有锁定整个文件F的函数和在文件中定位偏移量的函数。要求如何使用这些函数来实现共享访问文件F,可以读写。
现在,我们来描述这个算法:
1、为文件F创建一个文件FS。
2、在FS中记录F的文件信息,比如长度,以及每个进程请求的资源。尽量包括超时设定,防止进程突然死亡,资源成了僵尸。
3、每个进程请求资源的时候,先锁定FS,比对其中已经被锁定资源,如果没有则分配。再释放FS的锁。
利用文件锁对FS,来控制F的多进程访问,实际上F都不需要加锁。
有人会觉得这个没有什么必要,因为可以直接调用操作系统的接口。这样也可以,不过由于POSIX和标准C库是跨多个平台,我们利用标准库的接口来实现,就不会有平台的问题。如果在性能方面要求不是太苛刻的话,这个方案实际上相当不错。这个方案是应用程序级的,跟系统级会有一定的差距。
这个方案的核心思想就是将系统中调度部分移到应用程序级。我们先描述下这个命题:
假设多个进程P1....PN要共享访问文件F,现在程序库中只有锁定整个文件F的函数和在文件中定位偏移量的函数。要求如何使用这些函数来实现共享访问文件F,可以读写。
现在,我们来描述这个算法:
1、为文件F创建一个文件FS。
2、在FS中记录F的文件信息,比如长度,以及每个进程请求的资源。尽量包括超时设定,防止进程突然死亡,资源成了僵尸。
3、每个进程请求资源的时候,先锁定FS,比对其中已经被锁定资源,如果没有则分配。再释放FS的锁。
利用文件锁对FS,来控制F的多进程访问,实际上F都不需要加锁。