一度そうにメモリにロードし、メモリ内の同じ場所にでもプログラムポイントの別のインスタンスから任意の次の呼び出しようにOSがそれを保存していdlopenをしていますか?
単一プロセス内からのdlopen
への複数の呼び出しにより、ライブラリが複数回ロードされないことが保証されています。 man pageから:
If the same shared object is loaded again with dlopen(), the same
object handle is returned. The dynamic linker maintains reference
counts for object handles, so a dynamically loaded shared object is
not deallocated until dlclose() has been called on it as many times
as dlopen() has succeeded on it.
dlopen
への最初の呼び出しが発生した場合、ライブラリは呼び出し元のプロセスにmmap
編です。通常、少なくとも2つの個別のmmap
コールがあります。.text
および.rodata
セクション(通常は1つのROセグメントに存在)は読み取り専用にマッピングされ、.data
および.bss
セクションは読み書き可能にマッピングされます。
次のプロセスからのdlopen
は同じmmap
を実行します。しかし、OSはディスクから読み込み専用のデータを読み込む必要はありません。最初のdlopen
呼び出しで既に読み込まれたページの参照カウントをインクリメントします。それは "共有ライブラリ"での共有です。
したがって、ライブラリを実行するプログラムの3つのインスタンスは、同じ.soの3つのインスタンスがメモリにロードされるか、メモリ内に1つのインスタンスしか存在しないことを意味しますか?
"インスタンス"と呼ばれるものによって異なります。
各プロセスは、このライブラリを記述する独自の(動的に割り当てられた)ランタイムローダ構造を持ち、各セットには共有ライブラリの "インスタンス"が含まれます(プロセスごとに異なるアドレスにロードできます)。各プロセスには、書き込み可能なデータの独自のインスタンス(コピーオンライトセマンティクスを使用する)もあります。しかし、読み取り専用のマッピングはすべて同じ物理メモリを占有します(ただし、各プロセスの異なるアドレスに表示される可能性があります)。
共有ライブラリとは呼ばれません。 –
恐ろしく!私はそれが共有されていることを知っていたので、他のプログラムがそれを呼び出すことができました。私は、OSが一度だけ記憶に入るほどスマートだったという強いはっきりしない疑いがあった。早速のご返事ありがとうございます。 – Questionable
私の意見では、これはOSの実装に依存するかもしれませんが、理論的にはdlopenはlibとそのすべての依存関係をmmapして開きます。そして、再利用の理由から、プロセス間でマッピングされたメモリを共有するために論理的に聞こえる。私はこの種のプロセスが何とかあなたが観察していることを説明できると思います。しかし、あなたのタイミングはファイルシステムのキャッシュやsmthのような他の理由によって引き起こされるかもしれないことにも留意してください。 else。 – dmi