Ich erinnere mich vage daran, irgendwo gelesen zu haben, dass es in einigen Unices eine Möglichkeit gab, eine vorhandene Datei zum Schreiben zu öffnen, mit einem Flag, das den Kernel aufforderte, die alte Version zu verwenden (für andere Prozesse, die zum Lesen darauf zugreifen), bis die "neue" msgstr "" "Version wurde vollständig geschrieben (fd geschlossen), ab diesem Zeitpunkt erschien die Datei als neue Version.
Mit anderen Worten, andere Prozesse sahen entweder die alte Version oder die neue, niemals eine unvollständig geschriebene.
Kann mich jemand mit Kenntnissen auf eine Referenz verweisen?
kernel
open-files
Eudoxos
quelle
quelle
Antworten:
Was Sie beschreiben, klingt genau wie eine grundlegende Umbenennung, um eine Datei zu überschreiben.
Wenn Sie eine Datei umbenennen / über eine andere verschieben, wird die Verknüpfung der alten Datei aufgehoben. Das heißt, die Datei ist noch vorhanden, befindet sich jedoch nicht mehr im Dateisystembaum. Daher können alte Anwendungen weiterhin auf die Datei zugreifen, solange sie geöffnet bleiben. Sobald alle Anwendungen die alte Datei geschlossen haben, ist sie tatsächlich nicht auf der Festplatte zugeordnet.
Der
rename
Systemaufruf ist eine atomare Operation. Dazu erstellen Sie eine neue Datei unter einem anderen Namen und rufen dannrename
auf, um die temporäre Datei in die zu ersetzende Datei umzubenennen. Da die Operation atomar ist, gibt es absolut keinen Zeitraum, in dem die Datei fehlt. Es geht sofort von der alten zur neuen Datei über.Beachten Sie jedoch, dass sich die temporäre Datei und die zu ersetzende Datei auf demselben Einhängepunkt befinden müssen.
quelle
rename
Swap-Sache zu tun . Selbst wenn es eine solche 'OS-Funktion' gäbe, von der Sie sprechen, müsste das Programm noch geschrieben werden, um auch davon zu profitieren. Was ist der Unterschied?open
Syscall ein (möglicherweise nicht unterstütztes) Flag übergeben oder das, was Sie beschreiben, von Hand ausführen müssen.Wie Patrick schreibt , besteht die übliche Methode darin, die neue Version in eine separate Datei zu schreiben und die neue Version nach Beendigung in den alten Dateinamen umzubenennen und diese atomar zu überschreiben. Diese zweite Operation wird als Überschreiben durch Umbenennen bezeichnet .
Nun einige Referenzen:
ISO C muss
rename
atomar sein. Aus den Open Group Base-Spezifikationen :Alte Versionen von Mac OS X hatten keine atomaren Umbenennungen. Dies ist angeblich in Lion behoben.
Btrfs verstößt anscheinend absichtlich gegen den Standard, indem es aus Leistungsgründen keine atomaren Umbenennungen garantiert . Das Überschreiben durch Umbenennen ist jedoch immer noch atomar , was alles ist , was Sie für diesen Zweck benötigen.
quelle
man 3p rename
sagt mir, dasrename
ist in der Tat atomar, und ich denke, das ist für alle Linux-Dateisysteme gedacht. Und wenn ich den ersten Artikel lese, den Sie verlinkt haben, denke ich immer noch, dass Btrfs-Umbenennungsoperationen atomar sind.Das erinnert mich an Allocate On Flush . Wenn ein Dateisystem diese Funktion verwendet, subtrahiert es, anstatt Daten direkt auf die Festplatte zu schreiben, die Größe der zu schreibenden Daten vom Zähler für den freien Speicherplatz der Festplatte und speichert die Daten im Speicher, bis ein Synchronisationssystemaufruf ausgeführt wird oder der Kernel entscheidet die schmutzigen Puffer zu spülen.
Wenn in diesem Fall die Datei von einem Prozess geändert und von einem anderen Prozess geöffnet wird, wird für den letzteren Prozess die nicht geänderte ( oder "alte" ) Version der Datei "angezeigt " .
Die obigen Angaben sind natürlich theoretisch und hängen von verschiedenen Faktoren ab, und ich würde sagen, dass sie etwas unvorhersehbar sind, da Sie nicht genau wissen, wann der Kernel die schmutzigen Seiten leeren wird. Unter Linux ( wie Sie auch in Abschnitt 15.3 unter Grundlegendes zum Linux-Kernel nachlesen können ) werden die fehlerhaften Seiten unter den folgenden Bedingungen auf die Festplatte geschrieben:
Der Seiten-Cache wird zu voll und es werden mehr Seiten benötigt oder die Anzahl der verschmutzten Seiten wird zu groß.
Es ist zu viel Zeit vergangen, seit eine Seite schmutzig geblieben ist.
Ein Prozess fordert an, dass alle ausstehenden Änderungen eines Blockgeräts oder einer bestimmten Datei gelöscht werden. Dazu wird ein Systemaufruf sync (), fsync () oder fdatasync () aufgerufen.
Es ist bekannt, dass diese Funktion in den Dateisystemen HFS +, XFS, Reiser4, ZFS, Btrfs und ext4 implementiert ist.
quelle