用户A要求系统读取文件foo
,同时用户B想要将他或她的数据保存到同一文件中。如何在文件系统级别处理这种情况?
答案 0 :(得分:45)
大多数文件系统(但不是全部)使用锁定来保护对同一文件的并发访问。锁可以是独占的,因此获得锁的第一个用户可以访问 - 后续用户会收到“拒绝访问”错误。在您的示例场景中,用户A将能够读取文件并获取文件锁定,但是当用户A正在阅读时,用户B将无法写入。
某些文件系统(例如NTFS)允许指定锁定级别,以允许例如并发读取器,但不允许编写器。也可以使用字节锁。
与数据库不同,文件系统通常不是事务性的,不是原子的,并且不会隔离来自不同用户的更改(如果甚至可以看到更改 - 锁定可能会禁止此操作。)
使用整个文件锁是一种粗粒度方法,但它可以防止不一致的更新。并非所有文件系统都支持整个文件锁,因此通常的做法是使用锁文件 - 一个通常为空的文件,其存在表明其关联文件正在使用中。 (在大多数文件系统上创建文件是一种原子操作。)
答案 1 :(得分:33)
对于Linux,简短的回答是,如果有并发编写器,您可以从文件中获取一些奇怪的信息。内核确实在内部使用锁定来串行运行每个 read()和 write()操作。 (虽然,我忘记了整个文件是否被锁定,或者它是否按页面粒度。)但如果应用程序使用多个 write()调用将信息写入文件,则 read()可能发生在任何这些调用之间,因此它可能会看到不一致的数据。这是操作系统中的atomicity violation。
正如mdma所提到的,你可以使用file locking来确保一次只有一个读者和一个作者。听起来像NTFS使用强制锁定,如果一个程序锁定文件,所有其他程序在尝试访问时都会收到错误消息。
Unix程序通常根本不使用锁定,当它们执行时,锁定通常是 advisory 。咨询锁仅阻止其他进程获取同一文件的建议锁;它不实际上阻止了读或写。 (也就是说,它只为那些检查锁定的人锁定文件。)