Wie gehen Dateisysteme mit gleichzeitigem Lesen / Schreiben um?

70

Benutzer A fordert das System auf, die Datei zu lesen, foound gleichzeitig möchte Benutzer B seine Daten in derselben Datei speichern. Wie wird mit dieser Situation auf Dateisystemebene umgegangen?

Matteo Riva
quelle

Antworten:

55

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

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

Im Gegensatz zu Datenbanken sind Dateisysteme in der Regel nicht transaktional, nicht atomar und Änderungen von verschiedenen Benutzern werden nicht isoliert (wenn Änderungen überhaupt sichtbar sind - Sperren können dies verhindern.)

Die Verwendung von Sperren für ganze Dateien ist ein grobkörniger Ansatz, der jedoch vor inkonsistenten Aktualisierungen schützt. Nicht alle Dateisysteme unterstützen Sperren für ganze Dateien. Daher ist es üblich, eine Sperrdatei zu verwenden - eine normalerweise leere Datei, deren Vorhandensein darauf hinweist, dass die zugehörige Datei verwendet wird. (Das Erstellen einer Datei ist auf den meisten Dateisystemen eine atomare Operation.)

mdma
quelle
Funktioniert das Sperren auch für die gesamte Datei oder für Teile (Blöcke / Inodes / was auch immer)?
Matteo Riva
3
Die Antwort ist dateisystemspezifisch (wie Sie zweifellos aus den anderen Antworten gelernt haben). Windows verwendet in den meisten Fällen die Sperre ganzer Dateien, da dies Teil der API zum Öffnen von Dateien ist (CreateFile). Das Sperren im Bytebereich ist verfügbar, Anwendungen müssen jedoch speziell eine Sperre für einen Bereich einer Datei mithilfe einer anderen API-Funktion (LockFile) anfordern.
Mdma
42

Unter Linux lautet die kurze Antwort: Wenn ein gleichzeitiger Writer vorhanden ist, können Sie einige seltsame Informationen aus einer Datei zurückerhalten. Der Kernel verwendet die interne Sperrung, um jede Lese- () und Schreiboperation () seriell auszuführen . (Obwohl ich vergesse, ob die gesamte Datei gesperrt ist oder ob es sich um eine Seitengranularität handelt.) Wenn die Anwendung jedoch mehrere write () -Aufrufe verwendet, um Informationen in die Datei zu schreiben , kann zwischen diesen Aufrufen ein read () auftreten , so dass inkonsistente Daten angezeigt werden konnten. Dies ist eine Atomitätsverletzung im Betriebssystem.

Wie von mdma erwähnt, können Sie die Dateisperrung verwenden , um sicherzustellen, dass jeweils nur ein Leser und ein Schreiber vorhanden sind. Es hört sich so an, als ob NTFS die obligatorische Sperrung verwendet , als ob . Wenn ein Programm die Datei sperrt, erhalten alle anderen Programme Fehlermeldungen, wenn sie versuchen, darauf zuzugreifen.

Unix-Programme verwenden im Allgemeinen überhaupt keine Sperre, und wenn dies der Fall ist, ist die Sperre normalerweise ratsam . Eine Beratungssperre verhindert nur, dass andere Prozesse eine Beratungssperre für dieselbe Datei erhalten. es verhindert nicht wirklich das Lesen oder Schreiben. (Das heißt, die Datei wird nur für diejenigen gesperrt, die die Sperre überprüfen.)

Karmastan
quelle