Frage Locking Executing Files: Windows tut, Linux nicht. Warum?


Ich habe bemerkt, wenn eine Datei unter Windows (.exe oder .dll) ausgeführt wird, ist sie gesperrt und kann nicht gelöscht, verschoben oder geändert werden.

Linux dagegen sperrt die Ausführung von Dateien und Sie nicht kann löschen, verschieben oder ändern.

Warum sperrt Windows, wenn Linux nicht? Hat das Sperren einen Vorteil?


75
2017-10-13 07:05


Ursprung


Antworten:


Linux verfügt über einen Verweiszählungsmechanismus, sodass Sie die Datei während der Ausführung löschen können, und sie wird so lange weiter bestehen, wie ein Prozess (der sie zuvor geöffnet hat) über ein geöffnetes Handle verfügt. Der Verzeichniseintrag für die Datei wird entfernt, wenn Sie sie löschen, sodass sie nicht mehr geöffnet werden kann, aber Prozesse, die diese Datei bereits verwenden, können sie weiterhin verwenden. Sobald alle Prozesse, die diese Datei verwenden, beendet sind, wird die Datei automatisch gelöscht.

Windows verfügt nicht über diese Fähigkeit, daher ist es gezwungen, die Datei zu sperren, bis alle Prozesse, die von ihr ausgeführt werden, abgeschlossen sind.

Ich glaube, dass das Linux-Verhalten vorzuziehen ist. Es gibt wahrscheinlich einige tiefgründige architektonische Gründe, aber der wichtigste (und einfachste) Grund, den ich am überzeugendsten finde, ist, dass man in Windows manchmal eine Datei nicht löschen kann, man hat keine Ahnung warum, und alles, was man weiß, ist, dass ein Prozess es einhält benutzen. In Linux passiert es nie.


96
2017-10-13 07:18



Soweit ich weiß, Linux tut Sperren ausführbare Dateien, wenn sie ausgeführt werden - jedoch sperrt sie die Inode. Dies bedeutet, dass Sie die "Datei" löschen können, aber der Inode ist immer noch im Dateisystem, unberührt und alles, was Sie wirklich gelöscht haben, ist ein Link.

Unix-Programme verwenden diese Art des Nachdenkens über das Dateisystem die ganze Zeit, erstellen eine temporäre Datei, öffnen sie, löschen den Namen. Ihre Datei ist noch vorhanden, aber der Name ist für andere Benutzer freigegeben und niemand kann sie sehen.


26
2017-10-13 07:19



Linux sperrt die Dateien. Wenn Sie versuchen, eine Datei zu überschreiben, die ausgeführt wird, erhalten Sie "ETXTBUSY" (Textdatei beschäftigt). Sie können die Datei jedoch entfernen, und der Kernel löscht die Datei, wenn die letzte Referenz darauf entfernt wurde. (Wenn die Maschine nicht ordnungsgemäß heruntergefahren wurde, sind diese Dateien die Ursache für die Meldung "Deleted inode has no d-time", wenn das Dateisystem überprüft wurde. Sie wurden nicht vollständig gelöscht, da ein laufender Prozess einen Verweis darauf hatte. und jetzt sind sie.)

Dies hat einige wichtige Vorteile. Sie können einen laufenden Prozess aktualisieren, indem Sie die ausführbare Datei löschen, sie ersetzen und den Prozess anschließend neu starten. Selbst init kann so aktualisiert werden, die ausführbare Datei ersetzen und ein Signal senden, und es wird sich selbst reexec () ausführen, ohne dass ein Neustart erforderlich ist. (Dies wird normalerweise automatisch von Ihrem Paketverwaltungssystem im Rahmen des Upgrades durchgeführt.)

Unter Windows scheint das Ersetzen einer verwendeten Datei ein großer Aufwand zu sein, da normalerweise ein Neustart erforderlich ist, um sicherzustellen, dass keine Prozesse ausgeführt werden.

Es kann einige Probleme geben, zB wenn Sie eine extrem große Protokolldatei haben und Sie sie entfernen, aber vergessen Sie nicht, dem Prozess, der sich an dieser Datei anmeldete, die Datei erneut zu öffnen, sie wird die Referenz halten, und Sie werden sich fragen warum Ihre Festplatte nicht plötzlich viel mehr freien Speicherplatz bekam.

Sie können diesen Trick auch unter Linux für temporäre Dateien verwenden. Öffnen Sie die Datei, löschen Sie sie und fahren Sie fort, die Datei zu verwenden. Wenn Ihr Prozess (aus welchem ​​Grund auch immer - Stromausfall) beendet wird, wird die Datei gelöscht.

