2010-05-01 7 views

Antwort

35

Die meisten Dateisysteme (aber nicht alle) verwenden Sperren, um den gleichzeitigen Zugriff auf die gleiche Datei zu schützen. Die Sperre kann exklusiv sein, sodass der erste Benutzer, der die Sperre erhält, Zugriff erhält - nachfolgende Benutzer erhalten einen Fehler "Zugriff verweigert". In Ihrem Beispielszenario kann Benutzer A die Datei lesen und erhält die Dateisperre, aber Benutzer B kann nicht schreiben, während Benutzer A liest.

Einige Dateisysteme (z. B. NTFS) ermöglichen die Festlegung der Sperrebene, um beispielsweise gleichzeitige Leser, aber keine Schreiber zu ermöglichen. Byte-Range-Sperren sind ebenfalls möglich.

Im Gegensatz zu Datenbanken, Dateisysteme sind in der Regel nicht Transaktions-, nicht atomar und Änderungen von verschiedenen Benutzern sind nicht isoliert (wenn Änderungen noch zu sehen sind - Verriegelungs dies untersagt.)

Mit Volldateisperren ein grob gekörnt Ansatz, aber es wird vor inkonsistenten Updates schützen. Nicht alle Dateisysteme unterstützen Sperren für ganze Dateien. Daher ist es üblich, eine Sperrdatei zu verwenden - eine normalerweise leere Datei, deren Vorhandensein angibt, dass die zugehörige Datei verwendet wird. (Eine Datei zu erstellen ist eine atomare Operation auf den meisten Dateisystemen.)

+0

Funktioniert das Sperren der gesamten Datei oder von Teilen (Blöcken/Inodes/was auch immer) davon? –

+1

Die Antwort ist Dateisystem-spezifisch (wie Sie zweifellos aus den anderen Antworten erhalten haben). Windows verwendet in den meisten Fällen eine ganze Dateisperre, da dies Teil der API zum Öffnen von Dateien (CreateFile) ist. Byte-Range-Locking ist verfügbar, aber Anwendungen müssen speziell eine Sperre für einen Bereich einer Datei mit einer anderen API-Funktion (LockFile) anfordern. – mdma

26

Für Linux, die kurze Antwort ist, dass Sie einige seltsamen Informationen zurück aus einer Datei bekommen könnten, wenn es ein gleichzeitiger Schriftsteller . Der Kernel verwendet das interne Sperren, um jede Operation lesen() und write() seriell auszuführen. (Obwohl ich vergessen, ob die gesamte Datei gesperrt ist oder wenn es auf einem Pro-Seitengranularität.) Aber wenn die Anwendung verwendet mehr write() Informationen in die Datei zu schreiben, ruft eine read() könnte passieren, zwischen alle diese Aufrufe, sodass inkonsistente Daten angezeigt werden. Dies ist ein atomicity violation im Betriebssystem.

Wie mdma erwähnt hat, könnten Sie file locking verwenden, um sicherzustellen, dass es immer nur einen Leser und einen Schreiber gibt. Es klingt wie NTFS verwendet obligatorischen Sperren, wo, wenn ein Programm die Datei sperrt, erhalten alle anderen Programme Fehlermeldungen, wenn sie versuchen, darauf zuzugreifen.

Unix-Programme verwenden in der Regel überhaupt keine Sperre, und wenn sie dies tun, ist die Sperre in der Regel Advisory. Eine beratende Sperre verhindert nur, dass andere Prozesse eine beratende Sperre für dieselbe Datei erhalten. es nicht verhindert tatsächlich das Lesen oder Schreiben. (Das heißt, es sperrt nur die Datei für diejenigen, die die Sperre überprüfen.)

Verwandte Themen