2.6.1 文件锁的分类与模式
从大类上来分,文件锁分为劝告锁(Advisory Lock)和强制锁(Mandatory Lock)两种类型。
劝告锁是一种建议性的锁,通过该锁告诉访问者现在该文件被其他进程访问,但不强制阻止访问。这就好比我们去景区旅游,看到一个牌子写着“游客勿入”,但是门是开着的。如果我们不在乎警告,还是可以进去的。
强制锁则是在有进程对文件锁定的情况下,其他进程是无法访问该文件的。还以旅游为例,你走到一个地方,虽然没有牌子写着“游客勿入”,但是大门是紧锁的。在这种情况下即使你想冲进去,也是没办法进去的。
在使用模式上,无论是劝告锁还是强制锁都分为共享锁和排他锁两种。共享锁与排他锁的差异在于当进程A持有锁的情况下,其他进程试图持有该锁时产生的行为不同。
共享锁(Shared Lock):在任意时间内,一个文件的共享锁可以被多个进程拥有,共享锁不会导致系统进程的阻塞。也就是说,当进程A持有共享锁的情况下,进程B试图持有该共享锁也是可以的,而且不会造成对进程B的阻塞。这非常适用于两个进程同时读取文件数据的场景,如图2-16所示。
排他锁(Exclusive Lock):在任意时间内,一个文件的排他锁只能被一个进程拥有。也就是说,当一个进程A持有排他锁时,另外一个试图获取该锁的进程B将被阻塞,直到占用锁的进程释放后,进程B才能继续,如图2-17所示。
图2-16 共享锁示意图
图2-17 排他锁示意图
为了让大家更加清晰地理解共享锁与排他锁的关系,下面通过表2-2进行一个比较全面的表述。其中第一列表示某个进程已经获取了某种类型的锁。后面两列则表示当另一个进程期望获取该类型的锁时是否可以获得。
表2-2 共享锁与排他锁的互斥关系
例如,文件的读/写可以结合共享锁与排他锁来实现,写文件使用排他锁,读文件使用共享锁。当有进程在写文件时,其他所有进程都不允许写或读此文件。当没有进程在写文件时,多个进程可以同时读此文件。
本节主要对文件锁的概念和类型进行了介绍,下面以Linux中API为例介绍一下如何使用文件锁。