回答:
理由は、実行中にUnixが実行可能ファイルをロックしないか、Linuxのように実行可能であっても、このロックはファイル名ではなくiノードに適用されるためです。つまり、ファイルを開いたままにするプロセスは、ファイルが削除(実際にはリンク解除)され、同じ名前の新しいファイルに置き換えられた後でも、同じ(古い)データにアクセスします。
これは、UnixとWindowsの主な違いの1つです。後者は、ファイル名とiノードの間にレイヤーがないため、ロックされているファイルを更新できません。通常、完全な再起動が必要なため、パッケージの更新やインストールが面倒です。
実行可能ファイルは通常、一度開かれ、ファイル記述子に添付され、単一の実行期間中に再度開かれたバイナリへのファイル記述子はありません。たとえば、を実行した場合bash
、exec()
通常は、/bin/bash
呼び出し時に一度だけポイントされたiノードのファイル記述子を作成します。
これは、実行中に(呼び出されたパスを使用して)実行中に自分自身の再読み取りを試行しない単純なバイナリの場合、キャッシュされたコンテンツはダングリングiノードとして有効なままになることを意味します。これは、実行可能ファイルの以前のバージョンのレプリカが本質的に存在することを意味します。
より複雑な場合、これは問題を引き起こす可能性があります。たとえば、構成ファイルをアップグレードしてから再読み取りしたり、プログラムを実行元のパスから再実行したりできます。プログラムが相互接続されていて、1つがアップグレードの前に実行され、1つが(おそらく最初のプログラムによって)実行された場合にも問題が発生する可能性があります。これは、一部のライブラリにも当てはまります。
ただし、単純なユースケースでは、プロセスを再起動せずにアップグレードしても安全です。
bash
バイナリは約200の4Kページであり、それらがすべて平均セッションで使用されるかどうかはわかりません。
ialloc()
、ページ自体のメモリマッピングではなく、読み取り時にカーネル構造体へのing について話していました。現代のext *ファイルシステムでは、iノードは最終的にカーネル内(およびVMサブシステム内)で一貫していると思いますか?