実行ファイルのロック:Windowsは行いますが、Linuxは行いません。どうして?


82

Windows(.exeまたは.dll)でファイルを実行すると、ファイルがロックされ、削除、移動、または変更できないことに気付きました。

Linuxは、他の一方で、実行ファイルをロックしていない、あなたがすることができ、削除、移動、またはそれらを変更します。

LinuxがロックしないのにWindowsがロックするのはなぜですか?ロックすることに利点はありますか?


6
特定のファイルをロックするプロセスを表示できるエクスプローラーのコンテキストメニューにメニューエントリを追加するWhoLockMeと呼ばれるユーティリティがあります。奇妙なファイルロックエラーが発生した場合に非常に便利です。編集:これは質問に答えないことは知っていますが、(コメントだけではなく)別の答えを保証するのに十分に役立つと思いました。
JesperE 2008年

回答:


106

Linuxには参照カウントメカニズムがあるため、実行中にファイルを削除できます。ファイルのハンドルが開いているプロセス(以前に開いたプロセス)がある限り、ファイルは存続します。ファイルを削除すると、ファイルのディレクトリエントリが削除されるため、それ以上開くことはできませんが、このファイルをすでに使用しているプロセスは引き続き使用できます。このファイルを使用するすべてのプロセスが終了すると、ファイルは自動的に削除されます。

Windowsにはこの機能がないため、ファイルから実行されているすべてのプロセスが終了するまで、ファイルを強制的にロックします。

Linuxの動作が望ましいと思います。おそらくいくつかの深いアーキテクチャ上の理由がありますが、私が最も説得力があると思う主な(そして単純な)理由は、Windowsではファイルを削除できないことがあり、その理由がわからず、何らかのプロセスがファイルを保持していることだけです使用する。Linuxではそれは決して起こりません。


2
WindowsのProcessExplorerなどのツールを使用して、ファイル/フォルダーを使用しているプロセスを確認できることに注意してください。
j c

14
Linuxの動作を支持する実際的な理由は、システムの実行中にOSやその他のソフトウェアを更新でき、再起動しない/めったに再起動しないことです(再起動せずに実行中のカーネルを切り替えることもできます。それは、呼び出されるだけで十分に難しいだけです。稼働時間が重要なアプリケーションの場合)。
joelhardi 2008年

6
「Windowsにはこの機能がありません」...よろしいですか?NTカーネルは、ハンドルと参照を使用してオブジェクトを参照することに基づいています。
アダムミッツ

10
Windowsには実際に設定できる3ビットがあり、ファイルを開いているときに別のプロセスがファイルに対して実行できることを定義します。FILE_SHARE_DELETEビットが設定されていれば、開いているファイルを削除できます。PEローダー(EXEとDLLをロードする)がこのビットを設定するとは思わない。ハンドルは参照カウントされ、削除すると、最後のハンドルが削除されるとファイルが削除されますが、Unixとの違いは、これが発生すると、NTが同じ名前での新しいファイルの作成をブロックすることです。
asveikau 2013

2
comonadが言うことは完全に間違っています、NTFSはもちろんハードリンクを使用し、常に使用していました。シンボリックリンクはWindowsVistaに追加されました。Windowsがrefcopuntingを使用しないことも完全に間違っています。それは、CreateFileのようなAPIを読み取るだけで、どのような状況でファイルが削除可能であるかなどが明確に示されています。そして、それは質問に対する本当の答えにも適切な場所です。CreateFileには、開かれたファイルの必須ロックを制御し、アプリケーションが決定できるようにする引数claleddwShareModeがあります。デフォルト値は...排他ロックである
トルステンSchöning

29

私の知る限り、Linux実行可能ファイルの実行時に実行可能ファイルをロックしますが、iノードをロックします。これは、「ファイル」を削除できるが、iノードはファイルシステム上にあり、変更されておらず、実際に削除したのはリンクだけであることを意味します。

Unixプログラムは、ファイルシステムについて常にこの考え方を使用し、一時ファイルを作成して開き、名前を削除します。あなたのファイルはまだ存在しますが、名前は他の人が使用できるように解放され、他の人はそれを見ることができません。


「いつも」?例はありますか?
メズ

4
「unixsecure一時ファイル」についてグーグルに尋ねると、それがよく知られていて一般的に使用されていることを示すのに十分なテクニックの説明が見つかります。具体的な例はありませんが、一時ファイルを使用するセキュリティを意識したアプリならどれでもこれを行うことができます。
Dave Sherohman 2008年

26

Linuxはファイルをロックします。実行中のファイルを上書きしようとすると、「ETXTBUSY」(テキストファイルがビジー)になります。ただし、ファイルを削除することはできます。カーネルは、ファイルへの最後の参照が削除されたときにファイルを削除します。(マシンが正常にシャットダウンされなかった場合、これらのファイルは、ファイルシステムがチェックされたときに「削除されたiノードのd-timeがゼロでした」メッセージの原因です。実行中のプロセスがそれらを参照していたため、完全には削除されませんでした。そして今、彼らはそうです。)

