Benutzer A fordert das System auf, die Datei foo
zu lesen, und gleichzeitig möchte Benutzer B seine Daten in der gleichen Datei speichern. Wie wird diese Situation auf Dateisystemebene behandelt?Wie behandeln Dateisysteme gleichzeitiges Lesen/Schreiben?
Antwort
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.)
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.)
- 1. Pseudo-Dateisysteme auf * nix
- 2. Gleichzeitiges Schreiben mit sqlite3
- 3. Welche Dateisysteme unterstützen Java UserDefinedFileAttributeView?
- 4. Gleichzeitiges Einfügen und Aktualisieren Postgres
- 5. Gleichzeitiges Schreiben in mehrere Dateien
- 6. Gleichzeitiges Schreiben in Zip-Datei
- 7. SQLite für gleichzeitiges Lesen geeignet?
- 8. gleichzeitiges Schreiben in dieselbe Speicheradresse
- 9. Linux du Befehl ohne durchlaufende Dateisysteme
- 10. Dateisysteme mit Unterstützung für Verzeichnis Hard-Linking
- 11. Gleichzeitiges Schreiben in Datei von AJAX-Anforderung
- 12. PDI: Gleichzeitiges Abwickeln zweier Arrays von MongoDB
- 13. Gleichzeitiges Lesen und async_read_some in Boost asio
- 14. Wie viel reservieren moderne Dateisysteme für jede Blockgruppe?
- 15. Gleichzeitiges Schreiben von Dateien mit Python Multiprocessing
- 16. Gleichzeitiges Anzeigen mehrerer Quelldateien mit MonoDevelop
- 17. Wie zwei Dokumenttypen behandeln?
- 18. Wie Ausnahme behandeln zweimal
- 19. Gibt es irgendwelche Dateisysteme, die keine Dateipfade verwenden?
- 20. wie SVG Pixelfang zu behandeln
- 21. Wie mit NULL behandeln Werte
- 22. Wie ETIMEDOUT Fehler zu behandeln?
- 23. Wie Vertragsverletzungen behandeln, wenn NUnit
- 24. Wie behandeln Datenbanken redundante Werte?
- 25. Wie KVM physischen Interrupt behandeln?
- 26. Wie behandeln Web-Crawler Javascript?
- 27. wie Ausnahmen in Python behandeln
- 28. Wie lambda Ausdruck zu behandeln
- 29. Gleichzeitiges Einfügen in mehrere Remote-Repositories in IntelliJ
- 30. Verteilte Dateisysteme: GridFS vs GlusterFS vs Ceph vs HekaFS Benchmarks
Funktioniert das Sperren der gesamten Datei oder von Teilen (Blöcken/Inodes/was auch immer) davon? –
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