文件系统如何处理并发读/写?
用户A要求系统读取文件foo
,同时用户B要将他或她的数据保存到同一个文件中。 这种情况在文件系统级如何处理?
大多数文件系统(但不是全部)使用locking来防止对同一文件的并发访问。 锁可以是唯一的,所以第一个获得锁的用户可以访问 – 后续的用户会得到“访问被拒绝”的错误。 在您的示例场景中,用户A将能够读取文件并获取文件locking,但用户B在用户A正在读取时将无法写入。
一些文件系统(例如NTFS)允许指定locking级别,以允许例如并发读取器,但不允许作者。 字节范围的锁也是可能的。
与数据库不同的是,文件系统通常不是事务性的,不是primefaces性的,来自不同用户的变化不是孤立的(如果更改甚至可以看到 – locking可能会禁止这一点)。
使用全文件锁是一种粗粒度的方法,但它会防止不一致的更新。 并不是所有的文件系统都支持全文锁,所以通常使用一个锁文件 – 一个典型的空文件,它的存在表明它的关联文件正在被使用。 (创build文件是大多数文件系统上的一个primefaces操作。)
- 维基百科 – 文件locking
对于Linux,简单的答案是如果有一个并发的作者,你可以从文件中得到一些奇怪的信息。 内核使用内部锁来连续运行每个read()和write()操作。 (尽pipe我忘记了整个文件是否被locking,或者它是按照每个页面的粒度)。但是,如果应用程序使用多个write()调用来向文件写入信息,则可能会发生read() ,所以可能会看到不一致的数据。 这在操作系统中是违反primefaces性的 。
正如mdma所提到的,你可以使用文件locking来确保一次只有一个阅读器和一个作者。 这听起来像NTFS使用强制locking ,如果一个程序locking该文件,所有其他程序尝试访问它时会收到错误消息。
Unix程序通常根本不使用锁,当它们这样做的时候,锁通常是build议性的 。 咨询锁只能防止其他进程在同一个文件上获得咨询锁; 它实际上并不妨碍读取或写入。 (也就是说,它只locking那些检查锁的文件。)