これにはいくつかの大きな利点があります。実行可能ファイルを削除して置き換え、プロセスを再起動することで、実行中のプロセスをアップグレードできます。initでさえ、このようにアップグレードし、実行可能ファイルを置き換えてシグナルを送信することができ、再起動せずにそれ自体を再実行します。(これは通常、アップグレードの一部としてパッケージ管理システムによって自動的に行われます)

Windowsでは、使用中のファイルを置き換えることは大きな手間であるように見えます。通常、プロセスが実行されていないことを確認するために再起動が必要です。

非常に大きなログファイルがあり、それを削除したが、そのファイルにログを記録していたプロセスにファイルを再度開くように指示するのを忘れると、参照が保持され、不思議に思うなど、いくつかの問題が発生する可能性があります。ディスクが突然多くの空き領域を取得しなかった理由。

Linuxで一時ファイルにこのトリックを使用することもできます。ファイルを開いて削除してから、引き続きファイルを使用してください。プロセスが終了すると(理由が何であれ、電源障害であっても)、ファイルは削除されます。

lsofやfuserのようなプログラム(または/ proc // fdをざっと見て回る)は、名前がなくなったファイルを開いているプロセスを表示できます。


6

linux / unixは、マルチユーザーシステムとしてゼロから構築されているため、同じロックメカニズムを使用していないと思います。これにより、複数のユーザーが同じファイルを使用する可能性があります。

ロックすることに利点はありますか?そうですね、OSが管理しなければならないポインタの量を減らすことができるかもしれませんが、今日では節約の量はごくわずかです。ロックすることで私が考えることができる最大の利点はこれです:ユーザーが見ることができる曖昧さをいくらか節約できます。ユーザーaがバイナリファイルを実行していて、ユーザーbがそれを削除した場合、実際のファイルはユーザーAのプロセスが完了するまでそのままにしておく必要があります。それでも、ユーザーBまたは他のユーザーがファイルシステムでファイルを探すと、ファイルシステムを見つけることができませんが、スペースを占有し続けます。私にとってはそれほど大きな懸念ではありません。

主に、ウィンドウのファイルシステムとの下位互換性に関する問題だと思います。


このコンテキストでの「Windows」は、WindowsNTラインです。これは、シングルユーザーのWindows3.11の後継としてマルチユーザーとして設計されました。Multicsの後継であるシングルユーザーであるUnixと比較してください。
MSalters 2008年

6

あなたはWindowsについて絶対的すぎると思います。通常、実行可能ファイルのコード部分にスワップスペースを割り当てません。代わりに、実行可能およびDLLをロックします。破棄されたコードページが再度必要になった場合は、単に再読み込みされます。ただし、/ SWAPRUNを使用すると、これらのページはスワップ状態に保たれます。これは、CDまたはネットワークドライブ上の実行可能ファイルに使用されます。したがって、Windowsはこれらのファイルをロックする必要はありません。

.NETの場合は、シャドウコピーを参照してください。


1

ファイル内の実行されたコードをロックする必要があるかどうかは設計上の決定であり、実際には明らかな利点があるため、MSは単にロックすることを決定しました。そうすれば、どのバージョンのどのコードがどのアプリケーションで使用されているかを知る必要がありません。これはLinuxのデフォルトの動作に関する大きな問題であり、ほとんどの人が単に無視しています。システム全体のライブラリが置き換えられた場合、どのアプリがそのようなライブラリのコードを使用しているかを簡単に知ることはできません。ほとんどの場合、パッケージマネージャーがそれらのライブラリの一部のユーザーを認識して再起動するのが最善です。しかし、それは一般的でよく知られているもの、たとえばPostgresとそのライブラリなどでのみ機能します。より興味深いシナリオは、いくつかのサードパーティライブラリに対して独自のアプリケーションを開発し、それらが置き換えられる場合です。ほとんどの場合、パッケージマネージャーは単にアプリを認識していないためです。そしてそれは」■ネイティブCコードなどの問題だけでなく、ほとんどすべての問題で発生する可能性があります。mod_perlでhttpdを使用し、パッケージマネージャーを使用してインストールされたいくつかのPerlライブラリを使用し、何らかの理由でパッケージマネージャーにそれらのPerlライブラリを更新させます。依存関係がわからないという理由だけで、httpdは再起動しません。このような例はたくさんあります。ファイルには、実行時にメモリ内で使用されているコードが含まれている可能性があるためです。Java、Pythonなどを考えてみてください。

したがって、デフォルトでファイルをロックするのが良い選択かもしれないという意見を持つのには十分な理由があります。ただし、その理由に同意する必要はありません。

では、MSは何をしましたか?彼らは、呼び出し元のアプリケーションにファイルをロックするかどうかを決定する機会を与えるAPIを作成しただけですが、このAPIのデフォルト値は、最初の呼び出し元のアプリケーションに排他ロックを提供することであると判断しました。CreateFileとそのdwShareMode引数に関するAPIを見てください。これが、一部のアプリケーションで使用中のファイルを削除できない場合がある理由です。ユースケースを気にせず、デフォルト値を使用したため、Windowsによってファイルの排他ロックが取得されました。

Windowsについて何かを言っている人が、ハンドルをカウントする参照を使用していない、またはハードリンクなどをサポートしていないと信じないでください。これは完全に間違っています。HANDLEを使用するほとんどすべてのAPIは、参照カウントに関する動作を文書化しており、実際にはハードリンクをサポートし、常にサポートしているNTFSに関するほぼすべての記事を簡単に読むことができます。Windows Vista以降、シンボリックリンクもサポートされており、特定のファイルなどのすべて読み取るAPIを提供することで、ハードリンクのサポートが改善されています

さらに、Ext4などでファイルを記述するために使用される構造を、多くの共通点があるNTFSの構造と比較したいだけかもしれません。どちらも、ファイル名などの属性からデータを分離するエクステントの概念で機能します。iノードは、古いが類似した概念のほぼ別の名前です。ウィキペディアでさえ、その記事に両方のファイルシステムをリストしています。

デフラグと同じように、ネット上の他のOSと比較して、Windowsのファイルロックには本当に多くのFUDがあります。このFUDの一部は、ウィキペディアを少し読むだけで除外できます。


共有依存関係のバージョン管理に関するとりとめのないことは関係ありません。それらを更新するために再起動が必要な場合でも、これらの問題に対処する必要があります。Windowsでは、DLLhellという名前もあります。さらに、あなたが説明するその周りのランタイム動作は、ファイルがすでにメモリにロードされていて、利用可能なままであるLinuxの場合によって完全に処理されます。Windowsがファイルのロックを解除するために再起動を強制するときと同じように、アプリケーションは再起動するまで古いバージョンで実行され続けます。その面での利点はありません。
jpmc 2619年

もちろん、DLL地獄は完全に要点を失っており、90年代はもうありません。ただ、などについて読んでくださいWinSxS。さらに、それはメモリに物をロードしてそこに保持することではなく、Windowsは必要に応じてそれを正確に実行します。ファイルを置き換える必要があるかどうかを知り、決定し、誰がそれを決定するかを決定します。Windows-APIは、ファイルの最初のユーザーが決定できるようにするだけであり、それは非常に理にかなっています。
トルステンSchöning

しかし、それが私のポイントです。使用するDLLのバージョンを決定することは、DLL地獄の一部です。Windowsの古い特異な動作のいくつかと区別したい場合は、「依存関係地獄」と呼んでください。とにかく、実行可能ファイルをロックするようにデフォルト設定しても、共有依存関係の管理には役立ちません。まったく。特定のファイルに依存するものは、アップグレードしようとしても実行されていない可能性があります。特別な安全性はありません。依存関係を共有する2つの選択肢があります。実行しようとすると問題が発生するリスクがあるすべてのユーザーに無料で提供するか、インストールを妨げるリスクがあるパッケージマネージャーです。
jpmc 2619年

この質問は、使用するEXEまたはDLLを決定することではなく、デフォルトで後で何が発生するか、およびその理由についてです。あなたは完全に異なるトピックについて話し合っています。ロックは、どのEXEまたはDLLを実行するかを決定した後に使用され、最初のユーザー(この例ではWindows自体)による追加の制御を取得し、その制御について他のユーザーに通知します。そして、「他の人」にWindowsが必要とするファイルを何らかの理由で削除または書き込みさせないようにして、それらをロックしないようにすることは、もちろん、追加の調整のためのメカニズムです。
トルステンSchöning

1
一部のEXEまたはDLLは、とにかく「メモリ内」にない可能性が高いですが、デフォルトでそれにマップされています。マッピングではファイルの内容が利用可能である必要があるため、ファイルの内容を任意に置き換えることはデフォルトでは安全でないと見なされ、何をしているのかを知る必要があります。ロックされたEXEまたはDLLに驚いた場合、これは明らかに当てはまりません。OTOH、他のすべてのファイルはデフォルトでのみロックされるため、必ずしもそうとは限りません。そのため、アプリは、ユースケースに応じて、書き込み操作と削除操作のどちらを許可するかを決定できます。アプリの開発者は、任意のユーザーよりも、ファイルの使用方法と安全な操作をよく知っている必要があります。
トルステンSchöning

0

NTバリアントには

openfiles

コマンド。どのプロセスがどのファイルにハンドルを持っているかを示します。ただし、システムグローバルフラグ 'オブジェクト一覧の更新'を有効にする必要があります。

openfiles / local /?

これを行う方法と、そうすることでパフォーマンスの低下が発生することも説明します。


0

実行可能ファイルは、実行時にメモリに段階的にマップされます。つまり、実行可能ファイルの一部が必要に応じてロードされます。すべてのセクションがマップされる前にファイルがスワップアウトされると、重大な不安定性が発生する可能性があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.