文件系统技术内幕:大数据时代海量数据存储之道
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

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为例介绍一下如何使用文件锁。