在多任务操作系统环境中,如果一个进程尝试对正在被其他进程读取的文件进行写操作,可能会导致正在进行读操作的进程读取到一些被破坏或者不完整的数 据;如果两个进程并发对同一个文件进行写操作,可能会导致该文件遭到破坏
因此,为了避免发生这种问题,必须要采用某种机制来解决多个进程并发访问同一个 文件时所面临的同步问题,由此而产生了文件加锁方面的技术
早期的 UNIX 系统只支持对整个文件进行加锁,因此无法运行数据库之类的程序,因为此类程序需要实现记录级的加锁
在 System V Release 3 中,通过 fcntl 提供了记录级的加锁,此后发展成为 POSIX 标准的一部分
本文将基于 2
23 版本的内核来探讨 Linux 中文件锁的相关技术
Linux 中的文件锁 Linux 支持的文件锁技术主要包括劝告锁(advisory lock)和强制锁(mandatory lock)这两种
此外,Linux 中还引入了两种强制锁的变种形式:共享模式强制锁(share-mode mandatory lock)和租借锁(lease)
在 Linux 中,不论进程是在使用劝告锁还是强制锁,它都可以同时使用共享锁和排他锁(又称为读锁和写锁)
多个共享锁之间不会相互干扰,多个进程在同一时刻可以对同 一个文件加共享锁
但是,如果一个进程对该文件加了排他锁,那么其他进程则无权再对该文件加共享锁或者排他锁,直到该排他锁被释放
所以,对于同一个文件 来说,它可以同时拥有很多读者,但是在某一特定时刻,它只能拥有一个写者,它们之间的兼容关系如表 1 所示
锁间的兼容关系 是否满足请求 当前加上的锁 共享锁 排他锁 无 是 是 共享锁 是 否 排他锁 否 否 劝告锁 劝告锁是一种协同工作的锁
对于这一种锁来说,内核只提供加锁以及检测文件是否已经加锁的手段,但是内核并不参与锁的控制和协