Programme wie lsof und fuser (oder einfach herumstochern in / proc // fd) können Ihnen zeigen, in welchen Prozessen Dateien geöffnet sind, die keinen Namen mehr haben.


22
2017-12-30 10:51



Ich denke, Linux / Unix verwendet nicht die gleiche Locking-Mechanik, da sie von Grund auf als Multi-User-System aufgebaut sind - was die Möglichkeit von mehreren Benutzern erwarten würde, die dieselbe Datei verwenden, vielleicht sogar für verschiedene Zwecke.

Hat das Sperren einen Vorteil? Nun, es könnte möglicherweise die Menge an Zeigern reduzieren, die das Betriebssystem verwalten müsste, aber jetzt, an Tagen, ist die Menge an Einsparungen ziemlich vernachlässigbar. Der größte Vorteil, den ich beim Sperren sehen kann, ist folgender: Sie sparen eine vom Benutzer sichtbare Mehrdeutigkeit. Wenn Benutzer a eine Binärdatei ausführt und Benutzer b sie löscht, muss die tatsächliche Datei beibehalten werden, bis der Prozess von Benutzer A abgeschlossen ist. Wenn jedoch Benutzer B oder andere Benutzer das Dateisystem dafür suchen, können sie es nicht finden - es wird jedoch weiterhin Platz beanspruchen. Nicht wirklich eine große Sorge für mich.

Ich denke, es ist eher eine Frage der Rückwärtskompatibilität mit den Dateisystemen von Windows.


5
2017-10-13 07:14



Ich denke du bist zu absolut in Windows. Normalerweise reserviert es keinen Swap-Space für den Codeteil einer ausführbaren Datei. Stattdessen werden die ausführbaren DLLs gesperrt. Wenn verworfene Codepages erneut benötigt werden, werden sie einfach neu geladen. Aber mit / SWAPRUN werden diese Seiten im Tausch gehalten. Dies wird für ausführbare Dateien auf CD- oder Netzwerklaufwerken verwendet. Daher muss Windows diese Dateien nicht sperren.

Für .NET, schau dir an Schattenkopie.


5
2017-10-13 09:46



Wenn der ausgeführte Code in einer Datei gesperrt werden soll oder nicht, handelt es sich um eine Entwurfsentscheidung und MS hat sich einfach entschieden zu sperren, da es in der Praxis deutliche Vorteile hat: So müssen Sie nicht wissen, welcher Code in welcher Version von welcher Anwendung verwendet wird. Dies ist ein großes Problem mit dem Standardverhalten von Linux, das von den meisten Leuten einfach ignoriert wird. Wenn systemweite Bibliotheken ersetzt werden, können Sie nicht leicht herausfinden, welche Anwendungen den Code solcher Bibliotheken verwenden. Die meiste Zeit, die Sie erhalten können, ist, dass der Paketmanager einige Benutzer dieser Bibliotheken kennt und sie neu startet. Aber das funktioniert nur für allgemeine und gut bekannte Dinge wie vielleicht Postgres und seine Bibliotheken oder so. Die interessanteren Szenarien sind, wenn Sie Ihre eigene Anwendung gegen einige 3rd-Party-Bibliotheken entwickeln und diese ersetzt werden, da der Paketmanager die App meist nicht kennt. Und das ist nicht nur ein Problem von nativem C-Code oder so etwas, es kann mit fast allem passieren: Verwenden Sie einfach httpd mit mod_perl und einige Perl-Bibliotheken, die mit einem Paket-Manager installiert wurden, und lassen Sie den Paket-Manager diese Perl-Bibliotheken aus irgendeinem Grund aktualisieren. Es wird Ihren httpd nicht neu starten, nur weil er die Abhängigkeiten nicht kennt. Es gibt viele Beispiele wie diese, einfach weil jede Datei möglicherweise Code enthält, der von irgendeiner Laufzeit im Speicher verwendet wird, denken Sie an Java, Python und all diese Dinge.

Es gibt also einen guten Grund, der Meinung zu sein, dass das Sperren von Dateien standardmäßig eine gute Wahl ist. Sie müssen diesen Gründen jedoch nicht zustimmen.

Was hat MS getan? Sie erstellten einfach eine API, die der aufrufenden Anwendung die Möglichkeit gab zu entscheiden, ob Dateien gesperrt werden sollten oder nicht, aber sie entschieden, dass der Standardwert dieser API darin besteht, der ersten aufrufenden Anwendung eine exklusive Sperre bereitzustellen. Schau dir die API an Erstelle Datei und sein dwShareMode Streit. Das ist der Grund, warum Sie nicht in der Lage sind, Dateien zu löschen, die von einer Anwendung verwendet werden, es ist einfach nicht an Ihrem Anwendungsfall interessiert, hat die Standardwerte verwendet und daher eine exklusive Sperre von Windows für eine Datei erhalten.

Bitte glauben Sie nicht an Leute, die Ihnen etwas über Windows sagen, das Ref-Zählen auf HANDLE nicht benutzt oder Hardlinks nicht unterstützt oder so, das ist völlig falsch. Fast jede API, die HANDLE verwendet, dokumentiert ihr Verhalten in Bezug auf Ref-Zählen und Sie können leicht in fast jedem Artikel über NTFS lesen, dass es Hardlinks unterstützt und immer, seit Windows Vista hat es auch Unterstützung für Symlinks und die Unterstützung für Hardlinks verbessert durch Bereitstellung von APIs für Lesen Sie alle harten Links für eine bestimmte Datei und derartige.

Zusätzlich können Sie sich einfach die Strukturen ansehen, die zum Beschreiben einer Datei in z. Ext4 verglichen mit denen von NTFS, die viel gemeinsam haben. Beide arbeiten mit dem Konzept von Extents, das Daten von Attributen wie dem Dateinamen trennt, und Inodes sind eigentlich nur ein anderer Name für ein älteres, aber ähnliches Konzept. Sogar Wikipedia listet beide Dateisysteme auf Artikel.

Im Vergleich zu anderen Betriebssystemen im Netz gibt es wirklich eine Menge FUD um Dateisperren in Windows, genau wie bei der Defragmentierung. ;-) Etwas von dieser FUD kann ausgeschlossen werden, indem man einfach ein wenig auf der Wikipedia.


2
2018-05-16 08:39



NT-Varianten haben die

OpenFiles

Befehl, der anzeigt, welche Prozesse auf welche Dateien zugreifen. Es muss jedoch das System-Global-Flag 'Objektliste pflegen' aktiviert werden.

openfiles / lokal /?

sagt Ihnen, wie dies zu tun ist und dass dadurch eine Leistungseinbuße entsteht.


0
2017-10-13 09:11