Windows でファイル (.exe または .dll) を実行すると、ファイルがロックされ、削除、移動、または変更できないことに気付きました。
一方、Linux は実行中のファイルをロックせず、それらを削除、移動、または変更できます。
Linux がロックしないのに Windows がロックするのはなぜですか? ロックするメリットある?
Windows でファイル (.exe または .dll) を実行すると、ファイルがロックされ、削除、移動、または変更できないことに気付きました。
一方、Linux は実行中のファイルをロックせず、それらを削除、移動、または変更できます。
Linux がロックしないのに Windows がロックするのはなぜですか? ロックするメリットある?
Linux には参照カウント メカニズムがあるため、ファイルの実行中にファイルを削除できます。ファイルは、(以前に開いた) プロセスが開いているハンドルを持っている限り存在し続けます。ファイルを削除すると、ファイルのディレクトリ エントリが削除されるため、それ以上開くことはできませんが、このファイルを既に使用しているプロセスは引き続き使用できます。このファイルを使用するすべてのプロセスが終了すると、ファイルは自動的に削除されます。
Windows にはこの機能がないため、実行中のすべてのプロセスが終了するまでファイルを強制的にロックします。
Linux の動作が望ましいと思います。おそらくいくつかの深いアーキテクチャ上の理由がありますが、最も説得力のある主な (そして単純な) 理由は、Windows ではファイルを削除できない場合があり、理由がわからず、何らかのプロセスがファイルを保持しているということだけを知っているということです。使用する。Linux では、決して起こりません。
私の知る限り、Linuxは実行中に実行可能ファイルをロックしますが、inodeはロックします。これは、「ファイル」を削除できることを意味しますが、inode はまだファイルシステム上にあり、手つかずのままで、実際に削除したのはリンクだけです。
Unix プログラムは、ファイルシステムについて常にこの考え方を使用し、一時ファイルを作成し、それを開き、名前を削除します。ファイルはまだ存在しますが、名前は他のユーザーが使用できるように解放され、他のユーザーは見ることができません。
Linux はファイルをロックします。実行中のファイルを上書きしようとすると、"ETXTBUSY" (テキスト ファイル ビジー) が発生します。ただし、ファイルを削除することはできます。ファイルへの最後の参照が削除されると、カーネルはファイルを削除します。(マシンが正常にシャットダウンされなかった場合、これらのファイルは、ファイルシステムのチェック時に「削除された i ノードの d-time がゼロでした」というメッセージの原因であり、実行中のプロセスがそれらへの参照を持っていたため、完全には削除されませんでした。そして今はそうです。)
これにはいくつかの大きな利点があります。実行可能ファイルを削除して置き換え、プロセスを再起動することで、実行中のプロセスをアップグレードできます。init でさえ、このようにアップグレードし、実行可能ファイルを置き換え、シグナルを送信することができ、再起動を必要とせずに、それ自体を再 exec() します。(これは通常、アップグレードの一環としてパッケージ管理システムによって自動的に行われます)
Windows では、使用中のファイルを置き換えるのは非常に面倒なようで、通常、プロセスが実行されていないことを確認するために再起動する必要があります。
非常に大きなログファイルがあり、それを削除した場合、そのファイルにログを記録していたプロセスにファイルを再度開くように指示するのを忘れた場合など、いくつかの問題が発生する可能性があります。ディスクの空き容量が急に増えなかった理由。
Linux で一時ファイルにこのトリックを使用することもできます。ファイルを開いて削除し、引き続きファイルを使用してください。プロセスが終了すると (理由に関係なく、停電であっても)、ファイルは削除されます。
lsof や fuser などのプログラム (または単に /proc//fd を調べてみる) を使用すると、名前のなくなったファイルを開いているプロセスを確認できます。
あなたは Windows に絶対的すぎると思います。通常、実行可能ファイルのコード部分にスワップ スペースを割り当てません。代わりに、実行可能ファイルと DLL をロックします。破棄されたコード ページが再度必要になった場合は、単純に再読み込みされます。ただし、/SWAPRUN を使用すると、これらのページはスワップに保持されます。これは、CD またはネットワーク ドライブ上の実行可能ファイルに使用されます。したがって、Windows はこれらのファイルをロックする必要はありません。
.NET については、シャドウ コピーを参照してください。
Linux / UNIX は、マルチユーザー システムとしてゼロから構築されているため、同じロック機構を使用していないと思います。複数のユーザーが同じファイルを使用する可能性が想定されます。
ロックするメリットある?OS が管理しなければならないポインターの量を減らすことができるかもしれませんが、現在では節約できる量はごくわずかです。私が考えるロックの最大の利点は次のとおりです。ユーザーに表示されるあいまいさをいくらか節約できます。ユーザー a がバイナリ ファイルを実行していて、ユーザー b がそれを削除した場合、実際のファイルはユーザー A のプロセスが完了するまで残り続ける必要があります。しかし、ユーザー B やその他のユーザーがファイル システムでファイルを検索しても、ファイルを見つけることはできませんが、スペースを占有し続けます。私にとってはそれほど大きな懸念ではありません。
主に、ウィンドウのファイルシステムとの下位互換性に関する問題だと思います。
NT バリアントには、
ファイルを開く
コマンドは、どのプロセスがどのファイルのハンドルを持っているかを示します。ただし、システム グローバル フラグ「maintain objects list」を有効にする必要があります。
オープンファイル/ローカル/?
これを行う方法と、そうするとパフォーマンスが低下することを示します。