オペレーティング システムが、同じ DLL/共有ライブラリをロードする複数の無関係なプロセスを処理する方法を理解しようとしています。私が関心を持っている OS は Linux と Windows ですが、それほどではありませんが Mac も同様です。私の質問に対する答えは、すべてのオペレーティング システムで同じであると思います。
私は明示的なリンクに関して特に興味がありますが、暗黙のリンクについても知りたいです。両方の答えも同じになると思います。
これは、Windows に関してこれまでに見つけた最良の説明です。
「システムは、ロードされたすべてのモジュールのプロセスごとの参照カウントを維持します。LoadLibrary を呼び出すと、参照カウントがインクリメントされます。FreeLibrary または FreeLibraryAndExitThread 関数を呼び出すと、参照カウントが減少します。システムは、参照カウントがゼロに達するか、プロセスが終了したときにモジュールをアンロードします (参照カウントに関係なく)」- http://msdn.microsoft.com/en-us/library/windows/desktop/ms684175%28v=vs.85%29.aspx
しかし、いくつかの疑問が残ります。
1.) 参照カウントを使用する代わりに、関連のないプロセスが同じ DLL を重複してロードしますか (つまり、DLL がメモリ内に複数存在します)? (IE、私が理解していると思うように、各プロセス独自の「アドレス空間」に)
プロセスが終了するとすぐにDLLがアンロードされると、まったく同じDLLを使用する他のプロセスがメモリに重複してロードされると思われます。そうでない場合、システムは参照カウントを無視できません。
2.) それが本当なら、同じプロセスで複数回ロードするときに DLL をカウントする参照のポイントは何ですか? 同じ DLL を同じプロセスに 2 回ロードするポイントは何でしょうか? 私が思いつく唯一の実行可能な理由は、EXE が 2 つの DLL を参照し、DLL の 1 つが他の DLL を参照している場合、同じライブラリに対して少なくとも 2 つの LoadLibrar() 呼び出しと 2 つの FreeLibrary() 呼び出しがあるということです。
ここで自分の質問に答えているように見えることはわかっていますが、仮定しているだけです。確かに知りたいです。