文件系统如何处理并发读/写?

用户 A 要求系统读取文件 foo,同时用户 B 希望将其数据保存到同一个文件中。如何在文件系统级别处理这种情况?

52310 次浏览

Most filesystems (but not all) use locking to guard concurrent access to the same file. The lock can be exclusive, so the first user to get the lock gets access - subsequent users get a "access denied" error. In your example scenario, user A will be able to read the file and gets the file lock, but user B will not be able to write while user A is reading.

有些文件系统(例如 NTFS)允许指定锁级别,例如允许并发读取器,但不允许写入器。字节范围锁也是可能的。

与数据库不同,文件系统通常不是事务性的,不是原子性的,来自不同用户的更改不是孤立的(如果可以看到更改,锁可能会禁止这样做)

使用全文件锁是一种粗粒度的方法,但它可以防止不一致的更新。并非所有的文件系统都支持全文件锁,因此使用锁文件是常见的做法——一个典型的空文件,其存在表明其相关文件正在使用中。(在大多数文件系统上,创建文件是一种原子操作。)

For Linux, the short answer is you could get some strange information back from a file if there is a concurrent writer. The kernel does use locking internally to run each 阅读() and 写() operation serially. (Although, I forget whether the whole file is locked or if it's on a per-page granularity.) But if the application uses multiple 写() calls to write information to the file, a 阅读() could happen between any of those calls, so it could see inconsistent data. This is an 原子性违反 in the operating system.

正如 mdma 所提到的,您可以使用 file locking来确保一次只有一个读取器和一个写入器。这听起来像 NTFS 使用 强制锁定,如果一个程序锁定文件,所有其他程序在尝试访问它时都会得到错误消息。

Unix 程序通常根本不使用锁定,而当它们使用时,锁定通常是 咨询。通知锁只能防止其他进程获得同一文件上的通知锁; 它实际上阻止读或写。(也就是说,它只为那些检查锁的人锁定文件。)